GMenu.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <LibGUI/GMenu.h>
  2. #include <LibC/gui.h>
  3. #include <AK/HashMap.h>
  4. static HashMap<int, GMenu*>& all_menus()
  5. {
  6. static HashMap<int, GMenu*>* map;
  7. if (!map)
  8. map = new HashMap<int, GMenu*>();
  9. return *map;
  10. }
  11. GMenu* GMenu::from_menu_id(int menu_id)
  12. {
  13. auto it = all_menus().find(menu_id);
  14. if (it == all_menus().end())
  15. return nullptr;
  16. return (*it).value;
  17. }
  18. GMenu::GMenu(const String& name)
  19. : m_name(name)
  20. {
  21. }
  22. GMenu::~GMenu()
  23. {
  24. if (m_menu_id) {
  25. all_menus().remove(m_menu_id);
  26. gui_menu_destroy(m_menu_id);
  27. m_menu_id = 0;
  28. }
  29. }
  30. void GMenu::add_item(unsigned identifier, const String& text)
  31. {
  32. m_items.append({ identifier, text });
  33. }
  34. void GMenu::add_separator()
  35. {
  36. m_items.append(GMenuItem(GMenuItem::Separator));
  37. }
  38. int GMenu::realize_menu()
  39. {
  40. m_menu_id = gui_menu_create(m_name.characters());
  41. ASSERT(m_menu_id > 0);
  42. for (auto& item : m_items) {
  43. if (item.type() == GMenuItem::Separator)
  44. gui_menu_add_separator(m_menu_id);
  45. else if (item.type() == GMenuItem::Text)
  46. gui_menu_add_item(m_menu_id, item.identifier(), item.text().characters());
  47. }
  48. all_menus().set(m_menu_id, this);
  49. return m_menu_id;
  50. }