Ver Fonte

TextEditor: The delete key should work even when there's no selection.

Andreas Kling há 6 anos atrás
pai
commit
ed2303e2d8
3 ficheiros alterados com 30 adições e 24 exclusões
  1. 1 1
      Applications/TextEditor/main.cpp
  2. 27 22
      LibGUI/GTextEditor.cpp
  3. 2 1
      LibGUI/GTextEditor.h

+ 1 - 1
Applications/TextEditor/main.cpp

@@ -78,7 +78,7 @@ int main(int argc, char** argv)
     });
 
     auto delete_action = GAction::create("Delete", { 0, Key_Delete }, GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/delete.rgb", { 16, 16 }), [&] (const GAction&) {
-        text_editor->delete_selection();
+        text_editor->do_delete();
     });
 
     auto menubar = make<GMenuBar>();

+ 27 - 22
LibGUI/GTextEditor.cpp

@@ -382,28 +382,7 @@ void GTextEditor::keydown_event(GKeyEvent& event)
     }
 
     if (event.key() == KeyCode::Key_Delete) {
-        if (has_selection()) {
-            delete_selection();
-            return;
-        }
-        if (m_cursor.column() < current_line().length()) {
-            // Delete within line
-            current_line().remove(m_cursor.column());
-            update_content_size();
-            update_cursor();
-            return;
-        }
-        if (m_cursor.column() == current_line().length() && m_cursor.line() != line_count() - 1) {
-            // Delete at end of line; merge with next line
-            auto& next_line = *m_lines[m_cursor.line() + 1];
-            int previous_length = current_line().length();
-            current_line().append(next_line.characters(), next_line.length());
-            m_lines.remove(m_cursor.line() + 1);
-            update_content_size();
-            update();
-            set_cursor(m_cursor.line(), previous_length);
-            return;
-        }
+        do_delete();
         return;
     }
 
@@ -413,6 +392,32 @@ void GTextEditor::keydown_event(GKeyEvent& event)
     return GWidget::keydown_event(event);
 }
 
+void GTextEditor::do_delete()
+{
+    if (has_selection()) {
+        delete_selection();
+        return;
+    }
+    if (m_cursor.column() < current_line().length()) {
+        // Delete within line
+        current_line().remove(m_cursor.column());
+        update_content_size();
+        update_cursor();
+        return;
+    }
+    if (m_cursor.column() == current_line().length() && m_cursor.line() != line_count() - 1) {
+        // Delete at end of line; merge with next line
+        auto& next_line = *m_lines[m_cursor.line() + 1];
+        int previous_length = current_line().length();
+        current_line().append(next_line.characters(), next_line.length());
+        m_lines.remove(m_cursor.line() + 1);
+        update_content_size();
+        update();
+        set_cursor(m_cursor.line(), previous_length);
+        return;
+    }
+}
+
 void GTextEditor::insert_at_cursor(const String& text)
 {
     // FIXME: This should obviously not be implemented this way.

+ 2 - 1
LibGUI/GTextEditor.h

@@ -93,7 +93,7 @@ public:
     void cut();
     void copy();
     void paste();
-    void delete_selection();
+    void do_delete();
 
     Function<void(GTextEditor&)> on_return_pressed;
     Function<void(GTextEditor&)> on_escape_pressed;
@@ -150,6 +150,7 @@ private:
     Rect ruler_content_rect(int line) const;
     void toggle_selection_if_needed_for_event(const GKeyEvent&);
     void insert_at_cursor_or_replace_selection(const String&);
+    void delete_selection();
 
     Type m_type { MultiLine };