GAction.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include <LibGUI/GAction.h>
  2. #include <LibGUI/GActionGroup.h>
  3. #include <LibGUI/GApplication.h>
  4. #include <LibGUI/GButton.h>
  5. #include <LibGUI/GMenuItem.h>
  6. GAction::GAction(const StringView& text, Function<void(GAction&)> on_activation_callback, GWidget* widget)
  7. : on_activation(move(on_activation_callback))
  8. , m_text(text)
  9. , m_widget(widget ? widget->make_weak_ptr() : nullptr)
  10. {
  11. }
  12. GAction::GAction(const StringView& text, RefPtr<GraphicsBitmap>&& icon, Function<void(GAction&)> on_activation_callback, GWidget* widget)
  13. : on_activation(move(on_activation_callback))
  14. , m_text(text)
  15. , m_icon(move(icon))
  16. , m_widget(widget ? widget->make_weak_ptr() : nullptr)
  17. {
  18. }
  19. GAction::GAction(const StringView& text, const GShortcut& shortcut, Function<void(GAction&)> on_activation_callback, GWidget* widget)
  20. : GAction(text, shortcut, nullptr, move(on_activation_callback), widget)
  21. {
  22. }
  23. GAction::GAction(const StringView& text, const GShortcut& shortcut, RefPtr<GraphicsBitmap>&& icon, Function<void(GAction&)> on_activation_callback, GWidget* widget)
  24. : on_activation(move(on_activation_callback))
  25. , m_text(text)
  26. , m_icon(move(icon))
  27. , m_shortcut(shortcut)
  28. , m_widget(widget ? widget->make_weak_ptr() : nullptr)
  29. {
  30. if (m_widget) {
  31. m_scope = ShortcutScope::WidgetLocal;
  32. m_widget->register_local_shortcut_action({}, *this);
  33. } else {
  34. m_scope = ShortcutScope::ApplicationGlobal;
  35. GApplication::the().register_global_shortcut_action({}, *this);
  36. }
  37. }
  38. GAction::~GAction()
  39. {
  40. if (m_shortcut.is_valid() && m_scope == ShortcutScope::ApplicationGlobal)
  41. GApplication::the().unregister_global_shortcut_action({}, *this);
  42. if (m_widget && m_scope == ShortcutScope::WidgetLocal)
  43. m_widget->unregister_local_shortcut_action({}, *this);
  44. }
  45. void GAction::activate()
  46. {
  47. if (on_activation)
  48. on_activation(*this);
  49. }
  50. void GAction::register_button(Badge<GButton>, GButton& button)
  51. {
  52. m_buttons.set(&button);
  53. }
  54. void GAction::unregister_button(Badge<GButton>, GButton& button)
  55. {
  56. m_buttons.remove(&button);
  57. }
  58. void GAction::register_menu_item(Badge<GMenuItem>, GMenuItem& menu_item)
  59. {
  60. m_menu_items.set(&menu_item);
  61. }
  62. void GAction::unregister_menu_item(Badge<GMenuItem>, GMenuItem& menu_item)
  63. {
  64. m_menu_items.remove(&menu_item);
  65. }
  66. template<typename Callback>
  67. void GAction::for_each_toolbar_button(Callback callback)
  68. {
  69. for (auto& it : m_buttons)
  70. callback(*it);
  71. }
  72. template<typename Callback>
  73. void GAction::for_each_menu_item(Callback callback)
  74. {
  75. for (auto& it : m_menu_items)
  76. callback(*it);
  77. }
  78. void GAction::set_enabled(bool enabled)
  79. {
  80. if (m_enabled == enabled)
  81. return;
  82. m_enabled = enabled;
  83. for_each_toolbar_button([enabled](GButton& button) {
  84. button.set_enabled(enabled);
  85. });
  86. for_each_menu_item([enabled](GMenuItem& item) {
  87. item.set_enabled(enabled);
  88. });
  89. }
  90. void GAction::set_checked(bool checked)
  91. {
  92. if (m_checked == checked)
  93. return;
  94. m_checked = checked;
  95. if (m_checked && m_action_group) {
  96. m_action_group->for_each_action([this](auto& other_action) {
  97. if (this == &other_action)
  98. return IterationDecision::Continue;
  99. if (other_action.is_checkable())
  100. other_action.set_checked(false);
  101. return IterationDecision::Continue;
  102. });
  103. }
  104. for_each_toolbar_button([checked](GButton& button) {
  105. button.set_checked(checked);
  106. });
  107. for_each_menu_item([checked](GMenuItem& item) {
  108. item.set_checked(checked);
  109. });
  110. }
  111. void GAction::set_group(Badge<GActionGroup>, GActionGroup* group)
  112. {
  113. m_action_group = group ? group->make_weak_ptr() : nullptr;
  114. }