summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-03-07 16:04:21 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-03-07 16:04:21 +0100
commit6094f592a905d18af7bf4ee6a0fde2168d3236a2 (patch)
treee23d6af2ae9bcfbe1a3df0c02a1176d202e305fa
parent8425ea971a97bca1039fbbb8ad76a5f18c097536 (diff)
downloadserenity-6094f592a905d18af7bf4ee6a0fde2168d3236a2.zip
GTextEditor: More work on basic line editing. Insert/remove characters.
-rw-r--r--LibGUI/GTextEditor.cpp42
-rw-r--r--LibGUI/GTextEditor.h5
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.