Serenity Operating System
at master 99 lines 2.4 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibGUI/Action.h> 8#include <LibGUI/ConnectionToWindowServer.h> 9#include <LibGUI/Menu.h> 10#include <LibGUI/MenuItem.h> 11 12namespace GUI { 13 14MenuItem::MenuItem(unsigned menu_id, Type type) 15 : m_type(type) 16 , m_menu_id(menu_id) 17{ 18} 19 20MenuItem::MenuItem(unsigned menu_id, NonnullRefPtr<Action> action) 21 : m_type(Type::Action) 22 , m_menu_id(menu_id) 23 , m_action(move(action)) 24{ 25 m_action->register_menu_item({}, *this); 26 m_enabled = m_action->is_enabled(); 27 m_checkable = m_action->is_checkable(); 28 if (m_checkable) 29 m_checked = m_action->is_checked(); 30} 31 32MenuItem::MenuItem(unsigned menu_id, NonnullRefPtr<Menu> submenu) 33 : m_type(Type::Submenu) 34 , m_menu_id(menu_id) 35 , m_submenu(move(submenu)) 36{ 37} 38 39MenuItem::~MenuItem() 40{ 41 if (m_action) 42 m_action->unregister_menu_item({}, *this); 43} 44 45void MenuItem::set_enabled(bool enabled) 46{ 47 if (m_enabled == enabled) 48 return; 49 m_enabled = enabled; 50 update_window_server(); 51} 52 53void MenuItem::set_visible(bool visible) 54{ 55 if (m_visible == visible) 56 return; 57 m_visible = visible; 58 update_window_server(); 59} 60 61void MenuItem::set_checked(bool checked) 62{ 63 VERIFY(is_checkable()); 64 if (m_checked == checked) 65 return; 66 m_checked = checked; 67 update_window_server(); 68} 69 70void MenuItem::set_default(bool is_default) 71{ 72 VERIFY(is_checkable()); 73 if (m_default == is_default) 74 return; 75 m_default = is_default; 76 update_window_server(); 77} 78 79void MenuItem::update_window_server() 80{ 81 if (m_menu_id < 0) 82 return; 83 auto& action = *m_action; 84 auto shortcut_text = action.shortcut().is_valid() ? action.shortcut().to_deprecated_string() : DeprecatedString(); 85 auto icon = action.icon() ? action.icon()->to_shareable_bitmap() : Gfx::ShareableBitmap(); 86 ConnectionToWindowServer::the().async_update_menu_item(m_menu_id, m_identifier, -1, action.text(), action.is_enabled(), action.is_visible(), action.is_checkable(), action.is_checkable() ? action.is_checked() : false, m_default, shortcut_text, icon); 87} 88 89void MenuItem::set_menu_id(Badge<Menu>, unsigned int menu_id) 90{ 91 m_menu_id = menu_id; 92} 93 94void MenuItem::set_identifier(Badge<Menu>, unsigned identifier) 95{ 96 m_identifier = identifier; 97} 98 99}