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 "MenuItem.h"
8#include "ConnectionFromClient.h"
9#include "Menu.h"
10#include "WindowManager.h"
11#include <LibGfx/Bitmap.h>
12
13namespace WindowServer {
14
15MenuItem::MenuItem(Menu& menu, unsigned identifier, DeprecatedString const& text, DeprecatedString const& shortcut_text, bool enabled, bool visible, bool checkable, bool checked, Gfx::Bitmap const* icon)
16 : m_menu(menu)
17 , m_type(Text)
18 , m_enabled(enabled)
19 , m_visible(visible)
20 , m_checkable(checkable)
21 , m_checked(checked)
22 , m_identifier(identifier)
23 , m_text(text)
24 , m_shortcut_text(shortcut_text)
25 , m_icon(icon)
26{
27 menu.invalidate_menu_window();
28}
29
30MenuItem::MenuItem(Menu& menu, Type type)
31 : m_menu(menu)
32 , m_type(type)
33{
34}
35
36void MenuItem::set_enabled(bool enabled)
37{
38 if (m_enabled == enabled)
39 return;
40 m_enabled = enabled;
41 m_menu.redraw();
42}
43
44void MenuItem::set_visible(bool visible)
45{
46 if (m_visible == visible)
47 return;
48 m_visible = visible;
49 m_menu.invalidate_menu_window();
50}
51
52void MenuItem::set_checked(bool checked)
53{
54 if (m_checked == checked)
55 return;
56 m_checked = checked;
57 m_menu.redraw();
58}
59
60void MenuItem::set_default(bool is_default)
61{
62 if (m_default == is_default)
63 return;
64 m_default = is_default;
65 m_menu.redraw();
66}
67
68Menu* MenuItem::submenu()
69{
70 VERIFY(is_submenu());
71 VERIFY(m_menu.client());
72 return m_menu.client()->find_menu_by_id(m_submenu_id);
73}
74
75Menu const* MenuItem::submenu() const
76{
77 VERIFY(is_submenu());
78 VERIFY(m_menu.client());
79 return m_menu.client()->find_menu_by_id(m_submenu_id);
80}
81
82Gfx::IntRect MenuItem::rect() const
83{
84 if (!m_menu.is_scrollable())
85 return m_rect;
86 return m_rect.translated(0, m_menu.item_height() - (m_menu.scroll_offset() * m_menu.item_height()));
87}
88
89void MenuItem::set_icon(Gfx::Bitmap const* icon)
90{
91 if (m_icon == icon)
92 return;
93 m_icon = icon;
94 m_menu.redraw();
95}
96
97}