diff --git a/LibGUI/GAction.cpp b/LibGUI/GAction.cpp index 90a63260f6..4601d9dd90 100644 --- a/LibGUI/GAction.cpp +++ b/LibGUI/GAction.cpp @@ -3,7 +3,7 @@ #include #include -GAction::GAction(const String& text, const String& custom_data, Function on_activation_callback, GWidget* widget) +GAction::GAction(const String& text, const String& custom_data, Function on_activation_callback, GWidget* widget) : on_activation(move(on_activation_callback)) , m_text(text) , m_custom_data(custom_data) @@ -11,12 +11,12 @@ GAction::GAction(const String& text, const String& custom_data, Function on_activation_callback, GWidget* widget) +GAction::GAction(const String& text, Function on_activation_callback, GWidget* widget) : GAction(text, String(), move(on_activation_callback), widget) { } -GAction::GAction(const String& text, RetainPtr&& icon, Function on_activation_callback, GWidget* widget) +GAction::GAction(const String& text, RetainPtr&& icon, Function on_activation_callback, GWidget* widget) : on_activation(move(on_activation_callback)) , m_text(text) , m_icon(move(icon)) @@ -24,13 +24,13 @@ GAction::GAction(const String& text, RetainPtr&& icon, Function< { } -GAction::GAction(const String& text, const GShortcut& shortcut, Function on_activation_callback, GWidget* widget) +GAction::GAction(const String& text, const GShortcut& shortcut, Function on_activation_callback, GWidget* widget) : GAction(text, shortcut, nullptr, move(on_activation_callback), widget) { } -GAction::GAction(const String& text, const GShortcut& shortcut, RetainPtr&& icon, Function on_activation_callback, GWidget* widget) +GAction::GAction(const String& text, const GShortcut& shortcut, RetainPtr&& icon, Function on_activation_callback, GWidget* widget) : on_activation(move(on_activation_callback)) , m_text(text) , m_icon(move(icon)) diff --git a/LibGUI/GAction.h b/LibGUI/GAction.h index 7dafc464ec..4d9445fc96 100644 --- a/LibGUI/GAction.h +++ b/LibGUI/GAction.h @@ -22,23 +22,23 @@ public: ApplicationGlobal, WidgetLocal, }; - static Retained create(const String& text, Function callback, GWidget* widget = nullptr) + static Retained create(const String& text, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, move(callback), widget)); } - static Retained create(const String& text, const String& custom_data, Function callback, GWidget* widget = nullptr) + static Retained create(const String& text, const String& custom_data, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, custom_data, move(callback), widget)); } - static Retained create(const String& text, RetainPtr&& icon, Function callback, GWidget* widget = nullptr) + static Retained create(const String& text, RetainPtr&& icon, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, move(icon), move(callback), widget)); } - static Retained create(const String& text, const GShortcut& shortcut, Function callback, GWidget* widget = nullptr) + static Retained create(const String& text, const GShortcut& shortcut, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, shortcut, move(callback), widget)); } - static Retained create(const String& text, const GShortcut& shortcut, RetainPtr&& icon, Function callback, GWidget* widget = nullptr) + static Retained create(const String& text, const GShortcut& shortcut, RetainPtr&& icon, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, shortcut, move(icon), move(callback), widget)); } @@ -71,11 +71,11 @@ public: void unregister_menu_item(Badge, GMenuItem&); private: - GAction(const String& text, Function = nullptr, GWidget* = nullptr); - GAction(const String& text, const GShortcut&, Function = nullptr, GWidget* = nullptr); - GAction(const String& text, const GShortcut&, RetainPtr&& icon, Function = nullptr, GWidget* = nullptr); - GAction(const String& text, RetainPtr&& icon, Function = nullptr, GWidget* = nullptr); - GAction(const String& text, const String& custom_data = String(), Function = nullptr, GWidget* = nullptr); + GAction(const String& text, Function = nullptr, GWidget* = nullptr); + GAction(const String& text, const GShortcut&, Function = nullptr, GWidget* = nullptr); + GAction(const String& text, const GShortcut&, RetainPtr&& icon, Function = nullptr, GWidget* = nullptr); + GAction(const String& text, RetainPtr&& icon, Function = nullptr, GWidget* = nullptr); + GAction(const String& text, const String& custom_data = String(), Function = nullptr, GWidget* = nullptr); template void for_each_toolbar_button(Callback); template void for_each_menu_item(Callback); diff --git a/LibGUI/GTableView.cpp b/LibGUI/GTableView.cpp index b328d8329b..310e77c6ae 100644 --- a/LibGUI/GTableView.cpp +++ b/LibGUI/GTableView.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include #include @@ -109,15 +111,15 @@ void GTableView::mousedown_event(GMouseEvent& event) auto adjusted_position = this->adjusted_position(event.position()); if (event.y() < header_height()) { + if (event.button() != GMouseButton::Left) + return; for (int i = 0; i < model()->column_count(); ++i) { - if (event.button() == GMouseButton::Left) { - if (column_resize_grabbable_rect(i).contains(adjusted_position)) { - m_resizing_column = i; - m_in_column_resize = true; - m_column_resize_original_width = column_width(i); - m_column_resize_origin = event.position(); - return; - } + if (column_resize_grabbable_rect(i).contains(adjusted_position)) { + m_resizing_column = i; + m_in_column_resize = true; + m_column_resize_original_width = column_width(i); + m_column_resize_origin = event.position(); + return; } auto header_rect = this->header_rect(i); if (header_rect.contains(adjusted_position)) { @@ -413,6 +415,40 @@ void GTableView::doubleclick_event(GMouseEvent& event) } } +GMenu& GTableView::ensure_header_context_menu() +{ + // FIXME: This menu needs to be rebuilt if the model is swapped out, + // or if the column count/names change. + if (!m_header_context_menu) { + ASSERT(model()); + m_header_context_menu = make(""); + + for (int column = 0; column < model()->column_count(); ++column) { + auto& column_data = this->column_data(column); + column_data.visibility_action = GAction::create(model()->column_name(column), [this, column] (GAction& action) { + action.set_checked(!action.is_checked()); + set_column_hidden(column, !action.is_checked()); + }); + column_data.visibility_action->set_checkable(true); + column_data.visibility_action->set_checked(true); + + m_header_context_menu->add_action(*column_data.visibility_action); + } + } + return *m_header_context_menu; +} + +void GTableView::context_menu_event(GContextMenuEvent& event) +{ + if (!model()) + return; + if (event.position().y() < header_height()) { + ensure_header_context_menu().popup(event.screen_position()); + return; + } + dbgprintf("GTableView::context_menu_event(): FIXME: Implement for table rows.\n"); +} + void GTableView::leave_event(CEvent&) { window()->set_override_cursor(GStandardCursor::None); diff --git a/LibGUI/GTableView.h b/LibGUI/GTableView.h index 9ca30913f1..4838b4f048 100644 --- a/LibGUI/GTableView.h +++ b/LibGUI/GTableView.h @@ -45,6 +45,7 @@ private: virtual void doubleclick_event(GMouseEvent&) override; virtual void keydown_event(GKeyEvent&) override; virtual void leave_event(CEvent&) override; + virtual void context_menu_event(GContextMenuEvent&) override; Rect content_rect(int row, int column) const; void paint_headers(Painter&); @@ -59,6 +60,7 @@ private: int width { 0 }; bool has_initialized_width { false }; bool visibility { true }; + RetainPtr visibility_action; }; ColumnData& column_data(int column) const; @@ -71,4 +73,7 @@ private: Point m_column_resize_origin; int m_column_resize_original_width { 0 }; int m_resizing_column { -1 }; + + GMenu& ensure_header_context_menu(); + OwnPtr m_header_context_menu; };