From 22e80bae29781ac286cfc47deecccc6faac59d53 Mon Sep 17 00:00:00 2001 From: Andrew January Date: Fri, 20 Aug 2021 18:56:43 +0100 Subject: [PATCH] LibGUI: Change delete key handling from action to keydown_event Having the delete key handling be done via an action limits our ability to support key modifiers (e.g. ctrl+delete deleting the word in front of the cursor). The fact that it was an action _did_ allow us to have a delete button in the TextEditor UI. However, this is an odd choice in the first place that isn't common in other text editors, so I just removed it. --- .../Applications/TextEditor/MainWidget.cpp | 2 -- Userland/Libraries/LibGUI/TextEditor.cpp | 24 +++++++++++++++---- Userland/Libraries/LibGUI/TextEditor.h | 2 -- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Userland/Applications/TextEditor/MainWidget.cpp b/Userland/Applications/TextEditor/MainWidget.cpp index 25637d4d39..efa8c85eab 100644 --- a/Userland/Applications/TextEditor/MainWidget.cpp +++ b/Userland/Applications/TextEditor/MainWidget.cpp @@ -327,7 +327,6 @@ MainWidget::MainWidget() m_toolbar->add_action(m_editor->cut_action()); m_toolbar->add_action(m_editor->copy_action()); m_toolbar->add_action(m_editor->paste_action()); - m_toolbar->add_action(m_editor->delete_action()); m_toolbar->add_separator(); @@ -384,7 +383,6 @@ void MainWidget::initialize_menubar(GUI::Window& window) edit_menu.add_action(m_editor->cut_action()); edit_menu.add_action(m_editor->copy_action()); edit_menu.add_action(m_editor->paste_action()); - edit_menu.add_action(m_editor->delete_action()); edit_menu.add_separator(); edit_menu.add_action(*m_vim_emulation_setting_action); edit_menu.add_separator(); diff --git a/Userland/Libraries/LibGUI/TextEditor.cpp b/Userland/Libraries/LibGUI/TextEditor.cpp index 1d84ae18ea..7eeebbe680 100644 --- a/Userland/Libraries/LibGUI/TextEditor.cpp +++ b/Userland/Libraries/LibGUI/TextEditor.cpp @@ -84,7 +84,6 @@ void TextEditor::create_actions() m_copy_action->set_enabled(false); m_paste_action = CommonActions::make_paste_action([&](auto&) { paste(); }, this); m_paste_action->set_enabled(is_editable() && Clipboard::the().mime_type().starts_with("text/") && !Clipboard::the().data().is_empty()); - m_delete_action = CommonActions::make_delete_action([&](auto&) { do_delete(); }, this); if (is_multi_line()) { m_go_to_line_action = Action::create( "Go to line...", { Mod_Ctrl, Key_L }, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/go-forward.png").release_value_but_fixme_should_propagate_errors(), [this](auto&) { @@ -834,8 +833,28 @@ void TextEditor::keydown_event(KeyEvent& event) } if (event.key() == KeyCode::Key_Delete) { + if (!is_editable()) + return; if (m_autocomplete_box) hide_autocomplete(); + if (has_selection()) { + delete_selection(); + did_update_selection(); + return; + } + + if (m_cursor.column() < current_line().length()) { + // Delete within line + TextRange erased_range(m_cursor, { m_cursor.line(), m_cursor.column() + 1 }); + execute(document().text_in_range(erased_range), erased_range); + return; + } + if (m_cursor.column() == current_line().length() && m_cursor.line() != line_count() - 1) { + // Delete at end of line; merge with next line + TextRange erased_range(m_cursor, { m_cursor.line() + 1, 0 }); + execute(document().text_in_range(erased_range), erased_range); + return; + } return; } @@ -1531,14 +1550,12 @@ void TextEditor::set_mode(const Mode mode) switch (mode) { case Editable: m_cut_action->set_enabled(has_selection() && !text_is_secret()); - m_delete_action->set_enabled(true); m_paste_action->set_enabled(true); set_accepts_emoji_input(true); break; case DisplayOnly: case ReadOnly: m_cut_action->set_enabled(false); - m_delete_action->set_enabled(false); m_paste_action->set_enabled(false); set_accepts_emoji_input(false); break; @@ -1577,7 +1594,6 @@ void TextEditor::context_menu_event(ContextMenuEvent& event) m_context_menu->add_action(cut_action()); m_context_menu->add_action(copy_action()); m_context_menu->add_action(paste_action()); - m_context_menu->add_action(delete_action()); m_context_menu->add_separator(); m_context_menu->add_action(select_all_action()); if (is_multi_line()) { diff --git a/Userland/Libraries/LibGUI/TextEditor.h b/Userland/Libraries/LibGUI/TextEditor.h index 2b84abaf3c..ea4e76ffa2 100644 --- a/Userland/Libraries/LibGUI/TextEditor.h +++ b/Userland/Libraries/LibGUI/TextEditor.h @@ -166,7 +166,6 @@ public: Action& cut_action() { return *m_cut_action; } Action& copy_action() { return *m_copy_action; } Action& paste_action() { return *m_paste_action; } - Action& delete_action() { return *m_delete_action; } Action& go_to_line_action() { return *m_go_to_line_action; } Action& select_all_action() { return *m_select_all_action; } @@ -365,7 +364,6 @@ private: RefPtr m_cut_action; RefPtr m_copy_action; RefPtr m_paste_action; - RefPtr m_delete_action; RefPtr m_go_to_line_action; RefPtr m_select_all_action; Core::ElapsedTimer m_triple_click_timer;