annotate foosdk/sdk/foobar2000/helpers/ui_element_helpers.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 #include <SDK/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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // ====================================================================================================
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // ui_element_helpers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 // A framework for creating UI Elements that host other elements.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 // All foo_ui_std elements that host other elements - such as splitters or tabs - are based on this.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 // Note that API 79 (v1.4) or newer is required, earlier did not provide ui_element_common_methods_v3.
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 #if FOOBAR2000_TARGET_VERSION >= 79
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 #include <memory>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 namespace ui_element_helpers {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 template<typename t_receiver> class ui_element_instance_callback_multi_impl : public ui_element_instance_callback_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 ui_element_instance_callback_multi_impl(t_size id, t_receiver * p_receiver) : m_receiver(p_receiver), m_id(id) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 void on_min_max_info_change() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 if (m_receiver != NULL) m_receiver->on_min_max_info_change();
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 bool query_color(const GUID & p_what,t_ui_color & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 if (m_receiver != NULL) return m_receiver->query_color(p_what,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 else return false;
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 bool request_activation(service_ptr_t<class ui_element_instance> p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 if (m_receiver) return m_receiver->request_activation(m_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 else return false;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 bool is_edit_mode_enabled() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 if (m_receiver) return m_receiver->is_edit_mode_enabled();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 else return false;
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 void request_replace(service_ptr_t<class ui_element_instance> p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 if (m_receiver) m_receiver->request_replace(m_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
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 t_ui_font query_font_ex(const GUID & p_what) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (m_receiver) return m_receiver->query_font_ex(p_what);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 else return NULL;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 t_size 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
49 if (m_receiver) return m_receiver->host_notify(source, what, param1, param2, param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 else return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 void orphan() {m_receiver = NULL;}
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 bool is_elem_visible(service_ptr_t<class ui_element_instance> elem) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (m_receiver) return m_receiver->is_elem_visible(m_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 else return false;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 void override_id(t_size id) {m_id = id;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 void on_alt_pressed(bool) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 t_size m_id;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 t_receiver * m_receiver;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 class ui_element_instance_callback_receiver_multi {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 virtual void on_min_max_info_change() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 virtual bool query_color(const GUID & p_what,t_ui_color & p_out) {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 virtual bool request_activation(t_size which) {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 virtual bool is_edit_mode_enabled() {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 virtual void request_replace(t_size which) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 virtual t_ui_font query_font_ex(const GUID&) {return NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 virtual bool is_elem_visible(t_size which) {return true;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 virtual t_size host_notify(ui_element_instance * source, const GUID & what, t_size param1, const void * param2, t_size param2size) {return 0;}
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 void ui_element_instance_callback_handle_remove(bit_array const & mask, t_size const oldCount) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 t_callback_list newCallbacks;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 t_size newWalk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 for(t_size walk = 0; walk < oldCount; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 if (mask[walk]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 t_callback_ptr ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 if (m_callbacks.query(walk,ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 ptr->orphan(); m_callbacks.remove(walk);
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 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 if (newWalk != walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 t_callback_ptr ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 if (m_callbacks.query(walk,ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 m_callbacks.remove(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 ptr->override_id(newWalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 m_callbacks.set(newWalk,ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
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 ++newWalk;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 void ui_element_instance_callback_handle_reorder(const t_size * order, t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 t_callback_list newCallbacks;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 for(t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 t_callback_ptr ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 if (m_callbacks.query(order[walk],ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 ptr->override_id(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 newCallbacks.set(walk,ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 m_callbacks.remove(order[walk]);
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 }
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 PFC_ASSERT( m_callbacks.get_count() == 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 ui_element_instance_callback_release_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 m_callbacks = newCallbacks;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 ui_element_instance_callback_ptr ui_element_instance_callback_get_ptr(t_size which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 t_callback_ptr ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 if (!m_callbacks.query(which,ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 ptr = new service_impl_t<t_callback>(which,this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 m_callbacks.set(which,ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 return ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 ui_element_instance_callback_ptr ui_element_instance_callback_create(t_size which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 ui_element_instance_callback_release(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 t_callback_ptr ptr = new service_impl_t<t_callback>(which,this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 m_callbacks.set(which,ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 return ptr;
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 void ui_element_instance_callback_release_all() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 for(t_callback_list::const_iterator walk = m_callbacks.first(); walk.is_valid(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 walk->m_value->orphan();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 m_callbacks.remove_all();
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 void ui_element_instance_callback_release(t_size which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 t_callback_ptr ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 if (m_callbacks.query(which,ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 ptr->orphan();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 m_callbacks.remove(which);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 ~ui_element_instance_callback_receiver_multi() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 ui_element_instance_callback_release_all();
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 ui_element_instance_callback_receiver_multi() {}
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 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 typedef ui_element_instance_callback_receiver_multi t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 typedef ui_element_instance_callback_multi_impl<t_self> t_callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 typedef service_ptr_t<t_callback> t_callback_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 typedef pfc::map_t<t_size,t_callback_ptr> t_callback_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 t_callback_list m_callbacks;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 //! Parses container tree to find configuration of specified element inside a layout configuration.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 bool recurse_for_elem_config(ui_element_config::ptr root, ui_element_config::ptr & out, const GUID & toFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 ui_element_instance_ptr create_root_container(HWND p_parent,ui_element_instance_callback_ptr p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 ui_element_instance_ptr instantiate(HWND p_parent,ui_element_config::ptr cfg,ui_element_instance_callback_ptr p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 ui_element_instance_ptr instantiate_dummy(HWND p_parent,ui_element_config::ptr cfg,ui_element_instance_callback_ptr p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 ui_element_instance_ptr update(ui_element_instance_ptr p_element,HWND p_parent,ui_element_config::ptr cfg,ui_element_instance_callback_ptr p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 bool find(service_ptr_t<ui_element> & p_out,const GUID & p_guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 ui_element_children_enumerator_ptr enumerate_children(ui_element_config::ptr cfg);
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 void replace_with_new_element(ui_element_instance_ptr & p_item,const GUID & p_guid,HWND p_parent,ui_element_instance_callback_ptr p_callback);
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 class ui_element_highlight_scope {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 ui_element_highlight_scope(HWND wndElem) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 m_highlight = ui_element_common_methods_v3::get()->highlight_element( wndElem );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 ~ui_element_highlight_scope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 DestroyWindow(m_highlight);
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 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 ui_element_highlight_scope(const ui_element_highlight_scope&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 void operator=(const ui_element_highlight_scope&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 HWND m_highlight;
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 //! Helper class; provides edit-mode context menu functionality and interacts with "Replace UI Element" dialog. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 //! Do not use directly - derive from ui_element_instance_host_base instead.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 class ui_element_edit_tools {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 //! Override me
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 virtual void host_replace_element(unsigned p_id, ui_element_config::ptr cfg) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 //! Override me
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 virtual void host_replace_element(unsigned p_id,const GUID & p_newguid) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 //! Override me optionally if you customize edit mode context menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 virtual bool host_edit_mode_context_menu_test(unsigned p_childid,const POINT & p_point,bool p_fromkeyboard) {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 //! Override me optionally if you customize edit mode context menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 virtual void host_edit_mode_context_menu_build(unsigned p_childid,const POINT & p_point,bool p_fromkeyboard,HMENU p_menu,unsigned & p_id_base) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 //! Override me optionally if you customize edit mode context menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 virtual void host_edit_mode_context_menu_command(unsigned p_childid,const POINT & p_point,bool p_fromkeyboard,unsigned p_id,unsigned p_id_base) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 //! Override me optionally if you customize edit mode context menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 virtual bool host_edit_mode_context_menu_get_description(unsigned p_childid,unsigned p_id,unsigned p_id_base,pfc::string_base & p_out) {return false;}
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 //! Initiates "Replace UI Element" dialog for one of your sub-elements.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 void replace_dialog(HWND p_parent,unsigned p_id,const GUID & p_current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 //! Shows edit mode context menu for your element.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 void standard_edit_context_menu(LPARAM p_point,ui_element_instance_ptr p_item,unsigned p_id,HWND p_parent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 static const char * description_from_menu_command(unsigned p_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 bool host_paste_element(unsigned p_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 BEGIN_MSG_MAP(ui_element_edit_tools)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 MESSAGE_HANDLER(WM_DESTROY,OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 ui_element_edit_tools() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 void on_elem_replace(unsigned p_id,GUID const & newElem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 void _release_replace_dialog();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 LRESULT OnDestroy(UINT,WPARAM,LPARAM,BOOL& bHandled) {bHandled = FALSE; *m_killSwitch = true; _release_replace_dialog(); return 0;}
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 CWindow m_replace_dialog;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 std::shared_ptr<bool> m_killSwitch = std::make_shared<bool>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 ui_element_edit_tools( const ui_element_edit_tools & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 void operator=( const ui_element_edit_tools & ) = delete;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 //! Base class for ui_element_instances that host other elements.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 class ui_element_instance_host_base : public ui_element_instance, protected ui_element_instance_callback_receiver_multi, protected ui_element_edit_tools {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 // Any derived class must pass their messages to us, by CHAIN_MSG_MAP(ui_element_instance_host_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 BEGIN_MSG_MAP(ui_element_instance_host_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 CHAIN_MSG_MAP(ui_element_edit_tools)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 MESSAGE_HANDLER(WM_SETTINGCHANGE,OnSettingChange);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 //override me
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 virtual ui_element_instance_ptr host_get_child(t_size which) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 //override me
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 virtual t_size host_get_children_count() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 //override me (tabs)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 virtual void host_bring_to_front(t_size which) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 //override me
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 virtual void on_min_max_info_change() {m_callback->on_min_max_info_change();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 //override me
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 virtual void host_replace_child(t_size which) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 virtual bool host_is_child_visible(t_size which) {return true;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 void host_child_visibility_changed(t_size which, bool state) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 if (m_callback->is_elem_visible_(this)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 ui_element_instance::ptr item = host_get_child(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 if (item.is_valid()) item->notify(ui_element_notify_visibility_changed,state ? 1 : 0,NULL,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 bool is_elem_visible(t_size which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 if (!m_callback->is_elem_visible_(this)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 return this->host_is_child_visible(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 }
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 GUID get_subclass() {return ui_element_subclass_containers;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 double get_focus_priority() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 ui_element_instance_ptr item; double priority; t_size which;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 if (!grabTopPriorityVisibleChild(item,which,priority)) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 return priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 void set_default_focus() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 ui_element_instance_ptr item; double priority; t_size which;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 if (!grabTopPriorityVisibleChild(item,which,priority)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 this->set_default_focus_fallback();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 host_bring_to_front(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 item->set_default_focus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 bool get_focus_priority_subclass(double & p_out,const GUID & p_subclass) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 ui_element_instance_ptr item; double priority; t_size which;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 if (!grabTopPriorityChild(item,which,priority,p_subclass)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 p_out = priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 bool set_default_focus_subclass(const GUID & p_subclass) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 ui_element_instance_ptr item; double priority; t_size which;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 if (!grabTopPriorityChild(item,which,priority,p_subclass)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 host_bring_to_front(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 return item->set_default_focus_subclass(p_subclass);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 void notify(const GUID & p_what, t_size p_param1, const void * p_param2, t_size p_param2size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 if (p_what == ui_element_notify_visibility_changed) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 const t_size total = host_get_children_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 for(t_size walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 if (this->host_is_child_visible(walk)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 ui_element_instance_ptr item = host_get_child(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 if (item.is_valid()) item->notify(p_what,p_param1,p_param2,p_param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 } else if (p_what == ui_element_notify_get_element_labels) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 handleGetLabels(p_param1, p_param2, p_param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 const t_size total = host_get_children_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 for(t_size walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 ui_element_instance_ptr item = host_get_child(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 if (item.is_valid()) item->notify(p_what,p_param1,p_param2,p_param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 bool query_color(const GUID & p_what,t_ui_color & p_out) {return m_callback->query_color(p_what,p_out);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 bool request_activation(t_size which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 if (!m_callback->request_activation(this)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 host_bring_to_front(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 bool is_edit_mode_enabled() {return m_callback->is_edit_mode_enabled();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 t_ui_font query_font_ex(const GUID& id) {return m_callback->query_font_ex(id);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 void request_replace(t_size which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 host_replace_child(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 void handleGetLabelsChild(ui_element_instance::ptr child, t_size which, t_size param1, const void * param2, t_size param2size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 if (child->get_subclass() == ui_element_subclass_containers) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 child->notify(ui_element_notify_get_element_labels, param1, param2, param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 } else if (child->get_guid() != pfc::guid_null && child->get_wnd() != NULL && this->host_is_child_visible(which)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 FB2K_DYNAMIC_ASSERT(param2 != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 reinterpret_cast<ui_element_notify_get_element_labels_callback*>(const_cast<void*>(param2))->set_visible_element(child);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 void handleGetLabels(t_size param1, const void * param2, t_size param2size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 const t_size childrenTotal = host_get_children_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 for(t_size childWalk = 0; childWalk < childrenTotal; ++childWalk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 ui_element_instance_ptr item = host_get_child(childWalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 if (item.is_valid()) handleGetLabelsChild(item, childWalk, param1, param2, param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 LRESULT OnSettingChange(UINT msg,WPARAM wp,LPARAM lp,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 const t_size total = host_get_children_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 for(t_size walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 ui_element_instance::ptr item = host_get_child(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 if (item.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 ::SendMessage(item->get_wnd(),msg,wp,lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 t_size whichChild(ui_element_instance_ptr child) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 const t_size count = host_get_children_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 for(t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 if (child == host_get_child(walk)) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 return ~0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 bool childPriorityCompare(t_size which, double priority, double bestPriority) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 if (host_is_child_visible(which)) return priority >= bestPriority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 else return priority > bestPriority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 bool grabTopPriorityVisibleChild(ui_element_instance_ptr & out,t_size & outWhich,double & outPriority);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 bool grabTopPriorityChild(ui_element_instance_ptr & out,t_size & outWhich,double & outPriority,const GUID & subclass);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 ui_element_instance_host_base(ui_element_instance_callback::ptr callback) : m_callback(callback) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 const ui_element_instance_callback::ptr m_callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 bool enforce_min_max_info(CWindow p_window,ui_element_min_max_info const & p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 void handle_WM_GETMINMAXINFO(LPARAM p_lp,const ui_element_min_max_info & p_myinfo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 void ui_element_instance_standard_context_menu(service_ptr_t<ui_element_instance> p_elem, LPARAM p_pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 void ui_element_instance_standard_context_menu_eh(service_ptr_t<ui_element_instance> p_elem, LPARAM p_pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 #endif // FOOBAR2000_TARGET_VERSION >= 79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 #endif // _WIN32