From 0a0dfeee8b95d50c2db1c45079e3ea37b2376498 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 21 Oct 2019 18:58:27 +0200 Subject: [PATCH] LibGUI: Make GTextEditor::set_cursor() public Also clamp the cursor value to the possible range instead of asserting when trying to set a cursor past the end of the document. --- Libraries/LibGUI/GTextEditor.cpp | 13 ++++++++++--- Libraries/LibGUI/GTextEditor.h | 5 +++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Libraries/LibGUI/GTextEditor.cpp b/Libraries/LibGUI/GTextEditor.cpp index 34574d0707..e6bfd12ec6 100644 --- a/Libraries/LibGUI/GTextEditor.cpp +++ b/Libraries/LibGUI/GTextEditor.cpp @@ -848,11 +848,18 @@ void GTextEditor::set_cursor(int line, int column) set_cursor({ line, column }); } -void GTextEditor::set_cursor(const GTextPosition& position) +void GTextEditor::set_cursor(const GTextPosition& a_position) { ASSERT(!m_lines.is_empty()); - ASSERT(position.line() < m_lines.size()); - ASSERT(position.column() <= m_lines[position.line()].length()); + + GTextPosition position = a_position; + + if (position.line() >= m_lines.size()) + position.set_line(m_lines.size() - 1); + + if (position.column() > m_lines[position.line()].length()) + position.set_column(m_lines[position.line()].length()); + if (m_cursor != position) { // NOTE: If the old cursor is no longer valid, repaint everything just in case. auto old_cursor_line_rect = m_cursor.line() < m_lines.size() diff --git a/Libraries/LibGUI/GTextEditor.h b/Libraries/LibGUI/GTextEditor.h index 3caa350924..756f0fedb2 100644 --- a/Libraries/LibGUI/GTextEditor.h +++ b/Libraries/LibGUI/GTextEditor.h @@ -164,6 +164,9 @@ public: void add_custom_context_menu_action(GAction&); + void set_cursor(int line, int column); + void set_cursor(const GTextPosition&); + protected: GTextEditor(Type, GWidget* parent); @@ -229,8 +232,6 @@ private: Rect cursor_content_rect() const; Rect content_rect_for_position(const GTextPosition&) const; void update_cursor(); - void set_cursor(int line, int column); - void set_cursor(const GTextPosition&); Line& current_line() { return m_lines[m_cursor.line()]; } const Line& current_line() const { return m_lines[m_cursor.line()]; } GTextPosition text_position_at(const Point&) const;