annotate foosdk/sdk/foobar2000/helpers/dsp_dialog.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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "atl-misc.h"
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 // dsp_dialog.h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // DSP UI helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // Simplifies implementation of DSP configuration popups, removes the need for separate blocking/nonblocking dialog routing all calls to one dialog class.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 // Your dialog_t class must be WTL dialog taking dsp_preset_edit_callback_v2::ptr parameter in constructor.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 // Do not call EndDialog(), DestroyWindow() etc, only use the provided callback's dsp_dialog_done() to make your dialog disappear.
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 template<typename dialog_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void dsp_dialog_v2(const dsp_preset& p_data, HWND p_parent, dsp_preset_edit_callback& p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 core_api::ensure_main_thread();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 class mycallback : public dsp_preset_edit_callback_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 void get_preset(dsp_preset& outPreset) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 outPreset = m_state;
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 void set_preset(const dsp_preset& inPreset) { m_state = inPreset; if (m_chain) m_chain->on_preset_changed(inPreset); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 void dsp_dialog_done(bool bOK) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 if (m_dialog) m_dialog->EndDialog(bOK ? IDOK : IDCANCEL);
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 dsp_preset_impl m_state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 dsp_preset_edit_callback* m_chain = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 dialog_t* m_dialog = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 auto cb = fb2k::service_new<mycallback>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 cb->m_state = p_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 auto toggle = pfc::autoToggle(cb->m_chain, &p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 ImplementModalTracking< dialog_t > dialog(cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 auto toggle2 = pfc::autoToggle(cb->m_dialog, &dialog);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 dialog.DoModal(p_parent);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 template<typename dialog_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 class _dialog_as_service : public dialog_t, public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 template<typename ... arg_t> _dialog_as_service(arg_t && ... arg) : dialog_t(std::forward<arg_t>(arg) ...) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 };
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 template<typename dialog_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 service_ptr dsp_dialog_v3(HWND parent, dsp_preset_edit_callback_v2::ptr callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 class mycallback : public dsp_preset_edit_callback_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 void get_preset(dsp_preset& outPreset) override { m_chain->get_preset(outPreset); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 void set_preset(const dsp_preset& inPreset) { m_chain->set_preset(inPreset); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 void dsp_dialog_done(bool bOK) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 m_chain->dsp_dialog_done(bOK);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 m_dialog->DestroyWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 dsp_preset_edit_callback_v2::ptr m_chain;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 dialog_t* m_dialog = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 auto cb = fb2k::service_new< mycallback >();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 cb->m_chain = callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 auto obj = fb2k::service_new_window<ImplementModelessTracking< _dialog_as_service< dialog_t > > >(cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 cb->m_dialog = &*obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 WIN32_OP_D(obj->Create(parent)); obj->ShowWindow(SW_SHOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 return obj;
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 #endif
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 template<typename dsp_t, typename dialog_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 class dsp_impl_with_ui : public dsp_entry_common_t<dsp_t, dsp_entry_v3> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void get_display_name(const dsp_preset& arg, pfc::string_base& out) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 dsp_t::g_get_display_name(arg, out);
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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 void show_config_popup_v2(const dsp_preset& p_data, fb2k::hwnd_t p_parent, dsp_preset_edit_callback& p_callback) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 dsp_dialog_v2<dialog_t>(p_data, p_parent, p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 service_ptr show_config_popup_v3(fb2k::hwnd_t parent, dsp_preset_edit_callback_v2::ptr callback) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 return dsp_dialog_v3<dialog_t>(parent, callback);
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 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 service_ptr show_config_popup(fb2k::hwnd_t parent, dsp_preset_edit_callback_v2::ptr callback) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 return dialog_t::show_config_popup(parent, callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 };