annotate foosdk/sdk/foobar2000/SDK/preferences_page.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 class preferences_state {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 changed = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 needs_restart = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 needs_restart_playback = 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 resettable = 8,
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 //! \since 1.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! Indicates that the dialog is currently busy and cannot be applied or cancelled. Do not use without a good reason! \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! This flag was introduced in 1.1. It will not be respected in earlier foobar2000 versions. It is recommended not to use this flag unless you are absolutely sure that you need it and take appropriate precautions. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! Note that this has no power to entirely prevent your preferences page from being destroyed/cancelled as a result of app shutdown if the user dismisses the warnings, but you won't be getting an "apply" call while this is set.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 busy = 16,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 //! \since 1.4.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 needs_rescan_library = 32,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 dark_mode_supported = 1 << 16,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! Implementing this service will generate a page in preferences dialog. Use preferences_page_factory_t template to register. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 //! In 1.0 and newer you should always derive from preferences_page_v3 rather than from preferences_page directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 class NOVTABLE preferences_page : 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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! Obsolete.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 virtual fb2k::hwnd_t create(fb2k::hwnd_t p_parent) { (void)p_parent; uBugCheck(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 #ifdef __APPLE__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! Returns fb2k::NSObjectWrapper holding your NSViewController
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 virtual service_ptr instantiate( ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 //! Retrieves name of the preferences page to be displayed in preferences tree (static string).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 virtual const char * get_name() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 //! Retrieves GUID of the page.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 virtual GUID get_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! Retrieves GUID of parent page/branch of this page. See preferences_page::guid_* constants for list of standard parent GUIDs. Can also be a GUID of another page or a branch (see: preferences_branch).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 virtual GUID get_parent_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 //! Obsolete.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 virtual bool reset_query() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 //! Obsolete.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 virtual void reset() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! Retrieves help URL. Without overriding it, it will redirect to foobar2000 wiki.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 virtual bool get_help_url(pfc::string_base & p_out);
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 static void get_help_url_helper(pfc::string_base & out, const char * category, const GUID & id, const char * name);
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 static const GUID guid_root, guid_hidden, guid_tools,guid_core,guid_display,guid_playback,guid_visualisations,guid_input,guid_tag_writing,guid_media_library, guid_tagging, guid_output, guid_advanced, guid_components, guid_dsp, guid_shell, guid_keyboard_shortcuts;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 //! \since 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 static const GUID guid_input_info_filter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 double get_sort_priority_();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(preferences_page);
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 preferences_page_v2 : public preferences_page {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 //! Allows custom sorting order of preferences pages. Return lower value for higher priority (lower resulting index in the list). When sorting priority of two items matches, alphabetic sorting is used. Return 0 to use default alphabetic sorting without overriding priority.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 virtual double get_sort_priority() {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 FB2K_MAKE_SERVICE_INTERFACE(preferences_page_v2,preferences_page);
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 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 class preferences_page_factory_t : public service_factory_single_t<T> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! Creates a preferences branch - an empty page that only serves as a parent for other pages and is hidden when no child pages exist. Instead of implementing this, simply use preferences_branch_factory class to declare a preferences branch with specified parameters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 class NOVTABLE preferences_branch : public service_base {
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 //! Retrieves name of the preferences branch.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 virtual const char * get_name() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 //! Retrieves GUID of the preferences branch. Use this GUID as parent GUID for pages/branches nested in this branch.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 virtual GUID get_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 //! Retrieves GUID of parent page/branch of this branch. See preferences_page::guid_* constants for list of standard parent GUIDs. Can also be a GUID of another branch or a page.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 virtual GUID get_parent_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
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 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(preferences_branch);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 };
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 class preferences_branch_v2 : public preferences_branch {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 //! Allows custom sorting order of preferences pages. Return lower value for higher priority (lower resulting index in the list). When sorting priority of two items matches, alphabetic sorting is used. Return 0 to use default alphabetic sorting without overriding priority.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 virtual double get_sort_priority() {return 0;}
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 FB2K_MAKE_SERVICE_INTERFACE(preferences_branch_v2,preferences_branch);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 class preferences_branch_impl : public preferences_branch_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 preferences_branch_impl(const GUID & p_guid,const GUID & p_parent,const char * p_name,double p_sort_priority = 0) : m_guid(p_guid), m_parent(p_parent), m_name(p_name), m_sort_priority(p_sort_priority) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 const char * get_name() {return m_name;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 GUID get_guid() {return m_guid;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 GUID get_parent_guid() {return m_parent;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 double get_sort_priority() {return m_sort_priority;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 const GUID m_guid,m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 const pfc::string8 m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 const double m_sort_priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 typedef service_factory_single_t<preferences_branch_impl> _preferences_branch_factory;
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 //! Instantiating this class declares a preferences branch with specified parameters.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 //! Usage: static preferences_branch_factory g_mybranch(mybranchguid,parentbranchguid,"name of my preferences branch goes here");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 class preferences_branch_factory : public _preferences_branch_factory {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 preferences_branch_factory(const GUID & p_guid,const GUID & p_parent,const char * p_name,double p_sort_priority = 0) : _preferences_branch_factory(p_guid,p_parent,p_name,p_sort_priority) {}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 class preferences_page_callback : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 FB2K_MAKE_SERVICE_INTERFACE(preferences_page_callback, service_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 virtual void on_state_changed() = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 //! Implements a preferences page instance. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 //! Instantiated through preferences_page_v3::instantiate(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 //! Note that the window will be destroyed by the caller before the last reference to the preferences_page_instance is released. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 //! WARNING: misguided use of modal dialogs - or ANY windows APIs that might spawn such dialogs - may result in conditions when the owner dialog (along with your page) is destroyed somewhere inside your message handler, also releasing references to your object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //! It is recommended to use window_service_impl_t<> from ATLHelpers to instantiate preferences_page_instances, or preferences_page_impl<> framework for your preferences_page code to cleanly workaround such cases.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 class preferences_page_instance : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 FB2K_MAKE_SERVICE_INTERFACE(preferences_page_instance, service_base)
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 //! @returns a combination of preferences_state constants.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 virtual t_uint32 get_state() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 //! @returns the window handle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 virtual fb2k::hwnd_t get_wnd() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 //! Applies preferences changes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 virtual void apply() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 //! Resets this page's content to the default values. Does not apply any changes - lets user preview the changes before hitting "apply".
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 virtual void reset() = 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 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 //! Implements a preferences page.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 class preferences_page_v3 : public preferences_page_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 FB2K_MAKE_SERVICE_INTERFACE(preferences_page_v3, preferences_page_v2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 virtual preferences_page_instance::ptr instantiate(fb2k::hwnd_t parent, preferences_page_callback::ptr callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 #endif
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 //! \since 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 class NOVTABLE preferences_page_v4 : public preferences_page_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 FB2K_MAKE_SERVICE_INTERFACE(preferences_page_v4, preferences_page_v3);
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 virtual bool is_hidden() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 };