From 43d56b6f3a45dd2f92f4fd7b1cf7a8bdf0cb57ba Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 7 Mar 2019 16:49:04 +0100 Subject: [PATCH] GTextEditor: Support splitting lines at the cursor with the Return key. --- AK/Vector.h | 20 +++++++++++++++----- LibGUI/GTextEditor.cpp | 15 ++++++++++++++- LibGUI/GTextEditor.h | 1 + 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/AK/Vector.h b/AK/Vector.h index 13ffb4df645..02f3997fd56 100644 --- a/AK/Vector.h +++ b/AK/Vector.h @@ -252,12 +252,22 @@ public: void resize(ssize_t new_size) { - ASSERT(new_size >= size()); - if (!new_size) + if (new_size == size()) return; - ensure_capacity(new_size); - for (ssize_t i = size(); i < new_size; ++i) - new (m_impl->slot(i)) T; + + if (!new_size) { + clear(); + return; + } + + if (new_size > size()) { + ensure_capacity(new_size); + for (ssize_t i = size(); i < new_size; ++i) + new (m_impl->slot(i)) T; + } else { + for (int i = new_size; i < size(); ++i) + m_impl->at(i).~T(); + } m_impl->m_size = new_size; } diff --git a/LibGUI/GTextEditor.cpp b/LibGUI/GTextEditor.cpp index 720277347b8..5e2b2f9dcb7 100644 --- a/LibGUI/GTextEditor.cpp +++ b/LibGUI/GTextEditor.cpp @@ -240,10 +240,17 @@ void GTextEditor::insert_at_cursor(char ch) if (at_tail || at_head) { m_lines.insert(m_cursor.line() + (at_tail ? 1 : 0), make()); update_scrollbar_ranges(); - set_cursor(m_cursor.line() + 1, 0); update(); + set_cursor(m_cursor.line() + 1, 0); return; } + auto new_line = make(); + new_line->append(current_line().characters() + m_cursor.column(), current_line().length() - m_cursor.column()); + current_line().truncate(m_cursor.column()); + m_lines.insert(m_cursor.line() + 1, move(new_line)); + update_scrollbar_ranges(); + update(); + set_cursor(m_cursor.line() + 1, 0); return; } current_line().insert(m_cursor.column(), ch); @@ -414,3 +421,9 @@ void GTextEditor::Line::remove(int index) m_text.remove(index); } } + +void GTextEditor::Line::truncate(int length) +{ + m_text.resize(length + 1); + m_text.last() = 0; +} diff --git a/LibGUI/GTextEditor.h b/LibGUI/GTextEditor.h index 5964df624ba..1c905512b21 100644 --- a/LibGUI/GTextEditor.h +++ b/LibGUI/GTextEditor.h @@ -73,6 +73,7 @@ private: void insert(int index, char); void remove(int index); void append(const char*, int); + void truncate(int length); private: // NOTE: This vector is null terminated.