From 5faaa25b183f63fd1c8b738cd3f9b9efe85bc8aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Fri, 17 May 2024 12:41:17 -0300 Subject: [PATCH] Fix selection rectangle and letter wrap. --- include/eepp/ui/linewrapping.hpp | 5 +++-- include/eepp/ui/uicodeeditor.hpp | 3 ++- src/eepp/ui/linewrapping.cpp | 12 +++++++----- src/eepp/ui/uicodeeditor.cpp | 9 +++++---- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/include/eepp/ui/linewrapping.hpp b/include/eepp/ui/linewrapping.hpp index 8453d6ead..3e3933a8b 100644 --- a/include/eepp/ui/linewrapping.hpp +++ b/include/eepp/ui/linewrapping.hpp @@ -94,7 +94,8 @@ class EE_API LineWrapping { VisualLine getVisualLine( Int64 docIdx ) const; - VisualLineInfo getVisualLineInfo( const TextPosition& pos ) const; + VisualLineInfo getVisualLineInfo( const TextPosition& pos, + bool allowVisualLineEnd = false ) const; TextRange getVisualLineRange( Int64 visualLine ) const; @@ -108,7 +109,7 @@ class EE_API LineWrapping { bool isUnderConstruction() const; - protected: + protected: std::shared_ptr mDoc; FontStyleConfig mFontStyle; Config mConfig; diff --git a/include/eepp/ui/uicodeeditor.hpp b/include/eepp/ui/uicodeeditor.hpp index 6e4eff454..13622766d 100644 --- a/include/eepp/ui/uicodeeditor.hpp +++ b/include/eepp/ui/uicodeeditor.hpp @@ -466,7 +466,8 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { void unregisterPlugin( UICodeEditorPlugin* plugin ); virtual Vector2f getTextPositionOffset( const TextPosition& pos, - std::optional lineHeight = {} ) const; + std::optional lineHeight = {}, + bool allowVisualLineEnd = false ) const; Vector2f getTextPositionOffsetSanitized( TextPosition pos, std::optional lineHeight = {} ) const; diff --git a/src/eepp/ui/linewrapping.cpp b/src/eepp/ui/linewrapping.cpp index 01b90ad52..f0723e507 100644 --- a/src/eepp/ui/linewrapping.cpp +++ b/src/eepp/ui/linewrapping.cpp @@ -103,7 +103,7 @@ LineWrapping::LineWrapInfo LineWrapping::computeLineBreaks( const String& string info.wraps.push_back( lastSpace + 1 ); xoffset = w + info.paddingStart + ( xoffset - lastWidth ); } else { - info.wraps.push_back( idx + 1 ); + info.wraps.push_back( idx ); xoffset = w + info.paddingStart; } lastSpace = 0; @@ -186,7 +186,7 @@ LineWrapping::LineWrapInfo LineWrapping::computeLineBreaks( const TextDocument& info.wraps.push_back( lastSpace + 1 ); xoffset = w + info.paddingStart + ( xoffset - lastWidth ); } else { - info.wraps.push_back( idx + 1 ); + info.wraps.push_back( idx ); xoffset = w + info.paddingStart; } lastSpace = 0; @@ -340,7 +340,8 @@ LineWrapping::VisualLine LineWrapping::getVisualLine( Int64 docIdx ) const { return line; } -LineWrapping::VisualLineInfo LineWrapping::getVisualLineInfo( const TextPosition& pos ) const { +LineWrapping::VisualLineInfo LineWrapping::getVisualLineInfo( const TextPosition& pos, + bool allowVisualLineEnd ) const { if ( mConfig.mode == LineWrapMode::NoWrap ) { LineWrapping::VisualLineInfo info; info.visualIndex = pos.line(); @@ -352,8 +353,9 @@ LineWrapping::VisualLineInfo LineWrapping::getVisualLineInfo( const TextPosition LineWrapping::VisualLineInfo info; for ( Int64 i = fromIdx; i < toIdx; i++ ) { Int64 fromCol = mWrappedLines[i].column(); - Int64 toCol = - i + 1 <= toIdx ? mWrappedLines[i + 1].column() - 1 : mDoc->line( pos.line() ).size(); + Int64 toCol = i + 1 <= toIdx + ? mWrappedLines[i + 1].column() - ( allowVisualLineEnd ? 0 : 1 ) + : mDoc->line( pos.line() ).size(); if ( pos.column() >= fromCol && pos.column() <= toCol ) { info.visualIndex = i; info.range = { { pos.line(), fromCol }, { pos.line(), toCol } }; diff --git a/src/eepp/ui/uicodeeditor.cpp b/src/eepp/ui/uicodeeditor.cpp index ecacb0267..62e72f33a 100644 --- a/src/eepp/ui/uicodeeditor.cpp +++ b/src/eepp/ui/uicodeeditor.cpp @@ -2080,10 +2080,11 @@ void UICodeEditor::setScrollY( const Float& val, bool emmitEvent ) { } Vector2f UICodeEditor::getTextPositionOffset( const TextPosition& position, - std::optional lineHeight ) const { + std::optional lineHeight, + bool allowVisualLineEnd ) const { Float lh = lineHeight ? *lineHeight : getLineHeight(); if ( mLineWrapping.isWrappedLine( position.line() ) ) { - auto info = mLineWrapping.getVisualLineInfo( position ); + auto info = mLineWrapping.getVisualLineInfo( position, allowVisualLineEnd ); if ( mFont && !mFont->isMonospace() ) { const auto& line = mDoc->line( position.line() ).getText(); auto partialLine = @@ -3580,9 +3581,9 @@ UICodeEditor::getTextRangeRectangles( const TextRange& range, const Vector2f& st auto nextInfo = mLineWrapping.getDocumentLine( visibleIdx + 1 ); if ( nextInfo.line() == info.line() ) { endOffset = - getTextPositionOffset( { info.line(), nextInfo.column() - 1 }, lh ); + getTextPositionOffset( { info.line(), nextInfo.column() }, lh, true ); } else { - endOffset = getTextPositionOffset( mDoc->endOfLine( { ln, 0 } ), lh ); + endOffset = getTextPositionOffset( mDoc->endOfLine( { ln, 0 } ), lh, true ); } } selRect.Right = startScroll.x + endOffset.x;