GAction.cpp 3.4 KB

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