Serenity Operating System
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}