annotate foosdk/sdk/foobar2000/SDK/ui.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
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 //! Entrypoint service for user interface modules. Implement when registering an UI module. Do not call existing implementations; only core enumerates / dispatches calls. To control UI behaviors from other components, use ui_control API. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //! Use user_interface_factory_t<> to register, e.g static user_interface_factory_t<myclass> g_myclass_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class NOVTABLE user_interface : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(user_interface);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //!HookProc usage: \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! in your windowproc, call HookProc first, and if it returns true, return LRESULT value it passed to you
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 typedef BOOL (WINAPI * HookProc_t)(HWND wnd,UINT msg,WPARAM wp,LPARAM lp,LRESULT * ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 typedef void* HookProc_t; // RESERVED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 //! Retrieves name (UTF-8 null-terminated string) of the UI module.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 virtual const char * get_name()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 //! Initializes the UI module - creates the main app window, etc. Failure should be signaled by appropriate exception (std::exception or a derivative). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! Mac OS: return NSWindow cast to hwnd_t
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 virtual fb2k::hwnd_t init(HookProc_t hook) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 //! Deinitializes the UI module - destroys the main app window, etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 virtual void shutdown()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Activates main app window.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 virtual void activate()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! Minimizes/hides main app window.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 virtual void hide()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 //! Returns whether main window is visible / not minimized. Used for activate/hide command.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 virtual bool is_visible() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 //! Retrieves GUID of your implementation, to be stored in configuration file etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 virtual GUID get_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 //! Overrides statusbar text with specified string. The parameter is a null terminated UTF-8 string. The override is valid until another override_statusbar_text() call or revert_statusbar_text() call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 virtual void override_statusbar_text(const char * p_text) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 //! Disables statusbar text override.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 virtual void revert_statusbar_text() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 //! Shows now-playing item somehow (e.g. system tray popup).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 virtual void show_now_playing() = 0;
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 static bool g_find(service_ptr_t<user_interface> & p_out,const GUID & p_guid);
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 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 class user_interface_factory : public service_factory_single_t<T> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 //! \since 1.4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 //! Extended version to allow explicit control over certain app features.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 class NOVTABLE user_interface_v2 : public user_interface {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 FB2K_MAKE_SERVICE_INTERFACE( user_interface_v2, user_interface );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! Allows the core to ask the UI module about a specific feature.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 virtual bool query_capability( const GUID & cap ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 //! Suppress core's shellhook window for intercepting systemwide WM_APPCOMMAND? \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 //! Recommended: false - return true only if your UI does this on its own.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 static const GUID cap_suppress_core_shellhook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 //! Suppress coer's integration with with Win10 Universal Volume Control? \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 //! Recommended: false - return true only if your UI is explicitly incompatbile with Win10 UVC. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 //! Note that cap_suppress_core_shellhook is queried first, as core can't use UVC if this UI does global WM_APPCOMMAND handling on its own. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 //! Returning true from cap_suppress_core_shellhook implies the same from cap_suppress_core_uvc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 static const GUID cap_suppress_core_uvc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 #endif
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 class ui_config_manager;
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 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 class NOVTABLE user_interface_v3 : public user_interface_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 FB2K_MAKE_SERVICE_INTERFACE(user_interface_v3, user_interface_v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 virtual service_ptr_t< ui_config_manager > get_config_manager() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 };
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 //! \since 2.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 class NOVTABLE user_interface_v4 : public user_interface_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 FB2K_MAKE_SERVICE_INTERFACE(user_interface_v4, user_interface_v3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 static constexpr uint32_t flagHide = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 virtual fb2k::hwnd_t init_v4(HookProc_t hook, uint32_t flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 };
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 //! Interface class allowing you to override UI statusbar text. There may be multiple callers trying to override statusbar text; backend decides which one succeeds so you will not always get what you want. Statusbar text override is automatically cancelled when the object is released.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 //! Use ui_control::override_status_text_create() to instantiate.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 //! Implemented by core. Do not reimplement.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 class NOVTABLE ui_status_text_override : public service_base
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 //! Sets statusbar text to specified UTF-8 null-terminated string.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 virtual void override_text(const char * p_message) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 //! Cancels statusbar text override.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 virtual void revert_text() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 FB2K_MAKE_SERVICE_INTERFACE(ui_status_text_override,service_base);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 //! Serivce providing various UI-related commands. Implemented by core; do not reimplement.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 //! Instantiation: use ui_control::get() to obtain an instance.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 class NOVTABLE ui_control : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 FB2K_MAKE_SERVICE_COREAPI(ui_control);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 //! Returns whether primary UI is visible/unminimized.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 virtual bool is_visible()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 //! Activates/unminimizes main UI.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 virtual void activate()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 //! Hides/minimizese main UI.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 virtual void hide()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 //! Retrieves main GUI icon, to use as window icon etc. Returned handle does not need to be freed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 virtual fb2k::hicon_t get_main_icon()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 //! Loads main GUI icon, version with specified width/height. Returned handle needs to be freed with DestroyIcon when you are done using it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 virtual fb2k::hicon_t load_main_icon(unsigned width,unsigned height) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 //! Activates preferences dialog and navigates to specified page. See also: preference_page API. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 //! Since foobar2000 1.5, this can be used to show advanced preferences branches or settings, just pass GUID of the advconfig_entry you wish to show.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 virtual void show_preferences(const GUID & p_page) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 //! Instantiates ui_status_text_override service, that can be used to display status messages.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 //! @param p_out receives new ui_status_text_override instance.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 //! @returns true on success, false on failure (out of memory / no GUI loaded / etc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 virtual bool override_status_text_create(service_ptr_t<ui_status_text_override> & p_out) = 0;
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 typedef ui_status_text_override ui_status_host;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 //! \since 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 class NOVTABLE ui_control_v2 : public ui_control {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(ui_control_v2, ui_control)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 virtual void register_status_host(fb2k::hwnd_t wndFor, ui_status_host::ptr obj) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 virtual void unregister_status_host(fb2k::hwnd_t wndFor) = 0;
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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 //! Service called from the UI when some object is dropped into the UI. Usable for modifying drag&drop behaviors such as adding custom handlers for object types other than supported media files.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 //! Implement where needed; use ui_drop_item_callback_factory_t<> template to register, e.g. static ui_drop_item_callback_factory_t<myclass> g_myclass_factory.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 class NOVTABLE ui_drop_item_callback : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 //! Called when an object was dropped; returns true if the object was processed and false if not.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 virtual bool on_drop(interface IDataObject * pDataObject) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 //! Tests whether specified object type is supported by this ui_drop_item_callback implementation. Returns true and sets p_effect when it's supported; returns false otherwise. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 //! See IDropTarget::DragEnter() documentation for more information about p_effect values.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 virtual bool is_accepted_type(interface IDataObject * pDataObject, DWORD * p_effect)=0;
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 //! Static helper, calls all existing implementations appropriately. See on_drop().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 static bool g_on_drop(interface IDataObject * pDataObject);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 //! Static helper, calls all existing implementations appropriately. See is_accepted_type().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 static bool g_is_accepted_type(interface IDataObject * pDataObject, DWORD * p_effect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(ui_drop_item_callback);
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 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 class ui_drop_item_callback_factory_t : public service_factory_single_t<T> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 #endif
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 class ui_selection_callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 //! Write interface and reference counter for the shared selection.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 //! The ui_selection_manager stores the selected items as a list.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 //! The ui_selection_holder service allows components to modify this list.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 //! It also serves as a reference count: the ui_selection_manager clears the stored
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 //! selection when no component holds a reference to a ui_selection_holder.
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 //! When a window that uses the shared selection gets the focus, it should acquire
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 //! a ui_selection_holder from the ui_selection_manager. If it contains selectable items,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 //! it should use the appropriate method to store its selected items as the shared selection.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 //! If it just wants to preserve the selection - for example so it can display it - it should
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 //! merely store the acquired ui_selection_holder.
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 //! When the window loses the focus, it should release its ui_selection_holder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 //! It should not use a set method to clear the selection
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 class NOVTABLE ui_selection_holder : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 //! Sets selected items.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 virtual void set_selection(metadb_handle_list_cref data) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 //! Sets selected items to playlist selection and enables tracking.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 //! When the playlist selection changes, the stored selection is automatically updated.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 //! Tracking ends when a set method is called on any ui_selection_holder or when
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 //! the last reference to this ui_selection_holder is released.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 virtual void set_playlist_selection_tracking() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 //! Sets selected items to the contents of the active playlist and enables tracking.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 //! When the active playlist or its contents changes, the stored selection is automatically updated.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 //! Tracking ends when a set method is called on any ui_selection_holder or when
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 //! the last reference to this ui_selection_holder is released.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 virtual void set_playlist_tracking() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 //! Sets selected items and type of selection holder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 //! @param type Specifies type of selection. Values same as contextmenu_item caller IDs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 virtual void set_selection_ex(metadb_handle_list_cref data, const GUID & type) = 0;
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 FB2K_MAKE_SERVICE_INTERFACE(ui_selection_holder,service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 class NOVTABLE ui_selection_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 FB2K_MAKE_SERVICE_COREAPI(ui_selection_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 //! Retrieves the current selection.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 virtual void get_selection(metadb_handle_list_ref p_selection) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 //! Registers a callback. It is recommended to use ui_selection_callback_impl_base class instead of calling this directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 virtual void register_callback(ui_selection_callback * p_callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 //! Unregisters a callback. It is recommended to use ui_selection_callback_impl_base class instead of calling this directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 virtual void unregister_callback(ui_selection_callback * p_callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 virtual ui_selection_holder::ptr acquire() = 0;
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 //! Retrieves type of the active selection holder. Values same as contextmenu_item caller IDs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 virtual GUID get_selection_type() = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 class NOVTABLE ui_selection_manager_v2 : public ui_selection_manager {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(ui_selection_manager_v2, ui_selection_manager)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 enum { flag_no_now_playing = 1 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 virtual void get_selection(metadb_handle_list_ref out, t_uint32 flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 virtual GUID get_selection_type(t_uint32 flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 virtual void register_callback(ui_selection_callback * callback, t_uint32 flags) = 0;
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 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 class NOVTABLE ui_selection_manager_v3 : public ui_selection_manager_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(ui_selection_manager_v3, ui_selection_manager_v2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 virtual void add_callback_scope(ui_selection_callback* cb,const GUID & scope) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 virtual bool is_scope_watched(const GUID& scope) = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 class ui_selection_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 virtual void on_selection_changed(metadb_handle_list_cref p_selection) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 ui_selection_callback() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 ~ui_selection_callback() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 //! ui_selection_callback implementation helper with autoregistration - do not instantiate statically
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 class ui_selection_callback_impl_base : public ui_selection_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 ui_selection_callback_impl_base(bool activate = true) : m_active() {ui_selection_callback_activate(activate);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 ~ui_selection_callback_impl_base() {ui_selection_callback_activate(false);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 void ui_selection_callback_activate(bool state = true) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 if (state != m_active) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 m_active = state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 auto api = ui_selection_manager::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 if (state) api->register_callback(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 else api->unregister_callback(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 }
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 //avoid pure virtual function calls in rare cases - provide a dummy implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 void on_selection_changed(metadb_handle_list_cref p_selection) override { (void)p_selection; }
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 PFC_CLASS_NOT_COPYABLE_EX(ui_selection_callback_impl_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 bool m_active;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 //! ui_selection_callback implementation helper with autoregistration - do not instantiate statically
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 template<unsigned flags>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 class ui_selection_callback_impl_base_ex : public ui_selection_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 ui_selection_flags = flags
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 ui_selection_callback_impl_base_ex(bool activate = true) : m_active() {ui_selection_callback_activate(activate);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 ~ui_selection_callback_impl_base_ex() {ui_selection_callback_activate(false);}
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 void ui_selection_callback_activate(bool state = true) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 if (state != m_active) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 m_active = state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 auto api = ui_selection_manager_v2::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 if (state) api->register_callback(this, flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 else api->unregister_callback(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 }
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 //avoid pure virtual function calls in rare cases - provide a dummy implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 void on_selection_changed(metadb_handle_list_cref p_selection) override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 PFC_CLASS_NOT_COPYABLE(ui_selection_callback_impl_base_ex, ui_selection_callback_impl_base_ex<flags>);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 bool m_active;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 };