MenuManager.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include "Menu.h"
  8. #include "Menubar.h"
  9. #include "Window.h"
  10. #include <AK/HashMap.h>
  11. #include <AK/StringBuilder.h>
  12. namespace WindowServer {
  13. class MenuManager final : public Core::Object {
  14. C_OBJECT(MenuManager);
  15. public:
  16. static MenuManager& the();
  17. virtual ~MenuManager() override;
  18. bool is_open(const Menu&) const;
  19. bool has_open_menu() const { return !m_open_menu_stack.is_empty(); }
  20. Menu* current_menu() { return m_current_menu.ptr(); }
  21. void set_current_menu(Menu*);
  22. void clear_current_menu();
  23. void open_menu(Menu&, bool as_current_menu = true);
  24. void close_everyone();
  25. void close_everyone_not_in_lineage(Menu&);
  26. void close_menu_and_descendants(Menu&);
  27. void close_all_menus_from_client(Badge<ClientConnection>, ClientConnection&);
  28. int theme_index() const { return m_theme_index; }
  29. Menu* previous_menu(Menu* current);
  30. Menu* next_menu(Menu* current);
  31. void did_change_theme();
  32. void set_hovered_menu(Menu*);
  33. Menu* hovered_menu() { return m_hovered_menu; }
  34. private:
  35. MenuManager();
  36. void close_menus(Vector<Menu&>&);
  37. virtual void event(Core::Event&) override;
  38. void handle_mouse_event(MouseEvent&);
  39. void refresh();
  40. WeakPtr<Menu> m_current_menu;
  41. WeakPtr<Window> m_previous_input_window;
  42. Vector<WeakPtr<Menu>> m_open_menu_stack;
  43. int m_theme_index { 0 };
  44. WeakPtr<Menu> m_hovered_menu;
  45. };
  46. }