MenuItem.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibGUI/Action.h>
  7. #include <LibGUI/ConnectionToWindowServer.h>
  8. #include <LibGUI/Menu.h>
  9. #include <LibGUI/MenuItem.h>
  10. namespace GUI {
  11. MenuItem::MenuItem(unsigned menu_id, Type type)
  12. : m_type(type)
  13. , m_menu_id(menu_id)
  14. {
  15. }
  16. MenuItem::MenuItem(unsigned menu_id, NonnullRefPtr<Action> action)
  17. : m_type(Type::Action)
  18. , m_menu_id(menu_id)
  19. , m_action(move(action))
  20. {
  21. m_action->register_menu_item({}, *this);
  22. m_enabled = m_action->is_enabled();
  23. m_checkable = m_action->is_checkable();
  24. if (m_checkable)
  25. m_checked = m_action->is_checked();
  26. }
  27. MenuItem::MenuItem(unsigned menu_id, NonnullRefPtr<Menu> submenu)
  28. : m_type(Type::Submenu)
  29. , m_menu_id(menu_id)
  30. , m_submenu(move(submenu))
  31. {
  32. }
  33. MenuItem::~MenuItem()
  34. {
  35. if (m_action)
  36. m_action->unregister_menu_item({}, *this);
  37. }
  38. void MenuItem::set_enabled(bool enabled)
  39. {
  40. if (m_enabled == enabled)
  41. return;
  42. m_enabled = enabled;
  43. update_window_server();
  44. }
  45. void MenuItem::set_visible(bool visible)
  46. {
  47. if (m_visible == visible)
  48. return;
  49. m_visible = visible;
  50. update_window_server();
  51. }
  52. void MenuItem::set_checked(bool checked)
  53. {
  54. VERIFY(is_checkable());
  55. if (m_checked == checked)
  56. return;
  57. m_checked = checked;
  58. update_window_server();
  59. }
  60. void MenuItem::set_default(bool is_default)
  61. {
  62. VERIFY(is_checkable());
  63. if (m_default == is_default)
  64. return;
  65. m_default = is_default;
  66. update_window_server();
  67. }
  68. void MenuItem::update_window_server()
  69. {
  70. if (m_menu_id < 0)
  71. return;
  72. switch (m_type) {
  73. case MenuItem::Type::Action: {
  74. auto& action = *m_action;
  75. auto shortcut_text = action.shortcut().is_valid() ? action.shortcut().to_deprecated_string() : DeprecatedString();
  76. auto icon = action.icon() ? action.icon()->to_shareable_bitmap() : Gfx::ShareableBitmap();
  77. ConnectionToWindowServer::the().async_update_menu_item(m_menu_id, m_identifier, -1, action.text(), action.is_enabled(), action.is_visible(), action.is_checkable(), action.is_checkable() ? action.is_checked() : false, m_default, shortcut_text, icon);
  78. break;
  79. }
  80. case MenuItem::Type::Submenu: {
  81. auto& submenu = *m_submenu;
  82. auto icon = submenu.icon() ? submenu.icon()->to_shareable_bitmap() : Gfx::ShareableBitmap();
  83. ConnectionToWindowServer::the().async_update_menu_item(m_menu_id, m_identifier, submenu.menu_id(), submenu.name(), m_enabled, m_visible, false, false, m_default, "", icon);
  84. break;
  85. }
  86. default:
  87. VERIFY_NOT_REACHED();
  88. }
  89. }
  90. void MenuItem::set_menu_id(Badge<Menu>, unsigned int menu_id)
  91. {
  92. m_menu_id = menu_id;
  93. }
  94. void MenuItem::set_identifier(Badge<Menu>, unsigned identifier)
  95. {
  96. m_identifier = identifier;
  97. }
  98. }