annotate foosdk/sdk/foobar2000/SDK/menu.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "menu_common.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 class NOVTABLE mainmenu_group : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(mainmenu_group);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 virtual GUID get_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 virtual GUID get_parent() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 virtual t_uint32 get_sort_priority() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 class NOVTABLE mainmenu_group_popup : public mainmenu_group {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 FB2K_MAKE_SERVICE_INTERFACE(mainmenu_group_popup, mainmenu_group);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 virtual void get_display_string(pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 void get_name(pfc::string_base & out) {get_display_string(out);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! \since 1.4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 //! Allows you to control whether to render the group as a popup or inline.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 class NOVTABLE mainmenu_group_popup_v2 : public mainmenu_group_popup {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 FB2K_MAKE_SERVICE_INTERFACE(mainmenu_group_popup_v2, mainmenu_group_popup);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 virtual bool popup_condition() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 class NOVTABLE mainmenu_commands : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 static constexpr uint32_t
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 flag_disabled = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 flag_checked = 1 << 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 flag_radiochecked = 1 << 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 //! Replaces the old return-false-from-get_display() behavior - use this to make your command hidden by default but accessible when holding shift.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 flag_defaulthidden = 1 << 3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 sort_priority_base = 0x10000,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 sort_priority_dontcare = 0x80000000u,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 sort_priority_last = UINT32_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 //! Retrieves number of implemented commands. Index parameter of other methods must be in 0....command_count-1 range.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 virtual t_uint32 get_command_count() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! Retrieves GUID of specified command.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 virtual GUID get_command(t_uint32 p_index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 //! Retrieves name of item, for list of commands to assign keyboard shortcuts to etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 virtual void get_name(t_uint32 p_index,pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 //! Retrieves item's description for statusbar etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 virtual bool get_description(t_uint32 p_index,pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 //! Retrieves GUID of owning menu group.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 virtual GUID get_parent() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! Retrieves sorting priority of the command; the lower the number, the upper in the menu your commands will appear. Third party components should use sorting_priority_base and up (values below are reserved for internal use). In case of equal priority, order is undefined.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 virtual t_uint32 get_sort_priority() {return sort_priority_dontcare;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! Retrieves display string and display flags to use when menu is about to be displayed. If returns false, menu item won't be displayed. You can create keyboard-shortcut-only commands by always returning false from get_display().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 virtual bool get_display(t_uint32 p_index,pfc::string_base & p_text,t_uint32 & p_flags) {p_flags = 0;get_name(p_index,p_text);return true;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 typedef service_ptr ctx_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 //! Executes the command. p_callback parameter is reserved for future use and should be ignored / set to null pointer.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 virtual void execute(t_uint32 p_index,ctx_t p_callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 static bool g_execute(const GUID & p_guid,service_ptr_t<service_base> p_callback = NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 static bool g_execute_dynamic(const GUID & p_guid, const GUID & p_subGuid,service_ptr_t<service_base> p_callback = NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 static bool g_find_by_name(const char * p_name,GUID & p_guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(mainmenu_commands);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 class NOVTABLE mainmenu_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 flag_show_shortcuts = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 flag_show_shortcuts_global = 1 << 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 //! To control which commands are shown, you should specify either flag_view_reduced or flag_view_full. If neither is specified, the implementation will decide automatically based on shift key being pressed, for backwards compatibility.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 flag_view_reduced = 1 << 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 //! To control which commands are shown, you should specify either flag_view_reduced or flag_view_full. If neither is specified, the implementation will decide automatically based on shift key being pressed, for backwards compatibility.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 flag_view_full = 1 << 3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 virtual void instantiate(const GUID & p_root) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 virtual void generate_menu_win32(fb2k::hmenu_t p_menu,t_uint32 p_id_base,t_uint32 p_id_count,t_uint32 p_flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 #endif // _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 //@param p_id Identifier of command to execute, relative to p_id_base of generate_menu_*()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 //@returns true if command was executed successfully, false if not (e.g. command with given identifier not found).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 virtual bool execute_command(t_uint32 p_id,service_ptr_t<service_base> p_callback = service_ptr_t<service_base>()) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 virtual bool get_description(t_uint32 p_id,pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 //! Safely prevent destruction from worker threads (some components attempt that).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 static bool serviceRequiresMainThreadDestructor() { return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 FB2K_MAKE_SERVICE_COREAPI(mainmenu_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 class mainmenu_manager_v2 : public mainmenu_manager {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(mainmenu_manager_v2, mainmenu_manager)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 virtual menu_tree_item::ptr generate_menu(uint32_t flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 class mainmenu_groups {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 static const GUID file,view,edit,playback,library,help;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 static const GUID file_open,file_add,file_playlist,file_etc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 static const GUID playback_controls,playback_etc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 static const GUID view_visualisations, view_alwaysontop, view_dsp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 static const GUID edit_part1,edit_part2,edit_part3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 static const GUID edit_part2_selection,edit_part2_sort,edit_part2_selection_sort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 static const GUID file_etc_preferences, file_etc_exit;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 static const GUID help_about;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 static const GUID library_refresh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 enum {priority_edit_part1,priority_edit_part2,priority_edit_part3};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 enum {priority_edit_part2_commands,priority_edit_part2_selection,priority_edit_part2_sort};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 enum {priority_edit_part2_selection_commands,priority_edit_part2_selection_sort};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 enum {priority_file_open,priority_file_add,priority_file_playlist,priority_file_etc = mainmenu_commands::sort_priority_last};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 class mainmenu_group_impl : public mainmenu_group {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 mainmenu_group_impl(const GUID & p_guid,const GUID & p_parent,t_uint32 p_priority) : m_guid(p_guid), m_parent(p_parent), m_priority(p_priority) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 GUID get_guid() {return m_guid;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 GUID get_parent() {return m_parent;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 t_uint32 get_sort_priority() {return m_priority;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 GUID m_guid,m_parent; t_uint32 m_priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 class mainmenu_group_popup_impl : public mainmenu_group_popup {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 mainmenu_group_popup_impl(const GUID & p_guid,const GUID & p_parent,t_uint32 p_priority,const char * p_name) : m_guid(p_guid), m_parent(p_parent), m_priority(p_priority), m_name(p_name) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 GUID get_guid() {return m_guid;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 GUID get_parent() {return m_parent;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 t_uint32 get_sort_priority() {return m_priority;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 void get_display_string(pfc::string_base & p_out) {p_out = m_name;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 GUID m_guid,m_parent; t_uint32 m_priority; pfc::string8 m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 typedef service_factory_single_t<mainmenu_group_impl> _mainmenu_group_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 typedef service_factory_single_t<mainmenu_group_popup_impl> _mainmenu_group_popup_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 class mainmenu_group_factory : public _mainmenu_group_factory {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 mainmenu_group_factory(const GUID & p_guid,const GUID & p_parent,t_uint32 p_priority) : _mainmenu_group_factory(p_guid,p_parent,p_priority) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 class mainmenu_group_popup_factory : public _mainmenu_group_popup_factory {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 mainmenu_group_popup_factory(const GUID & p_guid,const GUID & p_parent,t_uint32 p_priority,const char * p_name) : _mainmenu_group_popup_factory(p_guid,p_parent,p_priority,p_name) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 #define FB2K_DECLARE_MAINMENU_GROUP( guid, parent, priority, name ) FB2K_SERVICE_FACTORY_PARAMS(mainmenu_group_impl, guid, parent, priority, name );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 #define FB2K_DECLARE_MAINMENU_GROUP_POPUP( guid, parent, priority, name ) FB2K_SERVICE_FACTORY_PARAMS(mainmenu_group_popup_impl, guid, parent, priority, name );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 class mainmenu_commands_factory_t : public service_factory_single_t<T> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 class NOVTABLE mainmenu_node : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 FB2K_MAKE_SERVICE_INTERFACE(mainmenu_node, service_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 enum { //same as contextmenu_item_node::t_type
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 type_group,type_command,type_separator
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 virtual t_uint32 get_type() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 virtual void get_display(pfc::string_base & text, t_uint32 & flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 //! Valid only if type is type_group.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 virtual t_size get_children_count() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 //! Valid only if type is type_group.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 virtual ptr get_child(t_size index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 //! Valid only if type is type_command.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 virtual void execute(service_ptr_t<service_base> callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 //! Valid only if type is type_command.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 virtual GUID get_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 //! Valid only if type is type_command.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 virtual bool get_description(pfc::string_base& out) { (void)out; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 class mainmenu_node_separator : public mainmenu_node {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 t_uint32 get_type() override {return type_separator;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 void get_display(pfc::string_base & text, t_uint32 & flags) override {text = ""; flags = 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 t_size get_children_count() override {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 ptr get_child(t_size index) override { (void)index; throw pfc::exception_invalid_params(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 void execute(service_ptr_t<service_base>) override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 GUID get_guid() override {return pfc::guid_null;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 class mainmenu_node_command : public mainmenu_node {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 t_uint32 get_type() override {return type_command;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 t_size get_children_count() override {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 ptr get_child(t_size index) override { (void)index; throw pfc::exception_invalid_params(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 void get_display(pfc::string_base & text, t_uint32 & flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 void execute(service_ptr_t<service_base> callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 GUID get_guid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 bool get_description(pfc::string_base & out) {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 class mainmenu_node_group : public mainmenu_node {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 t_uint32 get_type() override {return type_group;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 void execute(service_ptr_t<service_base> callback) override { (void)callback; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 GUID get_guid() override {return pfc::guid_null;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 void get_display(pfc::string_base & text, t_uint32 & flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 t_size get_children_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 ptr get_child(t_size index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 class NOVTABLE mainmenu_commands_v2 : public mainmenu_commands {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 FB2K_MAKE_SERVICE_INTERFACE(mainmenu_commands_v2, mainmenu_commands)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 virtual bool is_command_dynamic(t_uint32 index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 //! Valid only when is_command_dynamic() returns true. Behavior undefined otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 virtual mainmenu_node::ptr dynamic_instantiate(t_uint32 index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 //! Default fallback implementation provided.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 virtual bool dynamic_execute(t_uint32 index, const GUID & subID, service_ptr_t<service_base> callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 //! Introduces callbacks to monitor menu items that act like check boxes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 class NOVTABLE mainmenu_commands_v3 : public mainmenu_commands_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 FB2K_MAKE_SERVICE_INTERFACE(mainmenu_commands_v3, mainmenu_commands_v2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 class state_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 //! @param main Command ID
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 //! @param sub Reserved for future use.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 virtual void menu_state_changed(const GUID& main, const GUID& sub) { (void)main; (void)sub; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 state_callback() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 state_callback(state_callback const&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 void operator=(state_callback const&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 //! Return POSSIBLE values of display flags for this item, specifically flag_checked and flag_radiochecked if this item ever uses such.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 //! @param subCmd Subcommand ID reserved for future use. Dynamic commands aren't meant to fire callbacks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 virtual uint32_t allowed_check_flags(uint32_t idx, const GUID& subCmd) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 virtual void add_state_callback(state_callback*) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 virtual void remove_state_callback(state_callback*) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 };