GMenuItem.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <LibGUI/GAction.h>
  2. #include <LibGUI/GMenu.h>
  3. #include <LibGUI/GMenuItem.h>
  4. #include <LibGUI/GWindowServerConnection.h>
  5. GMenuItem::GMenuItem(unsigned menu_id, Type type)
  6. : m_type(type)
  7. , m_menu_id(menu_id)
  8. {
  9. }
  10. GMenuItem::GMenuItem(unsigned menu_id, NonnullRefPtr<GAction>&& action)
  11. : m_type(Action)
  12. , m_menu_id(menu_id)
  13. , m_action(move(action))
  14. {
  15. m_action->register_menu_item({}, *this);
  16. m_enabled = m_action->is_enabled();
  17. m_checkable = m_action->is_checkable();
  18. if (m_checkable)
  19. m_checked = m_action->is_checked();
  20. }
  21. GMenuItem::GMenuItem(unsigned menu_id, NonnullOwnPtr<GMenu>&& submenu)
  22. : m_type(Submenu)
  23. , m_menu_id(menu_id)
  24. , m_submenu(move(submenu))
  25. {
  26. }
  27. GMenuItem::~GMenuItem()
  28. {
  29. if (m_action)
  30. m_action->unregister_menu_item({}, *this);
  31. }
  32. void GMenuItem::set_enabled(bool enabled)
  33. {
  34. if (m_enabled == enabled)
  35. return;
  36. m_enabled = enabled;
  37. update_window_server();
  38. }
  39. void GMenuItem::set_checked(bool checked)
  40. {
  41. ASSERT(is_checkable());
  42. if (m_checked == checked)
  43. return;
  44. m_checked = checked;
  45. update_window_server();
  46. }
  47. void GMenuItem::update_window_server()
  48. {
  49. if (m_menu_id < 0)
  50. return;
  51. auto& action = *m_action;
  52. GWindowServerConnection::the().send_sync<WindowServer::UpdateMenuItem>(m_menu_id, m_identifier, -1, action.text(), action.is_enabled(), action.is_checkable(), action.is_checkable() ? action.is_checked() : false, action.shortcut().to_string());
  53. }