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#pragma once
8
9#include <AK/Badge.h>
10#include <AK/Forward.h>
11#include <AK/RefPtr.h>
12#include <LibGUI/Forward.h>
13
14namespace GUI {
15
16class MenuItem {
17public:
18 enum class Type {
19 Invalid,
20 Action,
21 Separator,
22 Submenu,
23 };
24
25 MenuItem(unsigned menu_id, Type);
26 MenuItem(unsigned menu_id, NonnullRefPtr<Action>);
27 MenuItem(unsigned menu_id, NonnullRefPtr<Menu>);
28 ~MenuItem();
29
30 Type type() const { return m_type; }
31
32 Action const* action() const { return m_action.ptr(); }
33 Action* action() { return m_action.ptr(); }
34 unsigned identifier() const { return m_identifier; }
35
36 Menu* submenu() { return m_submenu.ptr(); }
37 Menu const* submenu() const { return m_submenu.ptr(); }
38
39 bool is_checkable() const { return m_checkable; }
40 void set_checkable(bool checkable) { m_checkable = checkable; }
41
42 bool is_checked() const { return m_checked; }
43 void set_checked(bool);
44
45 bool is_enabled() const { return m_enabled; }
46 void set_enabled(bool);
47
48 bool is_visible() const { return m_visible; }
49 void set_visible(bool);
50
51 bool is_default() const { return m_default; }
52 void set_default(bool);
53
54 int menu_id() const { return m_menu_id; }
55 void set_menu_id(Badge<Menu>, unsigned menu_id);
56 void set_identifier(Badge<Menu>, unsigned identifier);
57
58 void update_from_action(Badge<Action>) { update_window_server(); }
59
60private:
61 void update_window_server();
62
63 Type m_type { Type::Invalid };
64 int m_menu_id { -1 };
65 unsigned m_identifier { 0 };
66 bool m_enabled { true };
67 bool m_visible { true };
68 bool m_checkable { false };
69 bool m_checked { false };
70 bool m_default { false };
71 RefPtr<Action> m_action;
72 RefPtr<Menu> m_submenu;
73};
74
75}