annotate foosdk/sdk/foobar2000/SDK/ui_element.cpp @ 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 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "ui_element.h"
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class ui_element_config_impl : public ui_element_config {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 ui_element_config_impl(const GUID & guid) : m_guid(guid) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 ui_element_config_impl(const GUID & guid, const void * buffer, t_size size) : m_guid(guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 m_content.set_data_fromptr(reinterpret_cast<const t_uint8*>(buffer),size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 void * get_data_var() {return m_content.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 void set_data_size(t_size size) {m_content.set_size(size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 GUID get_guid() const {return m_guid;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 const void * get_data() const {return m_content.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 t_size get_data_size() const {return m_content.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 const GUID m_guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 pfc::array_t<t_uint8> m_content;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 service_ptr_t<ui_element_config> ui_element_config::g_create(const GUID& id, const void * data, t_size size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 return new service_impl_t<ui_element_config_impl>(id,data,size);
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 service_ptr_t<ui_element_config> ui_element_config::g_create(const GUID & id, stream_reader * in, t_size bytes, abort_callback & abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 service_ptr_t<ui_element_config_impl> data = new service_impl_t<ui_element_config_impl>(id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 data->set_data_size(bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 in->read_object(data->get_data_var(),bytes,abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 return data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
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 service_ptr_t<ui_element_config> ui_element_config::g_create(stream_reader * in, t_size bytes, abort_callback & abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 if (bytes < sizeof(GUID)) throw exception_io_data_truncation();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 GUID id;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 { stream_reader_formatter<> str(*in,abort); str >> id;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 return g_create(id,in,bytes - sizeof(GUID),abort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 ui_element_config::ptr ui_element_config_parser::subelement(t_size size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 return ui_element_config::g_create(&m_stream, size, m_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 ui_element_config::ptr ui_element_config_parser::subelement(const GUID & id, t_size dataSize) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 return ui_element_config::g_create(id, &m_stream, dataSize, m_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 service_ptr_t<ui_element_config> ui_element_config::g_create(const void * data, t_size size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 stream_reader_memblock_ref stream(data,size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 return g_create(&stream,size,fb2k::noAbort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 #ifdef _WIN32
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 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 struct sysColorMapping_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 GUID guid; int idx;
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 static const sysColorMapping_t sysColorMapping[] = {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 { ui_color_text, COLOR_WINDOWTEXT },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 { ui_color_background, COLOR_WINDOW },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 { ui_color_highlight, COLOR_HOTLIGHT },
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 {ui_color_selection, COLOR_HIGHLIGHT},
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 int ui_color_to_sys_color_index(const GUID & p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 for( unsigned i = 0; i < PFC_TABSIZE( sysColorMapping ); ++ i ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 if ( p_guid == sysColorMapping[i].guid ) return sysColorMapping[i].idx;
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 return -1;
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 GUID ui_color_from_sys_color_index(int idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 for (unsigned i = 0; i < PFC_TABSIZE(sysColorMapping); ++i) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (idx == sysColorMapping[i].idx) return sysColorMapping[i].guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 return pfc::guid_null;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 #endif // _WIN32
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 bool ui_element_subclass_description(const GUID & id, pfc::string_base & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 if (id == ui_element_subclass_playlist_renderers) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 p_out = "Playlist Renderers"; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 } else if (id == ui_element_subclass_media_library_viewers) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 p_out = "Media Library Viewers"; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 } else if (id == ui_element_subclass_selection_information) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 p_out = "Selection Information"; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 } else if (id == ui_element_subclass_playback_visualisation) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 p_out = "Playback Visualization"; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 } else if (id == ui_element_subclass_playback_information) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 p_out = "Playback Information"; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 } else if (id == ui_element_subclass_utility) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 p_out = "Utility"; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 } else if (id == ui_element_subclass_containers) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 p_out = "Containers"; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 } else if ( id == ui_element_subclass_dsp ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 p_out = "DSP"; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 bool ui_element::get_element_group(pfc::string_base & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 return ui_element_subclass_description(get_subclass(),p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 }
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 t_ui_color ui_element_instance_callback::query_std_color(const GUID & p_what) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 t_ui_color ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 if (query_color(p_what,ret)) return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 int idx = ui_color_to_sys_color_index(p_what);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 if (idx < 0) return 0;//should not be triggerable
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 return GetSysColor(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 throw pfc::exception_not_implemented();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 #endif
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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 t_ui_color ui_element_instance_callback::getSysColor(int sysColorIndex) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 GUID guid = ui_color_from_sys_color_index( sysColorIndex );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 if ( guid != pfc::guid_null ) return query_std_color(guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 return GetSysColor(sysColorIndex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 #endif
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 bool ui_element::g_find(service_ptr_t<ui_element> & out, const GUID & id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 return service_by_guid(out, id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 bool ui_element::g_get_name(pfc::string_base & p_out,const GUID & p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 ui_element::ptr ptr; if (!g_find(ptr,p_guid)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 ptr->get_name(p_out); return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 bool ui_element_instance_callback::is_elem_visible_(service_ptr_t<class ui_element_instance> elem) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 ui_element_instance_callback_v2::ptr v2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 if (!this->service_query_t(v2)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 PFC_ASSERT(!"Should not get here - somebody implemented ui_element_instance_callback but not ui_element_instance_callback_v2.");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 return v2->is_elem_visible(elem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 }
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 bool ui_element_instance_callback::set_elem_label(ui_element_instance * source, const char * label) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 return notify_(source, ui_element_host_notify_set_elem_label, 0, label, strlen(label)) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 t_uint32 ui_element_instance_callback::get_dialog_texture(ui_element_instance * source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 return (t_uint32) notify_(source, ui_element_host_notify_get_dialog_texture, 0, NULL, 0);
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 bool ui_element_instance_callback::is_border_needed(ui_element_instance * source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 return notify_(source, ui_element_host_notify_is_border_needed, 0, NULL, 0) != 0;
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 bool ui_element_instance_callback::is_dark_mode() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 t_ui_color clr = 0xFFFFFF;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 if (this->query_color(ui_color_darkmode, clr)) return clr == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 t_size ui_element_instance_callback::notify_(ui_element_instance * source, const GUID & what, t_size param1, const void * param2, t_size param2size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 ui_element_instance_callback_v3::ptr v3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 if (!this->service_query_t(v3)) { PFC_ASSERT(!"Outdated UI Element host implementation"); return 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 return v3->notify(source, what, param1, param2, param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 const ui_element_min_max_info & ui_element_min_max_info::operator|=(const ui_element_min_max_info & p_other) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 m_min_width = pfc::max_t(m_min_width,p_other.m_min_width);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 m_min_height = pfc::max_t(m_min_height,p_other.m_min_height);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 m_max_width = pfc::min_t(m_max_width,p_other.m_max_width);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 m_max_height = pfc::min_t(m_max_height,p_other.m_max_height);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 return *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 ui_element_min_max_info ui_element_min_max_info::operator|(const ui_element_min_max_info & p_other) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 ui_element_min_max_info ret(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 ret |= p_other;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 void ui_element_min_max_info::adjustForWindow(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 RECT client = {0,0,10,10};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 RECT adjusted = client;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 BOOL bMenu = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 const DWORD style = (DWORD) GetWindowLong( wnd, GWL_STYLE );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 if ( style & WS_POPUP ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 bMenu = GetMenu( wnd ) != NULL;
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 if (AdjustWindowRectEx( &adjusted, style, bMenu, GetWindowLong(wnd, GWL_EXSTYLE) )) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 int dx = (adjusted.right - adjusted.left) - (client.right - client.left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 int dy = (adjusted.bottom - adjusted.top) - (client.bottom - client.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 if ( dx < 0 ) dx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 if ( dy < 0 ) dy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 m_min_width += dx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 m_min_height += dy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 if ( m_max_width != ~0 ) m_max_width += dx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 if ( m_max_height != ~0 ) m_max_height += dy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 //! Retrieves element's minimum/maximum window size. Default implementation will fall back to WM_GETMINMAXINFO.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 ui_element_min_max_info ui_element_instance::get_min_max_info() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 ui_element_min_max_info ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 MINMAXINFO temp = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 temp.ptMaxTrackSize.x = 1024*1024;//arbitrary huge number
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 temp.ptMaxTrackSize.y = 1024*1024;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 SendMessage(this->get_wnd(),WM_GETMINMAXINFO,0,(LPARAM)&temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 if (temp.ptMinTrackSize.x >= 0) ret.m_min_width = temp.ptMinTrackSize.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 if (temp.ptMaxTrackSize.x > 0) ret.m_max_width = temp.ptMaxTrackSize.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 if (temp.ptMinTrackSize.y >= 0) ret.m_min_height = temp.ptMinTrackSize.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 if (temp.ptMaxTrackSize.y > 0) ret.m_max_height = temp.ptMaxTrackSize.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 ui_element_min_max_info ui_element_instance::get_min_max_info() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 return {};
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 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 class ui_element_replace_dialog_notify_impl : public ui_element_replace_dialog_notify {
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 void on_cancelled() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 reply(pfc::guid_null);
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 void on_ok(const GUID & guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 reply(guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 std::function<void(GUID)> reply;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 ui_element_replace_dialog_notify::ptr ui_element_replace_dialog_notify::create(std::function<void(GUID)> reply) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 auto obj = fb2k::service_new<ui_element_replace_dialog_notify_impl>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 obj->reply = reply;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 return obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 bool ui_config_manager::is_dark_mode() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 t_ui_color clr = 0xFFFFFF;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 if (this->query_color(ui_color_darkmode, clr)) return clr == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 bool ui_config_manager::g_is_dark_mode() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 auto api = tryGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 if (api.is_valid()) return api->is_dark_mode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 else return false;
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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 t_ui_color ui_config_manager::getSysColor(int sysColorIndex) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 GUID guid = ui_color_from_sys_color_index(sysColorIndex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 if (guid != pfc::guid_null) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 t_ui_color ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 if (query_color(guid, ret)) return ret;
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 return GetSysColor(sysColorIndex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 ui_config_callback_impl::ui_config_callback_impl() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 auto api = ui_config_manager::tryGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 if (api.is_valid()) api->add_callback(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 ui_config_callback_impl::~ui_config_callback_impl() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 auto api = ui_config_manager::tryGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 if (api.is_valid()) api->remove_callback(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 }