diff --git a/frameworks/core/components_ng/pattern/rich_editor/rich_editor_paint_method.cpp b/frameworks/core/components_ng/pattern/rich_editor/rich_editor_paint_method.cpp index 283f1d0604d7b44e0bf919db191902180953c075..03f88a954643fa82356b18fe5e8943a002695168 100644 --- a/frameworks/core/components_ng/pattern/rich_editor/rich_editor_paint_method.cpp +++ b/frameworks/core/components_ng/pattern/rich_editor/rich_editor_paint_method.cpp @@ -74,6 +74,7 @@ void RichEditorPaintMethod::UpdateContentOverlayModifier(PaintWrapper* paintWrap auto rects = pManager_->GetRichEditorBoxesForSelect(selection.GetTextStart(), selection.GetTextEnd()); selectedRects = CalculateSelectedRect(rects, contentRect.Width()); } + overlayMod->SetShowSelect(richEditorPattern->GetShowSelect()); overlayMod->SetSelectedRects(selectedRects); return; } diff --git a/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.cpp b/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.cpp index fabf387cb27c07bb6efbb8374a63cb2d38006195..dbad7c95bfafed14656c5280038f07cb87a504ee 100644 --- a/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.cpp +++ b/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.cpp @@ -3646,21 +3646,11 @@ std::pair RichEditorPattern::CalcAndRecordLastClickCaretInfo(con { // get the caret position auto positionWithAffinity = paragraphs_.GetGlyphPositionAtCoordinate(textOffset); - auto position = static_cast(positionWithAffinity.position_); - // get the caret offset when click - float caretHeight = 0.0f; - auto lastClickOffset = paragraphs_.ComputeCursorInfoByClick(position, caretHeight, - OffsetF(static_cast(textOffset.GetX()), static_cast(textOffset.GetY()))); - - lastClickOffset += richTextRect_.GetOffset(); - if (isShowPlaceholder_) { - auto caretOffset = CalculateEmptyValueCaretOffset(); - lastClickOffset = caretOffset; - } - SetLastClickOffset(lastClickOffset); caretAffinityPolicy_ = (positionWithAffinity.affinity_ == TextAffinity::UPSTREAM) ? CaretAffinityPolicy::UPSTREAM_FIRST : CaretAffinityPolicy::DOWNSTREAM_FIRST; + auto [lastClickOffset, caretHeight] = CalculateCaretOffsetAndHeight(); + SetLastClickOffset(lastClickOffset); return std::make_pair(lastClickOffset, caretHeight); } diff --git a/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.h b/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.h index c1cb2d5496eb6692cd47ea7ef3d0b3f060a2db27..9ab2f2aa07cce31de057c7fa70dde93582f4ff8a 100644 --- a/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.h +++ b/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.h @@ -1401,7 +1401,7 @@ public: bool IsShortCutBlocked() override { return IsDragging(); } void UpdateScrollBarColor(std::optional color, bool isUpdateProperty = false); - void MarkContentNodeForRender(); + void MarkContentNodeForRender() override; void CreateRichEditorOverlayModifier(); RefPtr GetOverlayModifier() const { return overlayMod_; }; diff --git a/frameworks/core/components_ng/pattern/text/text_pattern.cpp b/frameworks/core/components_ng/pattern/text/text_pattern.cpp index 14780293e39018003663203736cf0fe5ee69545a..267d3c95b983df66fdcab6d0b31846e08617abbe 100644 --- a/frameworks/core/components_ng/pattern/text/text_pattern.cpp +++ b/frameworks/core/components_ng/pattern/text/text_pattern.cpp @@ -414,6 +414,8 @@ void TextPattern::ShowAIEntityMenuForCancel() "end:%{public}d", host->GetId(), previewController_->IsPreviewMenuShow(), start, end); host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); + showSelect_ = true; + MarkContentNodeForRender(); } AISpan TextPattern::GetSelectedAIData() @@ -1950,6 +1952,7 @@ void TextPattern::SetOnClickMenu(const AISpan& aiSpan, const CalculateHandleFunc auto frameNode = pattern->GetHost(); CHECK_NULL_VOID(frameNode); frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER); + pattern->MarkContentNodeForRender(); } }; } @@ -2815,6 +2818,7 @@ void TextPattern::MarkDirtySelf() auto host = GetHost(); CHECK_NULL_VOID(host); host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); + MarkContentNodeForRender(); } void TextPattern::HandleTouchEvent(const TouchEventInfo& info) @@ -6309,6 +6313,7 @@ void TextPattern::OnFrameNodeChanged(FrameNodeChangeInfoFlag flag) HandleSelectionChange(textSelector_.baseOffset, end); isAutoScrollByMouse_ = true; host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); + MarkContentNodeForRender(); } } @@ -6361,6 +6366,7 @@ void TextPattern::MarkDirtyNodeRender() auto host = GetHost(); CHECK_NULL_VOID(host); host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); + MarkContentNodeForRender(); } void TextPattern::MarkDirtyNodeMeasure() @@ -6417,6 +6423,7 @@ void TextPattern::OnTextGestureSelectionUpdate(int32_t start, int32_t end, const CHECK_NULL_VOID(host); HandleSelectionChange(start, end); host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); + MarkContentNodeForRender(); } void TextPattern::OnTextGestureSelectionEnd(const TouchLocationInfo& locationInfo) diff --git a/frameworks/core/components_ng/pattern/text/text_pattern.h b/frameworks/core/components_ng/pattern/text/text_pattern.h index 13e0783c4e4506e5e5629a3957d4be810d847ba9..2baa301e05daaf9ffa0ef3671dd7e7d9e0ee8021 100644 --- a/frameworks/core/components_ng/pattern/text/text_pattern.h +++ b/frameworks/core/components_ng/pattern/text/text_pattern.h @@ -922,6 +922,7 @@ public: } void UpdateStyledStringByColorMode(); + virtual void MarkContentNodeForRender() {}; protected: int32_t GetClickedSpanPosition() diff --git a/test/unittest/core/pattern/rich_editor/rich_editor_selection_test_ng.cpp b/test/unittest/core/pattern/rich_editor/rich_editor_selection_test_ng.cpp index 4bc7a7562ade5a22acf125b2c023738d778a52d4..50c7660b3844957ce1b158e7f0b8471454347689 100644 --- a/test/unittest/core/pattern/rich_editor/rich_editor_selection_test_ng.cpp +++ b/test/unittest/core/pattern/rich_editor/rich_editor_selection_test_ng.cpp @@ -2256,4 +2256,21 @@ HWTEST_F(RichEditorSelectionTestNg, DeleteByRange001, TestSize.Level1) richEditorPattern->DeleteByRange(nullptr, 1, 2); EXPECT_TRUE(value == richEditorPattern->lastSelectionRange_); } + +/** + * @tc.name: MarkContentNodeForRender001 + * @tc.desc: test MarkContentNodeForRender func + * @tc.type: FUNC + */ +HWTEST_F(RichEditorSelectionTestNg, MarkContentNodeForRender001, TestSize.Level1) +{ + ASSERT_NE(richEditorNode_, nullptr); + auto richEditorPattern = richEditorNode_->GetPattern(); + ASSERT_NE(richEditorPattern, nullptr); + richEditorPattern->MarkContentNodeForRender(); + auto paintProp = richEditorNode_->GetPaintProperty(); + ASSERT_TRUE(paintProp); + auto changeFlag = paintProp->GetPropertyChangeFlag() | NG::PROPERTY_UPDATE_RENDER; + EXPECT_EQ(paintProp->GetPropertyChangeFlag(), changeFlag); +} } // namespace OHOS::Ace::NG \ No newline at end of file