From 75f54ca8bda8806ff0cf592066c1f9ccde748b7d Mon Sep 17 00:00:00 2001 From: jyj-0306 Date: Tue, 24 Oct 2023 17:42:46 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=8B=96=E6=8B=BD=E7=B3=BB?= =?UTF-8?q?=E5=88=97=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jyj-0306 Change-Id: Id0b64098ee47698d778ed181d5bed1d1abbddb14 --- .gitee/CODEOWNERS | 12 +-- .../core/components_ng/event/drag_event.cpp | 89 ++++++------------- .../core/components_ng/event/drag_event.h | 8 +- .../components_ng/event/gesture_event_hub.cpp | 2 - .../components_ng/pattern/text/text_pattern.h | 4 +- .../pattern/text_drag/text_drag_base.h | 6 +- .../text_field_overlay_modifier.cpp | 11 +++ .../text_field/text_field_overlay_modifier.h | 3 + .../text_field/text_field_paint_method.cpp | 1 + .../pattern/text_field/text_field_pattern.cpp | 18 +++- .../pattern/text_field/text_field_pattern.h | 11 ++- 11 files changed, 79 insertions(+), 86 deletions(-) diff --git a/.gitee/CODEOWNERS b/.gitee/CODEOWNERS index 37ec4adbf63..25b0a002c59 100644 --- a/.gitee/CODEOWNERS +++ b/.gitee/CODEOWNERS @@ -94,7 +94,7 @@ frameworks/core/components_ng/pattern/refresh/ @aryawang frameworks/core/components_ng/pattern/relative_container/ @nickyjd frameworks/core/components_ng/pattern/remote_window/ @liuchao92 frameworks/core/components_ng/pattern/rendering_context/ @keerecles -frameworks/core/components_ng/pattern/rich_editor/ @jyj-0306 +frameworks/core/components_ng/pattern/rich_editor/ @jyj_0306 frameworks/core/components_ng/pattern/root/ @zhoutianer frameworks/core/components_ng/pattern/scroll/ @rongShao-Z frameworks/core/components_ng/pattern/scroll_bar/ @rongShao-Z @@ -115,7 +115,7 @@ frameworks/core/components_ng/pattern/tabs/ @xuzhidan frameworks/core/components_ng/pattern/text/ @lijuan124 frameworks/core/components_ng/pattern/text_clock/ @aryawang frameworks/core/components_ng/pattern/text_drag/ @zhaojian2021 -frameworks/core/components_ng/pattern/text_field/ @jyj-0306 @lijuan124 +frameworks/core/components_ng/pattern/text_field/ @jyj_0306 @lijuan124 frameworks/core/components_ng/pattern/text_picker/ @cheng-feiwang frameworks/core/components_ng/pattern/texttimer/ @aryawang frameworks/core/components_ng/pattern/time_picker/ @cheng-feiwang @@ -160,7 +160,7 @@ frameworks/core/components/flex/ @yangfan229 frameworks/core/components/focus_animation/ @catpoison frameworks/core/components/focus_collaboration/ @catpoison frameworks/core/components/focusable/ @catpoison -frameworks/core/components/font/ @jyj-0306 +frameworks/core/components/font/ @jyj_0306 frameworks/core/components/foreach/ @yan-shuifeng frameworks/core/components/form/ @wangchensu1 frameworks/core/components/gesture_listener/ @zheng-qiyi @@ -220,7 +220,7 @@ frameworks/core/components/swiper/ @xuzhidan frameworks/core/components/tab_bar/ @xuzhidan frameworks/core/components/text/ @lijuan124 frameworks/core/components/text_clock/ @aryawang -frameworks/core/components/text_field/ @jyj-0306 @lijuan124 +frameworks/core/components/text_field/ @jyj_0306 @lijuan124 frameworks/core/components/text_overlay/ @yangfan229 frameworks/core/components/text_span/ @lijuan124 frameworks/core/components/texttimer/ @aryawang @@ -371,7 +371,7 @@ frameworks/core/components_ng/test/pattern/refresh/ @suiwuyue frameworks/core/components_ng/test/pattern/relative_container/ @nickyjd frameworks/core/components_ng/test/pattern/remote_window/ @liuchao92 frameworks/core/components_ng/test/pattern/rendering_context/ @keerecles -frameworks/core/components_ng/test/pattern/rich_editor/ @jyj-0306 +frameworks/core/components_ng/test/pattern/rich_editor/ @jyj_0306 frameworks/core/components_ng/test/pattern/root/ @yan-shuifeng frameworks/core/components_ng/test/pattern/scroll/ @suiwuyue frameworks/core/components_ng/test/pattern/scroll_bar/ @suiwuyue @@ -392,7 +392,7 @@ frameworks/core/components_ng/test/pattern/tabs/ @xuzhidan frameworks/core/components_ng/test/pattern/text/ @lijuan124 frameworks/core/components_ng/test/pattern/text_clock/ @aryawang frameworks/core/components_ng/test/pattern/text_drag/ @zhaojian2021 -frameworks/core/components_ng/test/pattern/text_field/ @jyj-0306 @lijuan124 +frameworks/core/components_ng/test/pattern/text_field/ @jyj_0306 @lijuan124 frameworks/core/components_ng/test/pattern/text_picker/ @cheng-feiwang frameworks/core/components_ng/test/pattern/texttimer/ @aryawang frameworks/core/components_ng/test/pattern/time_picker/ @cheng-feiwang diff --git a/frameworks/core/components_ng/event/drag_event.cpp b/frameworks/core/components_ng/event/drag_event.cpp index a287cc1e8e9..73320ef6e8b 100644 --- a/frameworks/core/components_ng/event/drag_event.cpp +++ b/frameworks/core/components_ng/event/drag_event.cpp @@ -146,21 +146,24 @@ void DragEventActuator::OnCollectTouchTarget(const OffsetF& coordinateOffset, co if (gestureHub->GetTextDraggable()) { auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - frameNode->SetDraggable(isTextReceivedLongPress_); if (gestureHub->GetIsTextDraggable()) { - HideTextAnimation(true, info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY()); + SetTextPixelMap(gestureHub); } } else if (!isNotInPreviewState_) { - HideEventColumn(); - HidePixelMap(true, info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY()); - HideFilter(); - SubwindowManager::GetInstance()->HideMenuNG(false, true); - AnimationOption option; - option.SetDuration(PIXELMAP_ANIMATION_DURATION); - option.SetCurve(Curves::SHARP); - AnimationUtils::Animate( - option, [renderContext]() { renderContext->UpdateOpacity(SCALE_NUMBER); }, - option.GetOnFinishEvent()); + if (gestureHub->GetIsTextDraggable()) { + HideTextAnimation(true, info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY()); + } else { + HideEventColumn(); + HidePixelMap(true, info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY()); + HideFilter(); + SubwindowManager::GetInstance()->HideMenuNG(false, true); + AnimationOption option; + option.SetDuration(PIXELMAP_ANIMATION_DURATION); + option.SetCurve(Curves::SHARP); + AnimationUtils::Animate( + option, [renderContext]() { renderContext->UpdateOpacity(SCALE_NUMBER); }, + option.GetOnFinishEvent()); + } } } @@ -698,57 +701,22 @@ void DragEventActuator::SetThumbnailCallback(std::function&& callb longPressRecognizer_->SetThumbnailCallback(std::move(callback)); } -void DragEventActuator::GetTextPixelMap(bool startDrag) +void DragEventActuator::SetTextPixelMap(const RefPtr& gestureHub) { - if (SystemProperties::GetDebugEnabled()) { - LOGI("DragEvent start getTextPixelMap."); - } - auto gestureHub = gestureEventHub_.Upgrade(); - CHECK_NULL_VOID(gestureHub); - bool isAllowedDrag = IsAllowedDrag(); - if (!gestureHub->GetTextDraggable() || !isAllowedDrag) { - if (SystemProperties::GetDebugEnabled()) { - LOGW("Text is not draggable, stop get text pixelMap."); - } - return; - } auto frameNode = gestureHub->GetFrameNode(); CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - auto pixelMap = gestureHub->GetPixelMap(); - CHECK_NULL_VOID(pixelMap); - auto pipeline = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipeline); - auto manager = pipeline->GetOverlayManager(); - CHECK_NULL_VOID(manager); - manager->RemovePixelMap(); - auto dragDropManager = pipeline->GetDragDropManager(); - CHECK_NULL_VOID(dragDropManager); - if (!dragDropManager->IsDragged()) { - if (SystemProperties::GetDebugEnabled()) { - LOGW("DragDropManger is not dragged, stop get text pixelMap."); - } - return; - } - std::shared_ptr mediaPixelMap = pixelMap->GetPixelMapSharedPtr(); - float scale = gestureHub->GetPixelMapScale(mediaPixelMap->GetHeight(), mediaPixelMap->GetWidth()); - mediaPixelMap->scale(scale, scale); - int32_t width = mediaPixelMap->GetWidth(); - int32_t height = mediaPixelMap->GetHeight(); - Msdp::DeviceStatus::ShadowInfo shadowInfo { mediaPixelMap, width * PIXELMAP_WIDTH_RATE, - height * PIXELMAP_HEIGHT_RATE }; - int ret = Msdp::DeviceStatus::InteractionManager::GetInstance()->UpdateShadowPic(shadowInfo); - if (ret != 0) { - LOGE("InteractionManager: UpdateShadowPic error"); - return; - } - if (SystemProperties::GetDebugEnabled()) { - LOGI("In function getTextPixelMap, set DragWindowVisible true."); + + auto dragNode = pattern->MoveDragNode(); + pattern->CloseSelectOverlay(); + CHECK_NULL_VOID(dragNode); + auto pixelMap = dragNode->GetRenderContext()->GetThumbnailPixelMap(); + if (pixelMap) { + gestureHub->SetPixelMap(pixelMap); + } else { + gestureHub->SetPixelMap(nullptr); } - Msdp::DeviceStatus::InteractionManager::GetInstance()->SetDragWindowVisible(true); - dragDropManager->SetIsDragWindowShow(true); - gestureHub->SetPixelMap(nullptr); } void DragEventActuator::SetTextAnimation(const RefPtr& gestureHub, const Offset& globalLocation) @@ -774,13 +742,9 @@ void DragEventActuator::SetTextAnimation(const RefPtr& gestureH } return; } - pattern->CloseSelectOverlay(); - pattern->CloseKeyboard(true); + pattern->CloseHandleAndSelect(); auto dragNode = pattern->MoveDragNode(); CHECK_NULL_VOID(dragNode); - auto pixelMap = dragNode->GetRenderContext()->GetThumbnailPixelMap(); - CHECK_NULL_VOID(pixelMap); - gestureHub->SetPixelMap(pixelMap); // create columnNode auto columnNode = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr(true)); @@ -789,7 +753,6 @@ void DragEventActuator::SetTextAnimation(const RefPtr& gestureH manager->MountPixelMapToRootNode(columnNode); auto modifier = dragNode->GetPattern()->GetOverlayModifier(); modifier->StartAnimate(); - isTextReceivedLongPress_ = true; if (SystemProperties::GetDebugEnabled()) { LOGI("DragEvent set text animation success."); } diff --git a/frameworks/core/components_ng/event/drag_event.h b/frameworks/core/components_ng/event/drag_event.h index 7340a9b4154..a16a8ede494 100644 --- a/frameworks/core/components_ng/event/drag_event.h +++ b/frameworks/core/components_ng/event/drag_event.h @@ -131,7 +131,7 @@ public: void HideTextAnimation(bool startDrag = false, double globalX = 0, double globalY = 0); bool GetIsBindOverlayValue(const RefPtr& actuator); bool IsAllowedDrag(); - void GetTextPixelMap(bool startDrag); + void SetTextPixelMap(const RefPtr& gestureHub); OffsetF GetFloatImageOffset(const RefPtr& frameNode); #endif // ENABLE_DRAG_FRAMEWORK PanDirection GetDirection() const @@ -158,11 +158,6 @@ public: return isNotInPreviewState_; } - void ResetTextReceivedLongPress() - { - isTextReceivedLongPress_ = false; - } - private: WeakPtr gestureEventHub_; RefPtr userCallback_; @@ -179,7 +174,6 @@ private: GestureEvent longPressInfo_; bool isReceivedLongPress_ = false; bool isNotInPreviewState_ = false; - bool isTextReceivedLongPress_ = false; PanDirection direction_; int32_t fingers_ = 1; diff --git a/frameworks/core/components_ng/event/gesture_event_hub.cpp b/frameworks/core/components_ng/event/gesture_event_hub.cpp index df41343ccd4..a414240c86f 100644 --- a/frameworks/core/components_ng/event/gesture_event_hub.cpp +++ b/frameworks/core/components_ng/event/gesture_event_hub.cpp @@ -891,8 +891,6 @@ void GestureEventHub::HandleOnDragEnd(const GestureEvent& info) eventHub->HandleInternalOnDrop(event, ""); } } - - dragEventActuator_->ResetTextReceivedLongPress(); CHECK_NULL_VOID(dragDropProxy_); dragDropProxy_->DestroyDragWindow(); dragDropProxy_ = nullptr; diff --git a/frameworks/core/components_ng/pattern/text/text_pattern.h b/frameworks/core/components_ng/pattern/text/text_pattern.h index df231d93490..f0d0c8abb1d 100644 --- a/frameworks/core/components_ng/pattern/text/text_pattern.h +++ b/frameworks/core/components_ng/pattern/text/text_pattern.h @@ -177,9 +177,9 @@ public: OffsetF GetTextPaintOffset() const; - RefPtr MoveDragNode() override + const RefPtr& MoveDragNode() override { - return std::move(dragNode_); + return dragNode_; } ParagraphT GetDragParagraph() const override diff --git a/frameworks/core/components_ng/pattern/text_drag/text_drag_base.h b/frameworks/core/components_ng/pattern/text_drag/text_drag_base.h index ae06c7acd5b..9298847aa3b 100644 --- a/frameworks/core/components_ng/pattern/text_drag/text_drag_base.h +++ b/frameworks/core/components_ng/pattern/text_drag/text_drag_base.h @@ -44,11 +44,15 @@ public: virtual std::vector GetTextBoxes() = 0; virtual OffsetF GetParentGlobalOffset() const = 0; - virtual RefPtr MoveDragNode() = 0; + virtual const RefPtr& MoveDragNode() = 0; virtual ParagraphT GetDragParagraph() const = 0; virtual void CloseSelectOverlay() = 0; + virtual void CloseHandleAndSelect() + { + CloseSelectOverlay(); + } virtual void CreateHandles() {}; virtual bool CloseKeyboard(bool forceClose) = 0; virtual OffsetF GetDragUpperLeftCoordinates() = 0; diff --git a/frameworks/core/components_ng/pattern/text_field/text_field_overlay_modifier.cpp b/frameworks/core/components_ng/pattern/text_field/text_field_overlay_modifier.cpp index 098caf562ec..2f9c1073f60 100644 --- a/frameworks/core/components_ng/pattern/text_field/text_field_overlay_modifier.cpp +++ b/frameworks/core/components_ng/pattern/text_field/text_field_overlay_modifier.cpp @@ -31,6 +31,7 @@ TextFieldOverlayModifier::TextFieldOverlayModifier( cursorWidth_ = AceType::MakeRefPtr(static_cast(CURSOR_WIDTH.ConvertToPx())); selectedColor_ = AceType::MakeRefPtr(LinearColor(Color())); cursorVisible_ = AceType::MakeRefPtr(false); + showSelect_ = AceType::MakeRefPtr(false); contentSize_ = AceType::MakeRefPtr(SizeF()); contentOffset_ = AceType::MakeRefPtr(OffsetF()); auto textFieldPattern = DynamicCast(pattern_.Upgrade()); @@ -48,6 +49,7 @@ TextFieldOverlayModifier::TextFieldOverlayModifier( AttachProperty(cursorWidth_); AttachProperty(selectedColor_); AttachProperty(cursorVisible_); + AttachProperty(showSelect_); AttachProperty(contentSize_); AttachProperty(contentOffset_); AttachProperty(cursorOffset_); @@ -109,6 +111,9 @@ void TextFieldOverlayModifier::PaintUnderline(RSCanvas& canvas) const void TextFieldOverlayModifier::PaintSelection(DrawingContext& context) const { + if (!showSelect_->Get() && !needPaintSelect_) { + return; + } auto& canvas = context.canvas; canvas.Save(); auto textFieldPattern = DynamicCast(pattern_.Upgrade()); @@ -269,5 +274,11 @@ void TextFieldOverlayModifier::SetChangeSelectedRects(bool value) if (value) { changeSelectedRects_->Set(!changeSelectedRects_->Get()); } + needPaintSelect_ = value; +} + +void TextFieldOverlayModifier::SetShowSelect(bool value) +{ + showSelect_->Set(value); } } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/text_field/text_field_overlay_modifier.h b/frameworks/core/components_ng/pattern/text_field/text_field_overlay_modifier.h index 5b8a0b2d7b3..1a178a343d6 100644 --- a/frameworks/core/components_ng/pattern/text_field/text_field_overlay_modifier.h +++ b/frameworks/core/components_ng/pattern/text_field/text_field_overlay_modifier.h @@ -57,6 +57,7 @@ public: void SetChangeSelectedRects(bool value); void SetFirstHandleOffset(const OffsetF& offset); void SetSecondHandleOffset(const OffsetF& offset); + void SetShowSelect(bool value); private: void PaintSelection(DrawingContext& context) const; @@ -64,6 +65,7 @@ private: void PaintEdgeEffect(const SizeF& frameSize, RSCanvas& canvas); void PaintScrollBar(DrawingContext& context); + bool needPaintSelect_ = false; WeakPtr pattern_; WeakPtr scrollBar_; WeakPtr edgeEffect_; @@ -72,6 +74,7 @@ private: RefPtr selectedColor_; RefPtr cursorOffset_; RefPtr cursorVisible_; + RefPtr showSelect_; RefPtr contentSize_; RefPtr contentOffset_; RefPtr firstHandleOffset_; diff --git a/frameworks/core/components_ng/pattern/text_field/text_field_paint_method.cpp b/frameworks/core/components_ng/pattern/text_field/text_field_paint_method.cpp index 471dbe4977b..9401263a3b3 100644 --- a/frameworks/core/components_ng/pattern/text_field/text_field_paint_method.cpp +++ b/frameworks/core/components_ng/pattern/text_field/text_field_paint_method.cpp @@ -164,6 +164,7 @@ void TextFieldPaintMethod::UpdateOverlayModifier(PaintWrapper* paintWrapper) } textFieldOverlayModifier_->SetUnderlineWidth(textFieldPattern->GetUnderlineWidth()); textFieldOverlayModifier_->SetUnderlineColor(textFieldPattern->GetUnderlineColor()); + textFieldOverlayModifier_->SetShowSelect(textFieldPattern->GetShowSelect()); auto frameNode = textFieldPattern->GetHost(); CHECK_NULL_VOID(frameNode); auto layoutProperty = frameNode->GetLayoutProperty(); diff --git a/frameworks/core/components_ng/pattern/text_field/text_field_pattern.cpp b/frameworks/core/components_ng/pattern/text_field/text_field_pattern.cpp index 8f7662132ed..74399d16ff8 100644 --- a/frameworks/core/components_ng/pattern/text_field/text_field_pattern.cpp +++ b/frameworks/core/components_ng/pattern/text_field/text_field_pattern.cpp @@ -1142,6 +1142,10 @@ std::function&, const std::strin CHECK_NULL_RETURN(host, itemInfo); auto layoutProperty = host->GetLayoutProperty(); CHECK_NULL_RETURN(layoutProperty, itemInfo); + if (pattern->SelectOverlayIsOn() || pattern->imeAttached_ || pattern->showSelect_) { + pattern->CloseHandleAndSelect(); + pattern->CloseKeyboard(true); + } pattern->dragStatus_ = DragStatus::DRAGGING; pattern->textFieldContentModifier_->ChangeDragStatus(); auto contentController = pattern->contentController_; @@ -1166,7 +1170,7 @@ std::function&, const std::strin std::function&, const std::string&)> TextFieldPattern::OnDragDrop() { - auto onDrop = [weakPtr = WeakClaim(this)]( + return [weakPtr = WeakClaim(this)]( const RefPtr& event, const std::string& extraParams) { auto pattern = weakPtr.Upgrade(); CHECK_NULL_VOID(pattern); @@ -1190,7 +1194,9 @@ std::function&, const std::string&)> Tex for (const auto& record : records) { str += record; } - pattern->needToRequestKeyboardInner_ = true; + if (pattern->dragStatus_ == DragStatus::NONE) { + pattern->needToRequestKeyboardInner_ = true; + } pattern->dragRecipientStatus_ = DragStatus::NONE; if (str.empty()) { return; @@ -1214,7 +1220,6 @@ std::function&, const std::string&)> Tex host->MarkDirtyNode(pattern->IsTextArea() ? PROPERTY_UPDATE_MEASURE : PROPERTY_UPDATE_MEASURE_SELF); } }; - return onDrop; } void TextFieldPattern::InitDragDropEvent() @@ -1872,6 +1877,7 @@ void TextFieldPattern::ShowSelectOverlay(const ShowSelectOverlayParams& showOver if (isTransparent_) { return; } + showSelect_ = true; auto hasDataCallback = [weak = WeakClaim(this), params = showOverlayParams](bool hasData) { LOGI("HasData callback from clipboard, data available ? %{public}d", hasData); auto pattern = weak.Upgrade(); @@ -4841,4 +4847,10 @@ int32_t TextFieldPattern::GetLineCount() const } return 0; } + +void TextFieldPattern::CloseHandleAndSelect() +{ + CloseSelectOverlay(true); + showSelect_ = false; +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/text_field/text_field_pattern.h b/frameworks/core/components_ng/pattern/text_field/text_field_pattern.h index 3db957cbfb3..04ba59b0c4f 100644 --- a/frameworks/core/components_ng/pattern/text_field/text_field_pattern.h +++ b/frameworks/core/components_ng/pattern/text_field/text_field_pattern.h @@ -672,9 +672,9 @@ public: return { dragParagraph_ }; } - RefPtr MoveDragNode() override + const RefPtr& MoveDragNode() override { - return std::move(dragNode_); + return dragNode_; } const std::vector& GetDragContents() const @@ -972,6 +972,11 @@ public: return responseArea_; } + bool GetShowSelect() const + { + return showSelect_; + } + private: void GetTextSelectRectsInRangeAndWillChange(); bool HasFocus() const; @@ -1084,6 +1089,7 @@ private: void UpdateErrorTextMargin(); OffsetF GetTextPaintOffset() const; void UpdateSelectController(); + void CloseHandleAndSelect() override; #if defined(ENABLE_STANDARD_INPUT) std::optional GetMiscTextConfig() const; #endif @@ -1226,6 +1232,7 @@ private: bool leftMouseCanMove_ = false; bool isSingleHandle_ = true; + bool showSelect_ = false; RefPtr contentController_; RefPtr selectController_; CaretStatus caretStatus_ = CaretStatus::NONE; -- Gitee