Skip to content

Commit 09dd3e2

Browse files
authored
[feature][update] popup widget; memory-value w. fixed-formats (#53)
-- Added popup widget, popup is a frame with many widgets which can accept scrolling or recursive-frames. -- Added separator mode for label used in popup as separator. -- Frame color scheme is shared with popup. -- `ekg::value<t>` contains fixed formats instead no-rule formats (templated). -- New state named `sensitive` for be able internally answer popups better between other widgets. -- `ekg::show(popup_at, pos, should_if)` to invoke a created popup.
1 parent 00e3ae1 commit 09dd3e2

File tree

28 files changed

+1144
-209
lines changed

28 files changed

+1144
-209
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#
1212
# The above copyright notice and this permission notice shall be included in all
1313
# copies or substantial portions of the Software.
14-
#
14+
# 1
1515
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1616
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1717
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

cmake/properties.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
set(EKG_VERSION 2.5.0)
1+
set(EKG_VERSION 2.6.0)
22
set(EKG_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")
33

44
if(CMAKE_TOOLCHAIN_FILE)

include/ekg/core/pools.hpp

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
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+
5053
namespace 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

include/ekg/draw/allocator.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ namespace ekg {
6060
namespace ekg::draw {
6161
class allocator {
6262
public:
63-
static bool enable_high_priority;
63+
static bool is_scissor_sync_allowed;
6464
static bool is_simple_shape;
6565
protected:
6666
size_t global_data_instance {};

include/ekg/handler/theme.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "ekg/ui/label/label.hpp"
3030
#include "ekg/ui/scrollbar/scrollbar.hpp"
3131
#include "ekg/ui/slider/slider.hpp"
32+
#include "ekg/ui/popup/popup.hpp"
3233

3334
namespace ekg {
3435
struct theme_t {
@@ -44,6 +45,7 @@ namespace ekg {
4445
ekg::label_color_scheme_t label_color_scheme {};
4546
ekg::scrollbar_color_scheme_t scrollbar_color_scheme {};
4647
ekg::slider_color_scheme_t slider_color_scheme {};
48+
ekg::popup_color_scheme_t popup_color_scheme {};
4749
};
4850

4951
ekg::theme_t &theme(std::string tag = "");

include/ekg/io/descriptor.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ namespace ekg {
3838
frame = 7,
3939
slider = 8,
4040
label = 9,
41+
popup = 10,
4142
};
4243
}
4344

0 commit comments

Comments
 (0)