mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 15:48:12 +00:00
WindowServer: Add support for default MenuItem
This allows marking a MenuItem as a default action, e.g. in a context menu for an action that reflects what e.g. a double click would perform. Also enhance the window menu to mark the close action as the default, and when double clicked perform that action. Fixes #1289
This commit is contained in:
parent
684b04e02a
commit
fc4e01a3c9
10 changed files with 194 additions and 32 deletions
|
@ -405,7 +405,7 @@ void Window::request_update(const Gfx::IntRect& rect, bool ignore_occlusion)
|
|||
m_pending_paint_rects.add(rect);
|
||||
}
|
||||
|
||||
void Window::popup_window_menu(const Gfx::IntPoint& position)
|
||||
void Window::ensure_window_menu()
|
||||
{
|
||||
if (!m_window_menu) {
|
||||
m_window_menu = Menu::construct(nullptr, -1, "(Window Menu)");
|
||||
|
@ -422,7 +422,9 @@ void Window::popup_window_menu(const Gfx::IntPoint& position)
|
|||
m_window_menu->add_item(make<MenuItem>(*m_window_menu, MenuItem::Type::Separator));
|
||||
|
||||
auto close_item = make<MenuItem>(*m_window_menu, 3, "Close");
|
||||
close_item->set_icon(&close_icon());
|
||||
m_window_menu_close_item = close_item.ptr();
|
||||
m_window_menu_close_item->set_icon(&close_icon());
|
||||
m_window_menu_close_item->set_default(true);
|
||||
m_window_menu->add_item(move(close_item));
|
||||
|
||||
m_window_menu->item((int)PopupMenuItem::Minimize).set_enabled(m_minimizable);
|
||||
|
@ -447,12 +449,35 @@ void Window::popup_window_menu(const Gfx::IntPoint& position)
|
|||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
void Window::popup_window_menu(const Gfx::IntPoint& position, WindowMenuDefaultAction default_action)
|
||||
{
|
||||
ensure_window_menu();
|
||||
if (default_action == WindowMenuDefaultAction::BasedOnWindowState) {
|
||||
// When clicked on the task bar, determine the default action
|
||||
if (!is_active() && !is_minimized())
|
||||
default_action = WindowMenuDefaultAction::None;
|
||||
else if (is_minimized())
|
||||
default_action = WindowMenuDefaultAction::Unminimize;
|
||||
else
|
||||
default_action = WindowMenuDefaultAction::Minimize;
|
||||
}
|
||||
m_window_menu_minimize_item->set_default(default_action == WindowMenuDefaultAction::Minimize || default_action == WindowMenuDefaultAction::Unminimize);
|
||||
m_window_menu_minimize_item->set_icon(m_minimized ? nullptr : &minimize_icon());
|
||||
m_window_menu_maximize_item->set_default(default_action == WindowMenuDefaultAction::Maximize || default_action == WindowMenuDefaultAction::Restore);
|
||||
m_window_menu_maximize_item->set_icon(m_maximized ? &restore_icon() : &maximize_icon());
|
||||
m_window_menu_close_item->set_default(default_action == WindowMenuDefaultAction::Close);
|
||||
|
||||
m_window_menu->popup(position);
|
||||
}
|
||||
|
||||
void Window::window_menu_activate_default()
|
||||
{
|
||||
ensure_window_menu();
|
||||
m_window_menu->activate_default();
|
||||
}
|
||||
|
||||
void Window::request_close()
|
||||
{
|
||||
Event close_request(Event::WindowCloseRequest);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue