4747#include " ekg/ui/slider/slider.hpp"
4848#include " ekg/ui/slider/widget.hpp"
4949
50+ #include " ekg/ui/popup/popup.hpp"
51+ #include " ekg/ui/popup/widget.hpp"
52+
5053namespace ekg ::core {
5154 void registry (ekg::property_t &property);
5255}
@@ -59,20 +62,32 @@ namespace ekg::core {
5962 if (descriptor == descriptor_t ::not_found) { \
6063 break ; \
6164 } \
65+ ekg::core::widget_call_result = true ; \
6266 todo \
6367 break ; \
6468 }
6569
70+ namespace ekg ::core {
71+ extern bool widget_call_result;
72+ }
73+
6674#define ekg_core_widget_call (widget_descriptor_type, widget_descriptor_at, todo ) \
75+ ekg::core::widget_call_result = false ; \
6776 switch (widget_descriptor_type) { \
6877 ekg_core_widget_call_impl (ekg::frame_t , widget_descriptor_at, todo); \
6978 ekg_core_widget_call_impl (ekg::button_t , widget_descriptor_at, todo); \
7079 ekg_core_widget_call_impl (ekg::label_t , widget_descriptor_at, todo); \
7180 ekg_core_widget_call_impl (ekg::scrollbar_t , widget_descriptor_at, todo); \
7281 ekg_core_widget_call_impl (ekg::slider_t , widget_descriptor_at, todo); \
82+ ekg_core_widget_call_impl (ekg::popup_t , widget_descriptor_at, todo); \
7383 }
7484
75- #define ekg_registry_widget (widget_descriptor_t, register_widget_pool, register_property_pool, is_container, register_settings ) \
85+ #define ekg_core_unique_widget_call (descriptor_t, widget_descriptor_type, widget_descriptor_at, todo ) \
86+ switch (widget_descriptor_type) { \
87+ ekg_core_widget_call_impl (descriptor_t , widget_descriptor_at, todo); \
88+ }
89+
90+ #define ekg_registry_widget_impl (widget_descriptor_t, register_widget_pool, register_property_pool, is_container, register_settings ) \
7691 widget_descriptor_t &widget { \
7792 register_widget_pool.push_back ( \
7893 ekg::io::any_static_cast<widget_descriptor_t >(&descriptor) \
@@ -100,13 +115,13 @@ namespace ekg::core {
100115 ekg::property_t &parent {ekg::query<ekg::property_t >(ekg::gui.bind .parent_at )}; \
101116 if (is_container) { \
102117 if (parent != ekg::property_t ::not_found && widget.dock != ekg::dock::none) { \
118+ property.parent_at = parent.at ; \
103119 parent.children .push_back (widget.at ); \
104- property.parent_at = ekg::gui.bind .parent_at ; \
105120 property.abs_parent_at = parent.abs_parent_at ; \
106- } else { \
107- ekg::gui.bind .parent_at = property.at ; \
121+ } else if (parent == ekg::property_t ::not_found) { \
108122 property.abs_parent_at = property.at ; \
109123 } \
124+ ekg::gui.bind .parent_at = property.at ; \
110125 } else if (parent != ekg::property_t ::not_found) { \
111126 property.parent_at = ekg::gui.bind .parent_at ; \
112127 property.abs_parent_at = parent.abs_parent_at ; \
@@ -137,6 +152,9 @@ namespace ekg {
137152
138153 ekg::pool<ekg::property_t > slider_property {};
139154 ekg::pool<ekg::slider_t > slider {};
155+
156+ ekg::pool<ekg::property_t > popup_property {};
157+ ekg::pool<ekg::popup_t > popup {};
140158 } pools;
141159
142160 template <typename t>
@@ -178,6 +196,10 @@ namespace ekg {
178196 return ekg::io::any_static_cast<t>(
179197 &ekg::pools.slider_property .query (at)
180198 );
199+ case ekg::type::popup:
200+ return ekg::io::any_static_cast<t>(
201+ &ekg::pools.popup_property .query (at)
202+ );
181203 }
182204 case ekg::type::button:
183205 return ekg::io::any_static_cast<t>(
@@ -199,18 +221,22 @@ namespace ekg {
199221 return ekg::io::any_static_cast<t>(
200222 &ekg::pools.slider .query (at)
201223 );
224+ case ekg::type::popup:
225+ return ekg::io::any_static_cast<t>(
226+ &ekg::pools.popup .query (at)
227+ );
202228 }
203229
204230 return t::not_found;
205231 }
206232
207233 template <typename t>
208234 t &make (
209- t descriptor
235+ t descriptor = {}
210236 ) {
211237 switch (t::type) {
212238 case ekg::type::frame: {
213- ekg_registry_widget (
239+ ekg_registry_widget_impl (
214240 ekg::frame_t ,
215241 ekg::pools.frame ,
216242 ekg::pools.frame_property ,
@@ -224,7 +250,7 @@ namespace ekg {
224250 }
225251
226252 case ekg::type::button: {
227- ekg_registry_widget (
253+ ekg_registry_widget_impl (
228254 ekg::button_t ,
229255 ekg::pools.button ,
230256 ekg::pools.button_property ,
@@ -238,7 +264,7 @@ namespace ekg {
238264 }
239265
240266 case ekg::type::label: {
241- ekg_registry_widget (
267+ ekg_registry_widget_impl (
242268 ekg::label_t ,
243269 ekg::pools.label ,
244270 ekg::pools.label_property ,
@@ -252,7 +278,7 @@ namespace ekg {
252278 }
253279
254280 case ekg::type::scrollbar: {
255- ekg_registry_widget (
281+ ekg_registry_widget_impl (
256282 ekg::scrollbar_t ,
257283 ekg::pools.scrollbar ,
258284 ekg::pools.scrollbar_property ,
@@ -266,7 +292,7 @@ namespace ekg {
266292 }
267293
268294 case ekg::type::slider: {
269- ekg_registry_widget (
295+ ekg_registry_widget_impl (
270296 ekg::slider_t ,
271297 ekg::pools.slider ,
272298 ekg::pools.slider_property ,
@@ -279,6 +305,23 @@ namespace ekg {
279305 );
280306 }
281307
308+ case ekg::type::popup: {
309+ ekg_registry_widget_impl (
310+ ekg::popup_t ,
311+ ekg::pools.popup ,
312+ ekg::pools.popup_property ,
313+ true ,
314+ {
315+ property.is_childnizate = true ;
316+ property.is_stack_top_level = true ;
317+ property.is_children_docknizable = true ;
318+ property.states .is_visible = false ;
319+
320+ widget.color_scheme = global_theme.popup_color_scheme ;
321+ }
322+ );
323+ }
324+
282325 case ekg::type::stack: {
283326 ekg::stack_t &stack {
284327 ekg::pools.stack .push_back (
@@ -308,6 +351,24 @@ namespace ekg {
308351
309352 return t::not_found;
310353 }
354+
355+ template <typename t>
356+ void pop () {
357+ switch (t::type) {
358+ case ekg::type::stack:
359+ ekg::gui.bind .stack_at = ekg::at_t ::not_found;
360+ break ;
361+ case ekg::type::property:
362+ ekg::gui.bind .parent_at = ekg::query<ekg::property_t >(ekg::gui.bind .parent_at ).parent_at ;
363+ break ;
364+ case ekg::type::frame:
365+ ekg::gui.bind .parent_at = ekg::query<ekg::property_t >(ekg::gui.bind .parent_at ).parent_at ;
366+ break ;
367+ case ekg::type::popup:
368+ ekg::gui.bind .parent_at = ekg::query<ekg::property_t >(ekg::gui.bind .parent_at ).parent_at ;
369+ break ;
370+ }
371+ }
311372}
312373
313374#endif
0 commit comments