diff options
-rw-r--r-- | Userland/Applications/Spreadsheet/SpreadsheetView.cpp | 10 | ||||
-rw-r--r-- | Userland/Applications/Spreadsheet/SpreadsheetView.h | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/ModelEditingDelegate.h | 12 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/TableView.cpp | 12 |
4 files changed, 23 insertions, 13 deletions
diff --git a/Userland/Applications/Spreadsheet/SpreadsheetView.cpp b/Userland/Applications/Spreadsheet/SpreadsheetView.cpp index eb239f6936..97cc81b258 100644 --- a/Userland/Applications/Spreadsheet/SpreadsheetView.cpp +++ b/Userland/Applications/Spreadsheet/SpreadsheetView.cpp @@ -25,23 +25,23 @@ SpreadsheetView::~SpreadsheetView() { } -void SpreadsheetView::EditingDelegate::set_value(const GUI::Variant& value) +void SpreadsheetView::EditingDelegate::set_value(GUI::Variant const& value, GUI::ModelEditingDelegate::SelectionBehavior selection_behavior) { if (value.as_string().is_null()) { - StringModelEditingDelegate::set_value(""); + StringModelEditingDelegate::set_value("", selection_behavior); commit(); return; } if (m_has_set_initial_value) - return StringModelEditingDelegate::set_value(value); + return StringModelEditingDelegate::set_value(value, selection_behavior); m_has_set_initial_value = true; const auto option = m_sheet.at({ (size_t)index().column(), (size_t)index().row() }); if (option) - return StringModelEditingDelegate::set_value(option->source()); + return StringModelEditingDelegate::set_value(option->source(), selection_behavior); - StringModelEditingDelegate::set_value(""); + StringModelEditingDelegate::set_value("", selection_behavior); } void InfinitelyScrollableTableView::did_scroll() diff --git a/Userland/Applications/Spreadsheet/SpreadsheetView.h b/Userland/Applications/Spreadsheet/SpreadsheetView.h index 3c5f371fc9..38e304346a 100644 --- a/Userland/Applications/Spreadsheet/SpreadsheetView.h +++ b/Userland/Applications/Spreadsheet/SpreadsheetView.h @@ -116,7 +116,7 @@ private: : m_sheet(sheet) { } - virtual void set_value(const GUI::Variant& value) override; + virtual void set_value(GUI::Variant const&, GUI::ModelEditingDelegate::SelectionBehavior) override; virtual RefPtr<Widget> create_widget() override { diff --git a/Userland/Libraries/LibGUI/ModelEditingDelegate.h b/Userland/Libraries/LibGUI/ModelEditingDelegate.h index 2678f25cfd..a910b67b05 100644 --- a/Userland/Libraries/LibGUI/ModelEditingDelegate.h +++ b/Userland/Libraries/LibGUI/ModelEditingDelegate.h @@ -14,6 +14,11 @@ namespace GUI { class ModelEditingDelegate { public: + enum SelectionBehavior { + DoNotSelect, + SelectAll, + }; + virtual ~ModelEditingDelegate() { } void bind(Model& model, const ModelIndex& index) @@ -32,7 +37,7 @@ public: Function<void()> on_rollback; virtual Variant value() const = 0; - virtual void set_value(const Variant&) = 0; + virtual void set_value(Variant const&, SelectionBehavior selection_behavior = SelectionBehavior::SelectAll) = 0; virtual void will_begin_editing() { } @@ -76,11 +81,12 @@ public: return textbox; } virtual Variant value() const override { return static_cast<const TextBox*>(widget())->text(); } - virtual void set_value(const Variant& value) override + virtual void set_value(Variant const& value, SelectionBehavior selection_behavior) override { auto& textbox = static_cast<TextBox&>(*widget()); textbox.set_text(value.to_string()); - textbox.select_all(); + if (selection_behavior == SelectionBehavior::SelectAll) + textbox.select_all(); } }; diff --git a/Userland/Libraries/LibGUI/TableView.cpp b/Userland/Libraries/LibGUI/TableView.cpp index d26d4a1064..9a904bec49 100644 --- a/Userland/Libraries/LibGUI/TableView.cpp +++ b/Userland/Libraries/LibGUI/TableView.cpp @@ -173,14 +173,18 @@ void TableView::keydown_event(KeyEvent& event) if (event.is_accepted()) return; - auto is_delete = event.key() == Key_Delete || event.key() == Key_Backspace; - if (is_editable() && edit_triggers() & EditTrigger::AnyKeyPressed && (event.code_point() != 0 || is_delete)) { + auto is_delete = event.key() == Key_Delete; + auto is_backspace = event.key() == Key_Backspace; + auto is_clear = is_delete || is_backspace; + if (is_editable() && edit_triggers() & EditTrigger::AnyKeyPressed && (event.code_point() != 0 || is_clear)) { begin_editing(cursor_index()); if (m_editing_delegate) { if (is_delete) - m_editing_delegate->set_value(event.key() == Key_Delete ? String {} : String::empty()); + m_editing_delegate->set_value(String {}); + else if (is_backspace) + m_editing_delegate->set_value(String::empty()); else - m_editing_delegate->set_value(event.text()); + m_editing_delegate->set_value(event.text(), ModelEditingDelegate::SelectionBehavior::DoNotSelect); } } } |