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