Serenity Operating System
at master 86 lines 2.3 kB view raw
1/* 2 * Copyright (c) 2018-2023, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/WeakPtr.h> 10#include <LibCore/Object.h> 11#include <LibGUI/Action.h> 12#include <LibGUI/ColorFilterer.h> 13#include <LibGUI/Event.h> 14#include <LibGUI/Forward.h> 15#include <LibGfx/Forward.h> 16 17namespace GUI { 18 19namespace CommonMenus { 20 21ErrorOr<NonnullRefPtr<Menu>> make_accessibility_menu(GUI::ColorFilterer&); 22 23}; 24 25class Menu final : public Core::Object { 26 C_OBJECT(Menu) 27public: 28 virtual ~Menu() override; 29 30 void realize_menu_if_needed(); 31 32 static Menu* from_menu_id(int); 33 int menu_id() const { return m_menu_id; } 34 35 DeprecatedString const& name() const { return m_name; } 36 Gfx::Bitmap const* icon() const { return m_icon.ptr(); } 37 void set_icon(Gfx::Bitmap const*); 38 39 Action* action_at(size_t); 40 41 ErrorOr<void> try_add_action(NonnullRefPtr<Action>); 42 ErrorOr<void> try_add_separator(); 43 ErrorOr<NonnullRefPtr<Menu>> try_add_submenu(DeprecatedString name); 44 45 void add_action(NonnullRefPtr<Action>); 46 void add_separator(); 47 Menu& add_submenu(DeprecatedString name); 48 void remove_all_actions(); 49 50 ErrorOr<void> add_recent_files_list(Function<void(Action&)>); 51 52 void popup(Gfx::IntPoint screen_position, RefPtr<Action> const& default_action = nullptr, Gfx::IntRect const& button_rect = {}); 53 void dismiss(); 54 55 void visibility_did_change(Badge<ConnectionToWindowServer>, bool visible); 56 57 void set_children_actions_enabled(bool enabled); 58 59 Function<void(bool)> on_visibility_change; 60 61 bool is_visible() const { return m_visible; } 62 63 Vector<NonnullOwnPtr<MenuItem>> const& items() const { return m_items; } 64 65private: 66 friend class Menubar; 67 68 explicit Menu(DeprecatedString name = ""); 69 70 int realize_menu(RefPtr<Action> default_action = nullptr); 71 void unrealize_menu(); 72 void realize_if_needed(RefPtr<Action> const& default_action); 73 74 void realize_menu_item(MenuItem&, int item_id); 75 76 int m_menu_id { -1 }; 77 DeprecatedString m_name; 78 RefPtr<Gfx::Bitmap const> m_icon; 79 Vector<NonnullOwnPtr<MenuItem>> m_items; 80 WeakPtr<Action> m_current_default_action; 81 bool m_visible { false }; 82 83 Function<void(Action&)> m_recent_files_callback; 84}; 85 86}