diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-07-04 16:16:50 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-07-04 16:16:50 +0200 |
commit | 04b9dc2d30cfc9b383029f6a4b02e2725108b0ae (patch) | |
tree | e117a998173b767f9fd009d49c4f8573d8b85432 /Libraries/LibGUI/GAction.h | |
parent | 63814ffebf16291419745cd8ba29a4d2fd888563 (diff) | |
download | serenity-04b9dc2d30cfc9b383029f6a4b02e2725108b0ae.zip |
Libraries: Create top level directory for libraries.
Things were getting a little crowded in the project root, so this patch
moves the Lib*/ directories into Libraries/.
Diffstat (limited to 'Libraries/LibGUI/GAction.h')
-rw-r--r-- | Libraries/LibGUI/GAction.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/Libraries/LibGUI/GAction.h b/Libraries/LibGUI/GAction.h new file mode 100644 index 0000000000..1a80737721 --- /dev/null +++ b/Libraries/LibGUI/GAction.h @@ -0,0 +1,102 @@ +#pragma once + +#include <AK/AKString.h> +#include <AK/Badge.h> +#include <AK/Function.h> +#include <AK/HashTable.h> +#include <AK/RefCounted.h> +#include <AK/NonnullRefPtr.h> +#include <AK/WeakPtr.h> +#include <AK/Weakable.h> +#include <LibGUI/GShortcut.h> +#include <SharedGraphics/GraphicsBitmap.h> + +class GButton; +class GMenuItem; +class GWidget; + +class GAction : public RefCounted<GAction> + , public Weakable<GAction> { +public: + enum class ShortcutScope { + None, + ApplicationGlobal, + WidgetLocal, + }; + static NonnullRefPtr<GAction> create(const StringView& text, Function<void(GAction&)> callback, GWidget* widget = nullptr) + { + return adopt(*new GAction(text, move(callback), widget)); + } + static NonnullRefPtr<GAction> create(const StringView& text, const StringView& custom_data, Function<void(GAction&)> callback, GWidget* widget = nullptr) + { + return adopt(*new GAction(text, custom_data, move(callback), widget)); + } + static NonnullRefPtr<GAction> create(const StringView& text, RefPtr<GraphicsBitmap>&& icon, Function<void(GAction&)> callback, GWidget* widget = nullptr) + { + return adopt(*new GAction(text, move(icon), move(callback), widget)); + } + static NonnullRefPtr<GAction> create(const StringView& text, const GShortcut& shortcut, Function<void(GAction&)> callback, GWidget* widget = nullptr) + { + return adopt(*new GAction(text, shortcut, move(callback), widget)); + } + static NonnullRefPtr<GAction> create(const StringView& text, const GShortcut& shortcut, RefPtr<GraphicsBitmap>&& icon, Function<void(GAction&)> 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<void(GAction&)> 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>, GButton&); + void unregister_button(Badge<GButton>, GButton&); + void register_menu_item(Badge<GMenuItem>, GMenuItem&); + void unregister_menu_item(Badge<GMenuItem>, GMenuItem&); + +private: + GAction(const StringView& text, Function<void(GAction&)> = nullptr, GWidget* = nullptr); + GAction(const StringView& text, const GShortcut&, Function<void(GAction&)> = nullptr, GWidget* = nullptr); + GAction(const StringView& text, const GShortcut&, RefPtr<GraphicsBitmap>&& icon, Function<void(GAction&)> = nullptr, GWidget* = nullptr); + GAction(const StringView& text, RefPtr<GraphicsBitmap>&& icon, Function<void(GAction&)> = nullptr, GWidget* = nullptr); + GAction(const StringView& text, const StringView& custom_data = StringView(), Function<void(GAction&)> = nullptr, GWidget* = nullptr); + + template<typename Callback> + void for_each_toolbar_button(Callback); + template<typename Callback> + void for_each_menu_item(Callback); + + String m_text; + String m_custom_data; + RefPtr<GraphicsBitmap> m_icon; + GShortcut m_shortcut; + bool m_enabled { true }; + bool m_checkable { false }; + bool m_checked { false }; + ShortcutScope m_scope { ShortcutScope::None }; + + HashTable<GButton*> m_buttons; + HashTable<GMenuItem*> m_menu_items; + WeakPtr<GWidget> m_widget; +}; |