diff --git a/LibGUI/GAbstractView.cpp b/LibGUI/GAbstractView.cpp index 5d67294790..924cc0449f 100644 --- a/LibGUI/GAbstractView.cpp +++ b/LibGUI/GAbstractView.cpp @@ -35,11 +35,15 @@ void GAbstractView::model_notification(const GModelNotification& notification) void GAbstractView::did_update_model() { + if (!model() || model()->selected_index() != m_edit_index) + stop_editing(); model_notification(GModelNotification(GModelNotification::ModelUpdated)); } void GAbstractView::did_update_selection() { + if (!model() || model()->selected_index() != m_edit_index) + stop_editing(); } void GAbstractView::did_scroll() @@ -53,3 +57,34 @@ void GAbstractView::update_edit_widget_position() return; m_edit_widget->set_relative_rect(m_edit_widget_content_rect.translated(-horizontal_scrollbar().value(), -vertical_scrollbar().value())); } + +void GAbstractView::begin_editing(const GModelIndex& index) +{ + ASSERT(is_editable()); + ASSERT(model()); + if (m_edit_index == index) + return; + if (!model()->is_editable(index)) + return; + if (m_edit_widget) + delete m_edit_widget; + m_edit_index = index; + m_edit_widget = new GTextBox(this); + m_edit_widget->move_to_back(); + m_edit_widget->set_text(model()->data(index, GModel::Role::Display).to_string()); + m_edit_widget_content_rect = content_rect(index); + update_edit_widget_position(); + m_edit_widget->set_focus(true); + m_edit_widget->on_return_pressed = [this] { + ASSERT(model()); + model()->set_data(m_edit_index, m_edit_widget->text()); + stop_editing(); + }; +} + +void GAbstractView::stop_editing() +{ + m_edit_index = { }; + delete m_edit_widget; + m_edit_widget = nullptr; +} diff --git a/LibGUI/GAbstractView.h b/LibGUI/GAbstractView.h index ac019a673e..f660e141ce 100644 --- a/LibGUI/GAbstractView.h +++ b/LibGUI/GAbstractView.h @@ -23,6 +23,10 @@ public: virtual void did_update_model(); virtual void did_update_selection(); + virtual Rect content_rect(const GModelIndex&) const { return { }; } + void begin_editing(const GModelIndex&); + void stop_editing(); + Function on_model_notification; virtual const char* class_name() const override { return "GAbstractView"; } diff --git a/LibGUI/GModel.h b/LibGUI/GModel.h index 25d80b35fb..3cc91f491b 100644 --- a/LibGUI/GModel.h +++ b/LibGUI/GModel.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include diff --git a/LibGUI/GTableView.cpp b/LibGUI/GTableView.cpp index 65be3d6f57..342e57720d 100644 --- a/LibGUI/GTableView.cpp +++ b/LibGUI/GTableView.cpp @@ -39,7 +39,7 @@ void GTableView::did_update_model() update(); } -Rect GTableView::cell_content_rect(int row, int column) const +Rect GTableView::content_rect(int row, int column) const { auto row_rect = this->row_rect(row); int x = 0; @@ -49,9 +49,9 @@ Rect GTableView::cell_content_rect(int row, int column) const return { horizontal_padding() + row_rect.x() + x, row_rect.y(), column_width(column), item_height() }; } -Rect GTableView::cell_content_rect(const GModelIndex& index) const +Rect GTableView::content_rect(const GModelIndex& index) const { - return cell_content_rect(index.row(), index.column()); + return content_rect(index.row(), index.column()); } Rect GTableView::row_rect(int item_index) const @@ -107,7 +107,7 @@ void GTableView::mousedown_event(GMouseEvent& event) if (!row_rect(row).contains(adjusted_position)) continue; for (int column = 0, column_count = model()->column_count(); column < column_count; ++column) { - if (!cell_content_rect(row, column).contains(adjusted_position)) + if (!content_rect(row, column).contains(adjusted_position)) continue; model()->set_selected_index(model()->index(row, column)); update(); @@ -326,34 +326,3 @@ void GTableView::doubleclick_event(GMouseEvent& event) model()->activate(model()->selected_index()); } } - -void GTableView::begin_editing(const GModelIndex& index) -{ - ASSERT(is_editable()); - ASSERT(model()); - if (m_edit_index == index) - return; - if (!model()->is_editable(index)) - return; - if (m_edit_widget) - delete m_edit_widget; - m_edit_index = index; - m_edit_widget = new GTextBox(this); - m_edit_widget->move_to_back(); - m_edit_widget->set_text(model()->data(index, GModel::Role::Display).to_string()); - m_edit_widget_content_rect = cell_content_rect(index); - update_edit_widget_position(); - m_edit_widget->set_focus(true); - m_edit_widget->on_return_pressed = [this] { - ASSERT(model()); - model()->set_data(m_edit_index, m_edit_widget->text()); - stop_editing(); - }; -} - -void GTableView::stop_editing() -{ - m_edit_index = { }; - m_edit_widget->delete_later(); - m_edit_widget = nullptr; -} diff --git a/LibGUI/GTableView.h b/LibGUI/GTableView.h index 3900e164a5..de55d696b0 100644 --- a/LibGUI/GTableView.h +++ b/LibGUI/GTableView.h @@ -30,8 +30,7 @@ public: bool is_column_hidden(int) const; void set_column_hidden(int, bool); - void begin_editing(const GModelIndex&); - void stop_editing(); + virtual Rect content_rect(const GModelIndex&) const override; virtual const char* class_name() const override { return "GTableView"; } @@ -42,14 +41,13 @@ private: virtual void doubleclick_event(GMouseEvent&) override; virtual void keydown_event(GKeyEvent&) override; + Rect content_rect(int row, int column) const; void paint_headers(Painter&); int item_count() const; Rect row_rect(int item_index) const; Rect header_rect(int) const; int column_width(int) const; void update_content_size(); - Rect cell_content_rect(const GModelIndex&) const; - Rect cell_content_rect(int row, int column) const; Vector m_column_visibility; int m_horizontal_padding { 5 };