mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-23 21:15:14 +00:00
WindowServer: More work on the menu system.
Menus are now tied to a Process (by WeakPtr.) This will allow us to pass notifications to the correct event stream.
This commit is contained in:
parent
133706d697
commit
15b4c9f9f1
Notes:
sideshowbarker
2024-07-19 15:46:55 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/15b4c9f9f11
7 changed files with 43 additions and 39 deletions
|
@ -79,7 +79,13 @@ int main(int argc, char** argv)
|
|||
app_menu->add_item(1, "Quit");
|
||||
menubar->add_menu(move(app_menu));
|
||||
|
||||
auto help_menu = make<GMenu>("?");
|
||||
auto font_menu = make<GMenu>("Font");
|
||||
font_menu->add_item(30, "Liza 8x10");
|
||||
font_menu->add_item(31, "LizaRegular 8x10");
|
||||
font_menu->add_item(32, "LizaBold 8x10");
|
||||
menubar->add_menu(move(font_menu));
|
||||
|
||||
auto help_menu = make<GMenu>("Help");
|
||||
help_menu->add_item(2, "About");
|
||||
menubar->add_menu(move(help_menu));
|
||||
|
||||
|
|
|
@ -7,9 +7,10 @@
|
|||
#include <SharedGraphics/Painter.h>
|
||||
#include <SharedGraphics/Font.h>
|
||||
|
||||
WSMenu::WSMenu(int menu_id, String&& name)
|
||||
WSMenu::WSMenu(Process& process, int menu_id, String&& name)
|
||||
: m_menu_id(menu_id)
|
||||
, m_name(move(name))
|
||||
, m_process(process.make_weak_ptr())
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -88,7 +89,7 @@ void WSMenu::draw()
|
|||
if (item->type() == WSMenuItem::Text) {
|
||||
Color text_color = Color::Black;
|
||||
if (item.ptr() == m_hovered_item) {
|
||||
painter.fill_rect(item->rect(), Color(0, 0, 104));
|
||||
painter.fill_rect(item->rect(), WSWindowManager::the().menu_selection_color());
|
||||
text_color = Color::White;
|
||||
}
|
||||
painter.draw_text(item->rect().translated(left_padding(), 0), item->text(), TextAlignment::CenterLeft, text_color);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <AK/AKString.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <AK/WeakPtr.h>
|
||||
#include <SharedGraphics/Rect.h>
|
||||
#include "WSMenuItem.h"
|
||||
|
||||
|
@ -9,10 +10,11 @@ class WSMenuBar;
|
|||
class WSMessage;
|
||||
class WSWindow;
|
||||
class Font;
|
||||
class Process;
|
||||
|
||||
class WSMenu {
|
||||
public:
|
||||
WSMenu(int menu_id, String&& name);
|
||||
WSMenu(Process&, int menu_id, String&& name);
|
||||
~WSMenu();
|
||||
|
||||
int menu_id() const { return m_menu_id; }
|
||||
|
@ -80,5 +82,6 @@ private:
|
|||
WSMenuItem* m_hovered_item { nullptr };
|
||||
Vector<OwnPtr<WSMenuItem>> m_items;
|
||||
OwnPtr<WSWindow> m_menu_window;
|
||||
WeakPtr<Process> m_process;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
#include "WSMenuBar.h"
|
||||
#include "WSMenu.h"
|
||||
#include "WSMenuItem.h"
|
||||
#include <Kernel/Process.h>
|
||||
|
||||
WSMenuBar::WSMenuBar()
|
||||
WSMenuBar::WSMenuBar(Process& process)
|
||||
: m_process(process.make_weak_ptr())
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -2,10 +2,13 @@
|
|||
|
||||
#include "WSMenu.h"
|
||||
#include <AK/Vector.h>
|
||||
#include <AK/WeakPtr.h>
|
||||
|
||||
class Process;
|
||||
|
||||
class WSMenuBar {
|
||||
public:
|
||||
WSMenuBar();
|
||||
explicit WSMenuBar(Process&);
|
||||
~WSMenuBar();
|
||||
|
||||
void add_menu(WSMenu* menu) { m_menus.append(menu); }
|
||||
|
@ -20,5 +23,6 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
WeakPtr<Process> m_process;
|
||||
Vector<WSMenu*> m_menus;
|
||||
};
|
||||
|
|
|
@ -180,38 +180,21 @@ WSWindowManager::WSWindowManager()
|
|||
invalidate(m_screen_rect);
|
||||
});
|
||||
|
||||
m_menu_selection_color = Color(0x84351a);
|
||||
|
||||
{
|
||||
auto menubar = make<WSMenuBar>();
|
||||
|
||||
{
|
||||
byte system_menu_name[] = { 0xfc, 0 };
|
||||
auto& menu = create_menu(String((const char*)system_menu_name));
|
||||
menu.add_item(make<WSMenuItem>(0, "Launch Terminal"));
|
||||
menu.add_item(make<WSMenuItem>(WSMenuItem::Separator));
|
||||
menu.add_item(make<WSMenuItem>(1, "Hello again"));
|
||||
menu.add_item(make<WSMenuItem>(2, "To all my friends"));
|
||||
menu.add_item(make<WSMenuItem>(3, "Together we can play some rock&roll"));
|
||||
menu.add_item(make<WSMenuItem>(WSMenuItem::Separator));
|
||||
menu.add_item(make<WSMenuItem>(4, "About..."));
|
||||
menu.on_item_activation = [] (WSMenuItem& item) {
|
||||
kprintf("WSMenu 1 item activated: '%s'\n", item.text().characters());
|
||||
};
|
||||
menubar->add_menu(&menu);
|
||||
}
|
||||
{
|
||||
auto& menu = create_menu("Dummy");
|
||||
menu.add_item(make<WSMenuItem>(5, "Foo."));
|
||||
menu.add_item(make<WSMenuItem>(6, "Bar?"));
|
||||
menu.add_item(make<WSMenuItem>(7, "Baz!"));
|
||||
menu.on_item_activation = [] (WSMenuItem& item) {
|
||||
kprintf("WSMenu 2 item activated: '%s'\n", item.text().characters());
|
||||
};
|
||||
menubar->add_menu(&menu);
|
||||
}
|
||||
|
||||
set_current_menubar(menubar.ptr());
|
||||
m_menubars.set(1, move(menubar));
|
||||
byte system_menu_name[] = { 0xfc, 0 };
|
||||
m_system_menu = make<WSMenu>(*current, -1, String((const char*)system_menu_name));
|
||||
m_system_menu->add_item(make<WSMenuItem>(0, "Launch Terminal"));
|
||||
m_system_menu->add_item(make<WSMenuItem>(WSMenuItem::Separator));
|
||||
m_system_menu->add_item(make<WSMenuItem>(1, "Hello again"));
|
||||
m_system_menu->add_item(make<WSMenuItem>(2, "To all my friends"));
|
||||
m_system_menu->add_item(make<WSMenuItem>(3, "Together we can play some rock&roll"));
|
||||
m_system_menu->add_item(make<WSMenuItem>(WSMenuItem::Separator));
|
||||
m_system_menu->add_item(make<WSMenuItem>(4, "About..."));
|
||||
m_system_menu->on_item_activation = [] (WSMenuItem& item) {
|
||||
kprintf("WSMenu 1 item activated: '%s'\n", item.text().characters());
|
||||
};
|
||||
}
|
||||
|
||||
invalidate();
|
||||
|
@ -630,7 +613,7 @@ void WSWindowManager::draw_menubar()
|
|||
m_current_menubar->for_each_menu([&] (WSMenu& menu) {
|
||||
Color text_color = Color::Black;
|
||||
if (&menu == m_current_menu) {
|
||||
m_back_painter->fill_rect(menu.rect_in_menubar(), Color(0, 0, 104));
|
||||
m_back_painter->fill_rect(menu.rect_in_menubar(), menu_selection_color());
|
||||
text_color = Color::White;
|
||||
}
|
||||
m_back_painter->draw_text(menu.text_rect_in_menubar(), menu.name(), TextAlignment::CenterLeft, text_color);
|
||||
|
@ -769,14 +752,16 @@ void WSWindowManager::flush(const Rect& a_rect)
|
|||
|
||||
void WSWindowManager::close_menu(WSMenu& menu)
|
||||
{
|
||||
LOCKER(m_lock);
|
||||
ASSERT(m_current_menu == &menu);
|
||||
close_current_menu();
|
||||
}
|
||||
|
||||
WSMenu& WSWindowManager::create_menu(String&& name)
|
||||
{
|
||||
LOCKER(m_lock);
|
||||
int menu_id = m_next_menu_id++;
|
||||
auto menu = make<WSMenu>(menu_id, move(name));
|
||||
auto menu = make<WSMenu>(*current, menu_id, move(name));
|
||||
auto* menu_ptr = menu.ptr();
|
||||
m_menus.set(menu_id, move(menu));
|
||||
return *menu_ptr;
|
||||
|
@ -786,7 +771,7 @@ WSMenu& WSWindowManager::create_menu(String&& name)
|
|||
int WSWindowManager::api$menubar_create()
|
||||
{
|
||||
LOCKER(m_lock);
|
||||
auto menubar = make<WSMenuBar>();
|
||||
auto menubar = make<WSMenuBar>(*current);
|
||||
int menubar_id = m_next_menubar_id++;
|
||||
m_menubars.set(menubar_id, move(menubar));
|
||||
return menubar_id;
|
||||
|
|
|
@ -52,6 +52,7 @@ public:
|
|||
const Font& font() const { return *m_font; }
|
||||
|
||||
void close_menu(WSMenu&);
|
||||
Color menu_selection_color() const { return m_menu_selection_color; }
|
||||
|
||||
int api$menubar_create();
|
||||
int api$menubar_destroy(int menubar_id);
|
||||
|
@ -141,6 +142,8 @@ private:
|
|||
int m_next_menubar_id = 100;
|
||||
int m_next_menu_id = 900;
|
||||
|
||||
OwnPtr<WSMenu> m_system_menu;
|
||||
Color m_menu_selection_color;
|
||||
WSMenuBar* m_current_menubar { nullptr };
|
||||
WSMenu* m_current_menu { nullptr };
|
||||
HashMap<int, OwnPtr<WSMenuBar>> m_menubars;
|
||||
|
|
Loading…
Add table
Reference in a new issue