From fa20dcafb5a55dbf6b0f338bff8c9b2f2378e62d Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 25 Aug 2019 14:04:46 +0200 Subject: [PATCH] GTextEditor: Simplify computation of visual selection start/end Add Line::visual_line_containing(int column) to easily convert a column number into a visual line index. --- Libraries/LibGUI/GTextEditor.cpp | 41 +++++++++++++++----------------- Libraries/LibGUI/GTextEditor.h | 1 + 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/Libraries/LibGUI/GTextEditor.cpp b/Libraries/LibGUI/GTextEditor.cpp index 2a25fdd0f6..42b0eaaa5d 100644 --- a/Libraries/LibGUI/GTextEditor.cpp +++ b/Libraries/LibGUI/GTextEditor.cpp @@ -362,30 +362,15 @@ void GTextEditor::paint_event(GPaintEvent& event) int first_visual_line_with_selection = -1; int last_visual_line_with_selection = -1; if (physical_line_has_selection) { - if (selection.start().line() < line_index) { + if (selection.start().line() < line_index) first_visual_line_with_selection = 0; - } else { - int visual_line_index = 0; - line.for_each_visual_line([&](const Rect&, const StringView& view, int start_of_visual_line) { - if (selection.start().column() >= start_of_visual_line && ((selection.start().column() - start_of_visual_line) < view.length())) - return IterationDecision::Break; - ++visual_line_index; - return IterationDecision::Continue; - }); - first_visual_line_with_selection = visual_line_index; - } - if (selection.end().line() > line_index) { + else + first_visual_line_with_selection = line.visual_line_containing(selection.start().column()); + + if (selection.end().line() > line_index) last_visual_line_with_selection = line.m_visual_line_breaks.size(); - } else { - int visual_line_index = 0; - line.for_each_visual_line([&](const Rect&, const StringView& view, int start_of_visual_line) { - if (selection.end().column() >= start_of_visual_line && ((selection.end().column() - start_of_visual_line) < view.length())) - return IterationDecision::Break; - ++visual_line_index; - return IterationDecision::Continue; - }); - last_visual_line_with_selection = visual_line_index; - } + else + last_visual_line_with_selection = line.visual_line_containing(selection.end().column()); } int selection_start_column_within_line = selection.start().line() == line_index ? selection.start().column() : 0; @@ -1416,3 +1401,15 @@ void GTextEditor::set_line_wrapping_enabled(bool enabled) recompute_all_visual_lines(); update(); } + +int GTextEditor::Line::visual_line_containing(int column) const +{ + int visual_line_index = 0; + for_each_visual_line([&](const Rect&, const StringView& view, int start_of_visual_line) { + if (column >= start_of_visual_line && ((column - start_of_visual_line) < view.length())) + return IterationDecision::Break; + ++visual_line_index; + return IterationDecision::Continue; + }); + return visual_line_index; +} diff --git a/Libraries/LibGUI/GTextEditor.h b/Libraries/LibGUI/GTextEditor.h index 98b8587924..74a5345bb5 100644 --- a/Libraries/LibGUI/GTextEditor.h +++ b/Libraries/LibGUI/GTextEditor.h @@ -203,6 +203,7 @@ private: void truncate(int length); void clear(); void recompute_visual_lines(); + int visual_line_containing(int column) const; template void for_each_visual_line(Callback) const;