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 ef90a5974868e31a79e689440db6f7a7cfe7c012..25433e636d9e0fc67aed2df1ee1353da5367a924 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 @@ -4961,13 +4961,11 @@ bool RichEditorPattern::CursorMoveUp() { CHECK_NULL_RETURN(!SelectOverlayIsOn(), false); ResetSelection(); - float nextCaretHeight = 0.0f; + float caretHeight = 0.0f; OffsetF caretOffsetUp; OffsetF caretOffsetDown; - OffsetF nextCaretOffset; if (static_cast(GetTextContentLength()) > 1) { int32_t caretPosition = CalcMoveUpPos(caretOffsetUp, caretOffsetDown); - nextCaretOffset = CalcCursorOffsetByPosition(caretPosition_ + 1, nextCaretHeight, false, false); CHECK_NULL_RETURN(overlayMod_, false); auto overlayMod = DynamicCast(overlayMod_); auto currentCaretOffsetOverlay = overlayMod->GetCaretOffset(); @@ -4980,17 +4978,9 @@ bool RichEditorPattern::CursorMoveUp() bool isCaretPosInLineEnd = NearEqual(currentCaretOffsetOverlay.GetX(), caretOffsetUp.GetX(), caretOffsetWidth); SetCaretPosition(caretPosition); MoveCaretToContentRect(); - // cursor at line end - if (isCaretPosInLineEnd && currentCaretOffsetOverlay.GetX() != caretOffsetDown.GetX()) { - CursorMoveLineEndPos(caretOffsetUp, caretOffsetDown, nextCaretOffset); - } - // cursor at line middle - if (isCaretPosInLineEnd && currentCaretOffsetOverlay.GetX() == caretOffsetDown.GetX()) { - OffsetF currenentCaretOffsetUp; - OffsetF currentCaretOffsetDown; - // at the middle of the previous line or start of the current line - CalcMoveUpPos(currenentCaretOffsetUp, currentCaretOffsetDown); - SetLastClickOffset(currenentCaretOffsetUp); + if (isCaretPosInLineEnd) { + OffsetF caretOffset = CalcCursorOffsetByPosition(caretPosition_, caretHeight, false, false); + SetLastClickOffset(caretOffset); } } StartTwinkling(); @@ -5006,22 +4996,31 @@ bool RichEditorPattern::CursorMoveDown() ResetSelection(); if (static_cast(GetTextContentLength()) > 1) { float caretHeightUp = 0.0f; - float caretHeightDown = 0.0f; - float nextCaretHeight = 0.0f; + float caretLineHeight = 0.0f; + float caretHeight = 0.0f; + float textOffsetDownY = 0.0f; Offset textOffset; int32_t caretPositionStart; int32_t caretPositionEnd; caretPositionStart = caretPosition_; - OffsetF caretOffsetUp = CalcCursorOffsetByPosition(caretPosition_, caretHeightUp); - OffsetF caretOffsetDown = CalcCursorOffsetByPosition(caretPosition_, caretHeightDown, true, false); - OffsetF nextCaretOffset = CalcCursorOffsetByPosition(caretPosition_ + 1, nextCaretHeight, false, false); + OffsetF caretOffsetUp = CalcCursorOffsetByPosition(caretPosition_, caretHeightUp, false, false); + OffsetF caretOffsetLine = CalcCursorOffsetByPosition(caretPosition_, caretLineHeight); auto minDet = paragraphs_.minParagraphFontSize.value_or(GetTextThemeFontSize()); CHECK_NULL_RETURN(overlayMod_, false); auto overlayMod = DynamicCast(overlayMod_); auto caretOffsetOverlay = overlayMod->GetCaretOffset(); + auto caretOffsetWidth = overlayMod->GetCaretWidth(); float textOffsetX = GetTextRect().GetX(); - float textOffsetY = GetTextRect().GetY() - caretHeightUp - minDet / 2.0; - float textOffsetDownY = caretOffsetOverlay.GetY() - textOffsetY; + float textOffsetY = GetTextRect().GetY() - minDet / 2.0; + bool isCaretPosInLineEnd = NearEqual(caretOffsetOverlay.GetX(), caretOffsetUp.GetX(), caretOffsetWidth); + auto lineHeightDis = CalcLineHeightByPosition(caretPosition_); + // at line middle position or line end position or first line start position + if (isCaretPosInLineEnd || caretPositionStart == 0) { + textOffsetDownY = caretOffsetLine.GetY() + lineHeightDis - textOffsetY; + } else { + // at line start position, caretOffsetLine equ caretOffsetUp, so previous line height add currentLineHeight + textOffsetDownY = caretOffsetLine.GetY() + caretLineHeight + lineHeightDis - textOffsetY; + } textOffset = Offset(caretOffsetOverlay.GetX() - textOffsetX, textOffsetDownY); caretPositionEnd = paragraphs_.GetIndex(textOffset); caretPositionEnd = std::clamp(caretPositionEnd, 0, static_cast(GetTextContentLength())); @@ -5029,7 +5028,11 @@ bool RichEditorPattern::CursorMoveDown() caretPositionEnd = GetTextContentLength(); } SetCaretPosition(caretPositionEnd); - CursorMoveLineEndPos(caretOffsetUp, caretOffsetDown, nextCaretOffset); + // at line middle or line end, direct to call SetLastClickOffset + if (isCaretPosInLineEnd && caretPositionStart != 0) { + OffsetF caretOffset = CalcCursorOffsetByPosition(caretPosition_, caretHeight, false, false); + SetLastClickOffset(caretOffset); + } MoveCaretToContentRect(); } StartTwinkling(); @@ -8906,26 +8909,6 @@ int32_t RichEditorPattern::CalcLineEndPosition() return position; } -bool RichEditorPattern::CursorMoveLineEndPos(OffsetF& caretOffsetUp, OffsetF& caretOffsetDown, OffsetF& nextCaretOffset) -{ - float caretHeightEnd = 0.0f; - CHECK_NULL_RETURN(overlayMod_, false); - auto overlayMod = DynamicCast(overlayMod_); - auto caretOffsetOverlay = overlayMod->GetCaretOffset(); - auto caretOffsetWidth = overlayMod->GetCaretWidth(); - auto caretOffsetUpDisY = caretOffsetOverlay.GetY() - caretOffsetUp.GetY(); - auto caretOffsetUpDisX = caretOffsetOverlay.GetX() - GetTextRect().GetX(); - auto caretOffsetDownDisX = caretOffsetDown.GetX() - GetTextRect().GetX(); - if ((caretOffsetUpDisY == 0 && caretOffsetDownDisX == 0 && caretOffsetUpDisX != 0) || - caretOffsetUpDisX == caretOffsetWidth || caretOffsetOverlay.GetX() > nextCaretOffset.GetX()) { - // line end - OffsetF caretOffsetEnd = CalcCursorOffsetByPosition(caretPosition_, caretHeightEnd, false, false); - overlayMod->SetCaretOffsetAndHeight(caretOffsetEnd, caretHeightEnd); - SetLastClickOffset(caretOffsetEnd); - } - return true; -} - bool RichEditorPattern::CursorMoveLineBegin() { CloseSelectOverlay(); @@ -9045,22 +9028,32 @@ int32_t RichEditorPattern::HandleSelectWrapper(CaretMoveIntent direction) int32_t RichEditorPattern::HandleSelectPosition(bool isForward) { float caretHeight = 0.0f; + float newCaretHeight = 0.0f; float careOffsetY = 0.0f; int32_t newPos; OffsetF caretOffset = CalcCursorOffsetByPosition(caretPosition_, caretHeight); auto minDet = paragraphs_.minParagraphFontSize.value_or(GetTextThemeFontSize()) / 2.0; if (isForward) { - if (!textSelector_.SelectNothing() && textSelector_.GetTextEnd() == caretPosition_) { + float selectStartHeight = 0.0f; + OffsetF selectStartOffset = CalcCursorOffsetByPosition(textSelector_.GetTextStart(), selectStartHeight); + careOffsetY = caretOffset.GetY() - GetTextRect().GetY() - minDet; + newPos = paragraphs_.GetIndex(Offset(caretOffset.GetX() - GetTextRect().GetX(), careOffsetY), true); + OffsetF newCaretOffset = CalcCursorOffsetByPosition(newPos, newCaretHeight); + if (!textSelector_.SelectNothing() && textSelector_.GetTextEnd() == caretPosition_ && + selectStartOffset.GetY() == newCaretOffset.GetY()) { return textSelector_.GetTextStart(); } - careOffsetY = caretOffset.GetY() - GetTextRect().GetY() - minDet; } else { - if (!textSelector_.SelectNothing() && textSelector_.GetTextStart() == caretPosition_) { + float selectEndHeight = 0.0f; + OffsetF selectEndOffset = CalcCursorOffsetByPosition(textSelector_.GetEnd(), selectEndHeight); + careOffsetY = caretOffset.GetY() - GetTextRect().GetY() + caretHeight + minDet / 2.0; + newPos = paragraphs_.GetIndex(Offset(caretOffset.GetX() - GetTextRect().GetX(), careOffsetY), true); + OffsetF newCaretOffset = CalcCursorOffsetByPosition(newPos, newCaretHeight); + if (!textSelector_.SelectNothing() && textSelector_.GetTextStart() == caretPosition_ && + selectEndOffset.GetY() == newCaretOffset.GetY()) { return textSelector_.GetTextEnd(); } - careOffsetY = caretOffset.GetY() - GetTextRect().GetY() + caretHeight + minDet / 2.0; } - newPos = paragraphs_.GetIndex(Offset(caretOffset.GetX() - GetTextRect().GetX(), careOffsetY), true); return newPos; } 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 ec9455eb4d117731c3dc6730f511207294ac651f..a814e942e698d861f55710694874abf0f6cee93c 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 @@ -375,7 +375,6 @@ public: int32_t CalcLineBeginPosition(); float GetTextThemeFontSize(); int32_t CalcLineEndPosition(); - bool CursorMoveLineEndPos(OffsetF& caretOffsetUp, OffsetF& caretOffsetDown, OffsetF& nextCaretOffset); bool CursorMoveLineBegin(); bool CursorMoveLineEnd(); void HandleSelectFontStyle(KeyCode code) override; diff --git a/test/unittest/core/pattern/rich_editor/rich_editor_edit_test_ng.cpp b/test/unittest/core/pattern/rich_editor/rich_editor_edit_test_ng.cpp index 8cf42b8529ef8b20f023675d5b36151726c40d2f..728fe6d68df8340558d8539f15ac10e92fe8a62d 100644 --- a/test/unittest/core/pattern/rich_editor/rich_editor_edit_test_ng.cpp +++ b/test/unittest/core/pattern/rich_editor/rich_editor_edit_test_ng.cpp @@ -411,48 +411,6 @@ HWTEST_F(RichEditorEditTestNg, TestRichEditorCursorMoveLineBegin001, TestSize.Le EXPECT_EQ(ret, true); } -/** - * @tc.name: TestRichEditorCursorMoveLineEndPos001 - * @tc.desc: test CursorMoveLineEndPos - * @tc.type: FUNC - */ -HWTEST_F(RichEditorEditTestNg, TestRichEditorCursorMoveLineEndPos001, TestSize.Level1) -{ - /** - * @tc.steps: step1. declare and init variables. - */ - ASSERT_NE(richEditorNode_, nullptr); - auto richEditorPattern = richEditorNode_->GetPattern(); - ASSERT_NE(richEditorPattern, nullptr); - richEditorPattern->CreateNodePaintMethod(); - EXPECT_NE(richEditorPattern->contentMod_, nullptr); - EXPECT_NE(richEditorPattern->overlayMod_, nullptr); - /** - * @tc.steps: step2. change parameter and call function. - */ - auto overlayMod = AceType::DynamicCast(richEditorPattern->overlayMod_); - overlayMod->GetCaretOffset().SetY(5.0f); - overlayMod->GetCaretOffset().SetX(0.0f); - richEditorPattern->richTextRect_.x_ = 5.0f; - OffsetF caretOffsetUp(-5.0f, 5.0f); - OffsetF caretOffsetDown(5.0f, 10.0f); - OffsetF nextCaretOffset(5.0f, 15.0f); - auto ret = richEditorPattern->CursorMoveLineEndPos(caretOffsetUp, caretOffsetDown, nextCaretOffset); - EXPECT_EQ(ret, true); - /** - * @tc.steps: step3. change parameter and call function. - */ - overlayMod->SetCaretWidth(-5.0f); - ret = richEditorPattern->CursorMoveLineEndPos(caretOffsetUp, caretOffsetDown, nextCaretOffset); - EXPECT_EQ(ret, true); - /** - * @tc.steps: step4. change parameter and call function. - */ - nextCaretOffset.x_ = -10.0f; - ret = richEditorPattern->CursorMoveLineEndPos(caretOffsetUp, caretOffsetDown, nextCaretOffset); - EXPECT_EQ(ret, true); -} - /** * @tc.name: TestRichEditorCalcLineEndPosition001 * @tc.desc: test CalcLineEndPosition