mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 13:38:11 +00:00

I'm going with a global top-of-the-screen menu instead of per-window menus. The basic idea is that menus will live in the WindowServer and clients can create menus via WindowServer requests.
66 lines
1.7 KiB
C++
66 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include <AK/AKString.h>
|
|
#include <AK/Vector.h>
|
|
#include <SharedGraphics/Rect.h>
|
|
#include "WSMenuItem.h"
|
|
|
|
class WSMenuBar;
|
|
class WSMessage;
|
|
class WSWindow;
|
|
class Font;
|
|
|
|
class WSMenu {
|
|
public:
|
|
WSMenu(const String& name);
|
|
~WSMenu();
|
|
|
|
WSMenuBar* menu_bar() { return m_menubar; }
|
|
const WSMenuBar* menu_bar() const { return m_menubar; }
|
|
|
|
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<WSMenuItem>&& item) { m_items.append(move(item)); }
|
|
|
|
String name() const { return m_name; }
|
|
|
|
template<typename Callback>
|
|
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>&&);
|
|
|
|
WSWindow& ensure_menu_window();
|
|
|
|
int width() const;
|
|
int height() const;
|
|
|
|
int item_height() const { return 16; }
|
|
int padding() const { return 4; }
|
|
|
|
void on_window_message(WSMessage&);
|
|
void draw();
|
|
const Font& font() const;
|
|
|
|
private:
|
|
String m_name;
|
|
Rect m_rect_in_menubar;
|
|
Rect m_text_rect_in_menubar;
|
|
WSMenuBar* m_menubar { nullptr };
|
|
WSMenuItem* m_hovered_item { nullptr };
|
|
Vector<OwnPtr<WSMenuItem>> m_items;
|
|
OwnPtr<WSWindow> m_menu_window;
|
|
};
|
|
|