#pragma once #include #include #include #include #include #include #include #include #include #include #include class GAction; class GActionGroup; class GButton; class GMenuItem; class GWidget; namespace GCommonActions { NonnullRefPtr make_open_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_undo_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_redo_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_cut_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_copy_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_paste_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_delete_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_move_to_front_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_move_to_back_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_fullscreen_action(Function, GWidget* widget = nullptr); NonnullRefPtr make_quit_action(Function); }; class GAction : public RefCounted , public Weakable { public: enum class ShortcutScope { None, ApplicationGlobal, WidgetLocal, }; static NonnullRefPtr create(const StringView& text, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, move(callback), widget)); } static NonnullRefPtr create(const StringView& text, RefPtr&& icon, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, move(icon), move(callback), widget)); } static NonnullRefPtr create(const StringView& text, const GShortcut& shortcut, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, shortcut, move(callback), widget)); } static NonnullRefPtr create(const StringView& text, const GShortcut& shortcut, RefPtr&& icon, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, shortcut, move(icon), move(callback), widget)); } ~GAction(); GWidget* widget() { return m_widget.ptr(); } const GWidget* widget() const { return m_widget.ptr(); } String text() const { return m_text; } GShortcut shortcut() const { return m_shortcut; } const GraphicsBitmap* icon() const { return m_icon.ptr(); } void set_icon(const GraphicsBitmap* icon) { m_icon = icon; } Function on_activation; void activate(); bool is_enabled() const { return m_enabled; } void set_enabled(bool); bool is_checkable() const { return m_checkable; } void set_checkable(bool checkable) { m_checkable = checkable; } bool is_checked() const { ASSERT(is_checkable()); return m_checked; } void set_checked(bool); void register_button(Badge, GButton&); void unregister_button(Badge, GButton&); void register_menu_item(Badge, GMenuItem&); void unregister_menu_item(Badge, GMenuItem&); const GActionGroup* group() const { return m_action_group.ptr(); } void set_group(Badge, GActionGroup*); private: GAction(const StringView& text, Function = nullptr, GWidget* = nullptr); GAction(const StringView& text, const GShortcut&, Function = nullptr, GWidget* = nullptr); GAction(const StringView& text, const GShortcut&, RefPtr&& icon, Function = nullptr, GWidget* = nullptr); GAction(const StringView& text, RefPtr&& icon, Function = nullptr, GWidget* = nullptr); template void for_each_toolbar_button(Callback); template void for_each_menu_item(Callback); String m_text; RefPtr m_icon; GShortcut m_shortcut; bool m_enabled { true }; bool m_checkable { false }; bool m_checked { false }; ShortcutScope m_scope { ShortcutScope::None }; HashTable m_buttons; HashTable m_menu_items; WeakPtr m_widget; WeakPtr m_action_group; };