|
1
|
1 #pragma once
|
|
|
2
|
|
|
3 #ifdef _WIN32
|
|
|
4
|
|
|
5 /*
|
|
|
6 ==== fb2k::coreDarkMode API ====
|
|
|
7 For many components, main issue with implementing of Dark Mode is that libPPUI Dark Mode implementation is *huge* and adds a massive amount of code to otherwise small component DLL.
|
|
|
8 Using fb2k::coreDarkMode addresses this - provides interface to foo_ui_std implementation of Dark Mode hooks.
|
|
|
9 This allows implementing Dark Mode without size bloat - however, it also means talking to possibly outdated libPPUI that comes with user's foobar2000 install.
|
|
|
10 If you use this, you should make sure that your UI works properly with the oldest supported foobar2000 release with Dark Mode, such as early v2.0 builds.
|
|
|
11 */
|
|
|
12
|
|
|
13
|
|
|
14 namespace fb2k {
|
|
|
15 class coreDarkModeObj : public service_base {
|
|
|
16 FB2K_MAKE_SERVICE_INTERFACE(coreDarkModeObj, service_base);
|
|
|
17 public:
|
|
|
18 virtual void addCtrlAuto(HWND) = 0;
|
|
|
19 virtual void addDialog(HWND) = 0;
|
|
|
20 virtual void addControls(HWND) = 0;
|
|
|
21 virtual void setDarkMode(bool) = 0; // valid ONLY if create(bool) was used
|
|
|
22 virtual bool isDark() = 0;
|
|
|
23 };
|
|
|
24
|
|
|
25 class coreDarkMode : public service_base {
|
|
|
26 FB2K_MAKE_SERVICE_COREAPI(coreDarkMode);
|
|
|
27 public:
|
|
|
28 virtual coreDarkModeObj::ptr create(bool) = 0;
|
|
|
29 virtual coreDarkModeObj::ptr createAuto() = 0; // auto updates with fb2k config, disregards setDarkMode()
|
|
|
30 };
|
|
|
31
|
|
|
32 FOOGUIDDECL const GUID coreDarkMode::class_guid = { 0xe34839b0, 0xd899, 0x43c5, { 0x94, 0x71, 0x14, 0xff, 0x48, 0x1d, 0x5e, 0xe8 } };
|
|
|
33 FOOGUIDDECL const GUID coreDarkModeObj::class_guid = { 0xdf2e7682, 0x4b52, 0x42d8, { 0x80, 0xc8, 0x2e, 0x46, 0xf9, 0x41, 0x55, 0xd2 } };
|
|
|
34
|
|
|
35 //! Intended as drop-in replacement of fb2k::CDarkModeHooks (see helpers/DarkMode.h), only using fb2k::coreDarkMode instead of locally-linked libPPUI. \n
|
|
|
36 //! Does nothing under pre-v2.0 foobar2000.
|
|
|
37 class CCoreDarkModeHooks {
|
|
|
38 public:
|
|
|
39 void AddCtrlAuto(HWND wnd) {
|
|
|
40 if (is_valid()) m_obj->addCtrlAuto(wnd);
|
|
|
41 }
|
|
|
42 void AddDialog(HWND wnd) {
|
|
|
43 if (is_valid()) m_obj->addDialog(wnd);
|
|
|
44 }
|
|
|
45 void AddControls(HWND wnd) {
|
|
|
46 if (is_valid()) m_obj->addControls(wnd);
|
|
|
47 }
|
|
|
48 void AddDialogWithControls(HWND wnd) {
|
|
|
49 AddDialog(wnd); AddControls(wnd);
|
|
|
50 }
|
|
|
51
|
|
|
52 void SetDark(bool v) {
|
|
|
53 if (is_valid()) m_obj->setDarkMode(v);
|
|
|
54 }
|
|
|
55 operator bool() const {
|
|
|
56 return is_valid() && m_obj->isDark();
|
|
|
57 }
|
|
|
58
|
|
|
59
|
|
|
60 CCoreDarkModeHooks() {
|
|
|
61 fb2k::coreDarkMode::ptr api;
|
|
|
62 if (core_api::are_services_available()) api = fb2k::coreDarkMode::tryGet();
|
|
|
63 if (!api.is_valid()) return;
|
|
|
64 m_obj = api->createAuto();
|
|
|
65 }
|
|
|
66 CCoreDarkModeHooks(bool v) {
|
|
|
67 fb2k::coreDarkMode::ptr api;
|
|
|
68 if (core_api::are_services_available()) api = fb2k::coreDarkMode::tryGet();
|
|
|
69 if (!api.is_valid()) return;
|
|
|
70 m_obj = api->create(v);
|
|
|
71 }
|
|
|
72 CCoreDarkModeHooks(const CCoreDarkModeHooks&) = delete;
|
|
|
73 void operator=(const CCoreDarkModeHooks&) = delete;
|
|
|
74 private:
|
|
|
75 bool is_valid() const {
|
|
|
76 return m_obj.is_valid();
|
|
|
77 }
|
|
|
78 fb2k::coreDarkModeObj::ptr m_obj;
|
|
|
79 };
|
|
|
80 }
|
|
|
81
|
|
|
82 #endif // _WIN32
|
|
|
83
|