annotate foosdk/sdk/foobar2000/SDK/contextmenu.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 "metadb_handle.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //! Reserved for future use.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 typedef void * t_glyph;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class NOVTABLE contextmenu_item_node {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 enum t_flags {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 FLAG_CHECKED = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 FLAG_DISABLED = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 FLAG_GRAYED = 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 FLAG_DISABLED_GRAYED = FLAG_DISABLED|FLAG_GRAYED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 FLAG_RADIOCHECKED = 8, //new in 0.9.5.2 - overrides FLAG_CHECKED, set together with FLAG_CHECKED for backwards compatibility.
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 enum t_type {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 type_group,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 type_command,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 type_separator,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //for compatibility
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 TYPE_POPUP = type_group,TYPE_COMMAND = type_command,TYPE_SEPARATOR = type_separator,
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 virtual bool get_display_data(pfc::string_base & p_out,unsigned & p_displayflags,metadb_handle_list_cref p_data,const GUID & p_caller) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 virtual t_type get_type() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 virtual void execute(metadb_handle_list_cref p_data,const GUID & p_caller) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 virtual t_glyph get_glyph(metadb_handle_list_cref p_data, const GUID& p_caller) { (void)p_data; (void)p_caller; return 0; }//RESERVED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 virtual t_size get_children_count() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 virtual contextmenu_item_node * get_child(t_size p_index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 virtual bool get_description(pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 virtual GUID get_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 virtual bool is_mappable_shortcut() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 contextmenu_item_node() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 ~contextmenu_item_node() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 class NOVTABLE contextmenu_item_node_root : public contextmenu_item_node
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 virtual ~contextmenu_item_node_root() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 class NOVTABLE contextmenu_item_node_leaf : public contextmenu_item_node
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 t_type get_type() {return TYPE_COMMAND;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 t_size get_children_count() {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 contextmenu_item_node * get_child(t_size) {return NULL;}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 class NOVTABLE contextmenu_item_node_root_leaf : public contextmenu_item_node_root
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 t_type get_type() {return TYPE_COMMAND;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 t_size get_children_count() {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 contextmenu_item_node * get_child(t_size) {return NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 };
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 class NOVTABLE contextmenu_item_node_popup : public contextmenu_item_node
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 t_type get_type() override {return TYPE_POPUP;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 void execute(metadb_handle_list_cref data, const GUID& caller) override { (void)data; (void)caller; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 bool get_description(pfc::string_base& p_out) override { (void)p_out; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 class NOVTABLE contextmenu_item_node_root_popup : public contextmenu_item_node_root
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 t_type get_type() override {return TYPE_POPUP;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 void execute(metadb_handle_list_cref data, const GUID& caller) override { (void)data; (void)caller; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 bool get_description(pfc::string_base& p_out) override { (void)p_out; return false; }
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 class contextmenu_item_node_separator : public contextmenu_item_node
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 t_type get_type() override {return TYPE_SEPARATOR;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 void execute(metadb_handle_list_cref data, const GUID& caller) override { (void)data; (void)caller; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 bool get_description(pfc::string_base& p_out) override { (void)p_out; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 t_size get_children_count() override {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 bool get_display_data(pfc::string_base & p_out,unsigned & p_displayflags,metadb_handle_list_cref p_data,const GUID & p_caller) override
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 (void)p_data; (void)p_caller;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 p_displayflags = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 p_out = "---";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 contextmenu_item_node * get_child(t_size) override {return NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 GUID get_guid() override {return pfc::guid_null;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 bool is_mappable_shortcut() override {return false;}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 /*!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 Service class for declaring context menu commands.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 See contextmenu_item_simple for implementation helper without dynamic menu generation features.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 All methods are valid from main app thread only.
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 class NOVTABLE contextmenu_item : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 enum t_enabled_state {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 FORCE_OFF,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 DEFAULT_OFF,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 DEFAULT_ON,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 //! Retrieves number of menu items provided by this contextmenu_item implementation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 virtual unsigned get_num_items() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 //! Instantiates a context menu item (including sub-node tree for items that contain dynamically-generated sub-items).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 virtual contextmenu_item_node_root * instantiate_item(unsigned p_index,metadb_handle_list_cref p_data,const GUID & p_caller) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 //! Retrieves GUID of the context menu item.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 virtual GUID get_item_guid(unsigned p_index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 //! Retrieves human-readable name of the context menu item.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 virtual void get_item_name(unsigned p_index,pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 //! Obsolete since v1.0, don't use or override in new components.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 virtual void get_item_default_path(unsigned p_index, pfc::string_base& p_out) { (void)p_index; p_out = ""; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 //! Retrieves item's description to show in the status bar. Set p_out to the string to be displayed and return true if you provide a description, return false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 virtual bool get_item_description(unsigned p_index,pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 //! Controls default state of context menu preferences for this item: \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 //! Return DEFAULT_ON to show this item in the context menu by default - useful for most cases. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 //! Return DEFAULT_OFF to hide this item in the context menu by default - useful for rarely used utility commands. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! Return FORCE_OFF to hide this item by default and prevent the user from making it visible (very rarely used). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 //! foobar2000 v1.6 and newer: FORCE_OFF items are meant for being shown only in the keyboard shortcut list, not anywhere else. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 //! Values returned by this method should be constant for this context menu item and not change later. Do not use this to conditionally hide the item - return false from get_display_data() instead.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 virtual t_enabled_state get_enabled_state(unsigned p_index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 //! Executes the menu item command without going thru the instantiate_item path. For items with dynamically-generated sub-items, p_node is identifies of the sub-item command to execute.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 virtual void item_execute_simple(unsigned p_index,const GUID & p_node,metadb_handle_list_cref p_data,const GUID & p_caller) = 0;
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 bool item_get_display_data_root(pfc::string_base & p_out,unsigned & displayflags,unsigned p_index,metadb_handle_list_cref p_data,const GUID & p_caller);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 bool item_get_display_data(pfc::string_base & p_out,unsigned & displayflags,unsigned p_index,const GUID & p_node,metadb_handle_list_cref p_data,const GUID & p_caller);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 GUID get_parent_fallback();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 GUID get_parent_();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 //! Deprecated - use caller_active_playlist_selection instead.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 static const GUID caller_playlist;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 static const GUID caller_active_playlist_selection, caller_active_playlist, caller_playlist_manager, caller_now_playing, caller_keyboard_shortcut_list, caller_media_library_viewer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 static const GUID caller_undefined;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(contextmenu_item);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 class NOVTABLE contextmenu_item_v2 : public contextmenu_item {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 FB2K_MAKE_SERVICE_INTERFACE(contextmenu_item_v2, contextmenu_item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 virtual double get_sort_priority() {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 virtual GUID get_parent() {return get_parent_fallback();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 };
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 //! contextmenu_item implementation helper for implementing non-dynamically-generated context menu items; derive from this instead of from contextmenu_item directly if your menu items are static.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 class NOVTABLE contextmenu_item_simple : public contextmenu_item_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 //! Same as contextmenu_item_node::t_flags.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 enum t_flags
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 FLAG_CHECKED = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 FLAG_DISABLED = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 FLAG_GRAYED = 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 FLAG_DISABLED_GRAYED = FLAG_DISABLED|FLAG_GRAYED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 FLAG_RADIOCHECKED = 8, //new in 0.9.5.2 - overrides FLAG_CHECKED, set together with FLAG_CHECKED for backwards compatibility.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 // Functions to be overridden by implementers (some are not mandatory).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 virtual t_enabled_state get_enabled_state(unsigned p_index) { (void)p_index; return contextmenu_item::DEFAULT_ON; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 virtual unsigned get_num_items() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 virtual void get_item_name(unsigned p_index,pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 virtual void context_command(unsigned p_index,metadb_handle_list_cref p_data,const GUID& p_caller) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 virtual bool context_get_display(unsigned p_index,metadb_handle_list_cref p_data,pfc::string_base & p_out,unsigned & p_displayflags,const GUID & p_caller) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 (void)p_caller; (void)p_data; (void)p_displayflags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 PFC_ASSERT(p_index>=0 && p_index<get_num_items());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 get_item_name(p_index,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 virtual GUID get_item_guid(unsigned p_index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 virtual bool get_item_description(unsigned p_index,pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 class contextmenu_item_node_impl : public contextmenu_item_node_root_leaf {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 contextmenu_item_node_impl(contextmenu_item_simple * p_owner,unsigned p_index) : m_owner(p_owner), m_index(p_index) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 bool get_display_data(pfc::string_base & p_out,unsigned & p_displayflags,metadb_handle_list_cref p_data,const GUID & p_caller) {return m_owner->get_display_data(m_index,p_data,p_out,p_displayflags,p_caller);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 void execute(metadb_handle_list_cref p_data,const GUID & p_caller) {m_owner->context_command(m_index,p_data,p_caller);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 bool get_description(pfc::string_base & p_out) {return m_owner->get_item_description(m_index,p_out);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 GUID get_guid() {return pfc::guid_null;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 bool is_mappable_shortcut() {return m_owner->item_is_mappable_shortcut(m_index);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 service_ptr_t<contextmenu_item_simple> m_owner;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 unsigned m_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 };
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 contextmenu_item_node_root * instantiate_item(unsigned p_index,metadb_handle_list_cref p_data,const GUID & p_caller)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 (void)p_data; (void)p_caller;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 return new contextmenu_item_node_impl(this,p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207
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 item_execute_simple(unsigned p_index,const GUID & p_node,metadb_handle_list_cref p_data,const GUID & p_caller)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 if (p_node == pfc::guid_null)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 context_command(p_index,p_data,p_caller);
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 virtual bool item_is_mappable_shortcut(unsigned p_index)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 (void)p_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
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 virtual bool get_display_data(unsigned n,metadb_handle_list_cref data,pfc::string_base & p_out,unsigned & displayflags,const GUID & caller)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 bool rv = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 assert(n>=0 && n<get_num_items());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 if (data.get_count()>0)
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 rv = context_get_display(n,data,p_out,displayflags,caller);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 //! Helper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 class contextmenu_item_factory_t : public service_factory_single_t<T> {};
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 //! Helper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 #define DECLARE_CONTEXT_MENU_ITEM(P_CLASSNAME,P_NAME,P_DEFAULTPATH,P_FUNC,P_GUID,P_DESCRIPTION) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 namespace { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 class P_CLASSNAME : public contextmenu_item_simple { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 public: \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 unsigned get_num_items() {return 1;} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 void get_item_name(unsigned p_index,pfc::string_base & p_out) {p_out = P_NAME;} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 void get_item_default_path(unsigned p_index,pfc::string_base & p_out) {p_out = P_DEFAULTPATH;} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 void context_command(unsigned p_index,metadb_handle_list_cref p_data,const GUID& p_caller) {P_FUNC(p_data);} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 GUID get_item_guid(unsigned p_index) {return P_GUID;} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 bool get_item_description(unsigned p_index,pfc::string_base & p_out) {if (P_DESCRIPTION[0] == 0) return false;p_out = P_DESCRIPTION; return true;} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 }; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 static contextmenu_item_factory_t<P_CLASSNAME> g_##P_CLASSNAME##_factory; \
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 //! New in 0.9.5.1. Static methods safe to use in prior versions as it will use slow fallback mode when the service isn't present. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 //! Functionality provided by menu_item_resolver methods isn't much different from just walking all registered contextmenu_item / mainmenu_commands implementations to find the command we want, but it uses a hint map to locate the service we're looking for without walking all of them which may be significantly faster in certain scenarios.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 class menu_item_resolver : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 FB2K_MAKE_SERVICE_COREAPI(menu_item_resolver)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 virtual bool resolve_context_command(const GUID & id, service_ptr_t<class contextmenu_item> & out, t_uint32 & out_index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 virtual bool resolve_main_command(const GUID & id, service_ptr_t<class mainmenu_commands> & out, t_uint32 & out_index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 static bool g_resolve_context_command(const GUID & id, service_ptr_t<class contextmenu_item> & out, t_uint32 & out_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 static bool g_resolve_main_command(const GUID & id, service_ptr_t<class mainmenu_commands> & out, t_uint32 & out_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 class NOVTABLE contextmenu_group : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(contextmenu_group);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 virtual GUID get_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 virtual GUID get_parent() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 virtual double get_sort_priority() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 class NOVTABLE contextmenu_group_popup : public contextmenu_group {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 FB2K_MAKE_SERVICE_INTERFACE(contextmenu_group_popup, contextmenu_group)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 virtual void get_display_string(pfc::string_base & out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 void get_name(pfc::string_base & out) {get_display_string(out);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 class contextmenu_groups {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 static const GUID root, utilities, tagging, tagging_pictures, replaygain, fileoperations, playbackstatistics, properties, convert, legacy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 class contextmenu_group_impl : public contextmenu_group {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 contextmenu_group_impl(const GUID & guid, const GUID & parent, double sortPriority = 0) : m_guid(guid), m_parent(parent), m_sortPriority(sortPriority) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 GUID get_guid() {return m_guid;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 GUID get_parent() {return m_parent;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 double get_sort_priority() {return m_sortPriority;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 const GUID m_guid, m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 const double m_sortPriority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 class contextmenu_group_popup_impl : public contextmenu_group_popup {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 contextmenu_group_popup_impl(const GUID & guid, const GUID & parent, const char * name, double sortPriority = 0) : m_guid(guid), m_parent(parent), m_sortPriority(sortPriority), m_name(name) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 GUID get_guid() {return m_guid;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 GUID get_parent() {return m_parent;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 double get_sort_priority() {return m_sortPriority;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 void get_display_string(pfc::string_base & out) {out = m_name;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 const GUID m_guid, m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 const double m_sortPriority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 const char * const m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 namespace contextmenu_priorities {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 root_queue = -100,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 root_main = -50,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 root_tagging,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 root_fileoperations,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 root_convert,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 root_utilities,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 root_replaygain,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 root_playbackstatistics,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 root_legacy = 99,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 root_properties = 100,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 tagging_pictures = 100,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 class contextmenu_group_factory : public service_factory_single_t<contextmenu_group_impl> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 contextmenu_group_factory(const GUID & guid, const GUID & parent, double sortPriority = 0) : service_factory_single_t<contextmenu_group_impl>(guid, parent, sortPriority) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 class contextmenu_group_popup_factory : public service_factory_single_t<contextmenu_group_popup_impl> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 contextmenu_group_popup_factory(const GUID & guid, const GUID & parent, const char * name, double sortPriority = 0) : service_factory_single_t<contextmenu_group_popup_impl>(guid, parent, name, sortPriority) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 class contextmenu_item_lambda : public contextmenu_item_simple {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 typedef std::function<void(metadb_handle_list_cref)> func_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 contextmenu_item_lambda(func_t f, const char* n, const GUID& g, const GUID& pg, const char* d = nullptr, double sp = 0) : m_func(f), m_name(n), m_guid(g), m_parentGuid(pg), m_desc(d), m_sortPriority(sp) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 unsigned get_num_items() override { return 1; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 void get_item_name(unsigned p_index, pfc::string_base& p_out) override { (void)p_index; p_out = m_name; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 void context_command(unsigned p_index, metadb_handle_list_cref p_data, const GUID& p_caller) override { (void)p_index; (void)p_caller; m_func(p_data); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 GUID get_item_guid(unsigned p_index) override { (void)p_index; return m_guid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 bool get_item_description(unsigned p_index, pfc::string_base& p_out) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 (void)p_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 if (m_desc == nullptr) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 p_out = m_desc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 double get_sort_priority() override { return m_sortPriority; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 GUID get_parent() override { return m_parentGuid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 const std::function<void(metadb_handle_list_cref)> m_func;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 const char* const m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 const GUID m_guid, m_parentGuid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 const char* const m_desc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 const double m_sortPriority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 #define FB2K_DECLARE_CONTEXT_MENU_ITEM(func, name, guid, parent, desc, sort) FB2K_SERVICE_FACTORY_PARAMS(contextmenu_item_lambda, func, name, guid, parent, desc, sort)