#pragma once #include #include #include #include #include "WSMenuItem.h" class WSMenuBar; class WSMessage; class WSWindow; class Font; class Process; class WSMenu { public: WSMenu(Process&, int menu_id, String&& name); ~WSMenu(); int menu_id() const { return m_menu_id; } const Process* process() const { return m_process.ptr(); } WSMenuBar* menu_bar() { return m_menubar; } const WSMenuBar* menu_bar() const { return m_menubar; } bool is_empty() const { return m_items.is_empty(); } int item_count() const { return m_items.size(); } WSMenuItem* item(int i) { return m_items[i].ptr(); } const WSMenuItem* item(int i) const { return m_items[i].ptr(); } void add_item(OwnPtr&& item) { m_items.append(move(item)); } String name() const { return m_name; } template void for_each_item(Callback callback) const { for (auto& item : m_items) callback(*item); } Rect text_rect_in_menubar() const { return m_text_rect_in_menubar; } void set_text_rect_in_menubar(const Rect& rect) { m_text_rect_in_menubar = rect; } Rect rect_in_menubar() const { return m_rect_in_menubar; } void set_rect_in_menubar(const Rect& rect) { m_rect_in_menubar = rect; } WSWindow* menu_window() { return m_menu_window.ptr(); } void set_menu_window(OwnPtr&&); WSWindow& ensure_menu_window(); int width() const; int height() const; int item_height() const { return 16; } int vertical_padding() const { return 4; } int horizontal_padding() const { return left_padding() + right_padding(); } int left_padding() const { return 14; } int right_padding() const { return 14; } void on_window_message(WSMessage&); void draw(); const Font& font() const; WSMenuItem* item_at(const Point&); void redraw(); const WSMenuItem* hovered_item() const { return m_hovered_item; } void clear_hovered_item(); Function on_item_activation; void close(); private: void did_activate(WSMenuItem&); int m_menu_id { 0 }; String m_name; Rect m_rect_in_menubar; Rect m_text_rect_in_menubar; WSMenuBar* m_menubar { nullptr }; WSMenuItem* m_hovered_item { nullptr }; Vector> m_items; OwnPtr m_menu_window; WeakPtr m_process; };