#pragma once #include #include #include #include #include #include #include #include #include #include class GButton; class GMenuItem; class GWidget; class GAction : public Retainable , public Weakable { public: enum class ShortcutScope { None, ApplicationGlobal, WidgetLocal, }; static Retained create(const StringView& text, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, move(callback), widget)); } static Retained create(const StringView& text, const StringView& custom_data, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, custom_data, move(callback), widget)); } static Retained create(const StringView& text, RetainPtr&& icon, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, move(icon), move(callback), widget)); } static Retained create(const StringView& text, const GShortcut& shortcut, Function callback, GWidget* widget = nullptr) { return adopt(*new GAction(text, shortcut, move(callback), widget)); } static Retained create(const StringView& text, const GShortcut& shortcut, RetainPtr&& 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; } String custom_data() const { return m_custom_data; } const GraphicsBitmap* icon() const { return m_icon.ptr(); } 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&); 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&, RetainPtr&& icon, Function = nullptr, GWidget* = nullptr); GAction(const StringView& text, RetainPtr&& icon, Function = nullptr, GWidget* = nullptr); GAction(const StringView& text, const StringView& custom_data = StringView(), Function = nullptr, GWidget* = nullptr); template void for_each_toolbar_button(Callback); template void for_each_menu_item(Callback); String m_text; String m_custom_data; RetainPtr 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; };