diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-03-07 16:04:21 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-03-07 16:04:21 +0100 |
commit | 6094f592a905d18af7bf4ee6a0fde2168d3236a2 (patch) | |
tree | e23d6af2ae9bcfbe1a3df0c02a1176d202e305fa | |
parent | 8425ea971a97bca1039fbbb8ad76a5f18c097536 (diff) | |
download | serenity-6094f592a905d18af7bf4ee6a0fde2168d3236a2.zip |
GTextEditor: More work on basic line editing. Insert/remove characters.
-rw-r--r-- | LibGUI/GTextEditor.cpp | 42 | ||||
-rw-r--r-- | LibGUI/GTextEditor.h | 5 |
2 files changed, 47 insertions, 0 deletions
diff --git a/LibGUI/GTextEditor.cpp b/LibGUI/GTextEditor.cpp index 1e0899408c..63ad6ed1de 100644 --- a/LibGUI/GTextEditor.cpp +++ b/LibGUI/GTextEditor.cpp @@ -186,6 +186,14 @@ void GTextEditor::keydown_event(GKeyEvent& event) return; } + if (!event.modifiers() && event.key() == KeyCode::Key_Backspace) { + if (m_cursor.column() > 0) { + current_line().remove(m_cursor.column() - 1); + set_cursor(m_cursor.line(), m_cursor.column() - 1); + } + return; + } + if (!event.text().is_empty()) insert_at_cursor(event.text()[0]); @@ -204,7 +212,11 @@ void GTextEditor::insert_at_cursor(char ch) update(); return; } + return; } + current_line().insert(m_cursor.column(), ch); + set_cursor(m_cursor.line(), m_cursor.column() + 1); + update_cursor(); } Rect GTextEditor::visible_content_rect() const @@ -330,3 +342,33 @@ int GTextEditor::Line::width(const Font& font) const { return font.glyph_width('x') * length(); } + +void GTextEditor::Line::append(char ch) +{ + insert(length(), ch); +} + +void GTextEditor::Line::prepend(char ch) +{ + insert(0, ch); +} + +void GTextEditor::Line::insert(int index, char ch) +{ + if (index == length()) { + m_text.last() = ch; + m_text.append(0); + } else { + m_text.insert(index, move(ch)); + } +} + +void GTextEditor::Line::remove(int index) +{ + if (index == length()) { + m_text.take_last(); + m_text.last() = 0; + } else { + m_text.remove(index); + } +} diff --git a/LibGUI/GTextEditor.h b/LibGUI/GTextEditor.h index 643b38f114..5c16cf04a8 100644 --- a/LibGUI/GTextEditor.h +++ b/LibGUI/GTextEditor.h @@ -60,6 +60,7 @@ private: virtual bool accepts_focus() const override { return true; } class Line { + friend class GTextEditor; public: Line(); @@ -67,6 +68,10 @@ private: int length() const { return m_text.size() - 1; } int width(const Font&) const; void set_text(const String&); + void append(char); + void prepend(char); + void insert(int index, char); + void remove(int index); private: // NOTE: This vector is null terminated. |