Skip to content

Commit 45784d4

Browse files
committed
[update] slider working but needs some geometry-repairs
1 parent 6356b02 commit 45784d4

File tree

4 files changed

+149
-12
lines changed

4 files changed

+149
-12
lines changed

include/ekg/ui/slider/slider.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ namespace ekg {
6363
ekg::value<char[8]> min {};
6464
ekg::value<char[8]> max {};
6565
ekg::flags_t dock {ekg::dock::left};
66-
ekg::flags_t dock_text {ekg::dock::center};
66+
ekg::flags_t dock_text {ekg::dock::right};
6767
ekg::font font_size {ekg::font::medium};
6868
ekg::at_array_t<ekg::layer, ekg::enum_layer_size> layers {};
6969
ekg::at_array_t<ekg::action, ekg::enum_action_size> actions {};

include/ekg/ui/slider/widget.hpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,53 @@ namespace ekg::ui {
6969
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::u8, uint8_t, todo);
7070

7171
namespace ekg::ui {
72+
template<typename t>
73+
void calculate_value_by_factor(
74+
ekg::slider_t::range_t &range,
75+
ekg::vec2_t<float> &factor,
76+
const ekg::axis &axis,
77+
t &min, t &max, t &value
78+
) {
79+
value = ekg::clamp<t>(value, min, max);
80+
switch (axis) {
81+
case ekg::axis::horizontal:
82+
if (static_cast<ekg::pixel_t>(factor.x) == 0) {
83+
value = min;
84+
break;
85+
}
86+
87+
value = (factor.x / range.widget.rect_bar.w) * (max - min) + min;
88+
break;
89+
case ekg::axis::vertical:
90+
if (static_cast<ekg::pixel_t>(factor.y) == 0) {
91+
value = min;
92+
break;
93+
}
94+
95+
value = (factor.y / range.widget.rect_bar.h) * (max - min) + min;
96+
break;
97+
}
98+
}
99+
100+
template<typename t>
101+
void calculate_bar_progress_by_value(
102+
ekg::slider_t::range_t &range,
103+
const ekg::axis &axis,
104+
t &min, t &max, t &value
105+
) {
106+
value = ekg::clamp<t>(value, min, max);
107+
switch (axis) {
108+
case ekg::axis::horizontal:
109+
range.widget.rect_bar_progress.w = range.widget.rect_bar.w * (value - min) / (max - min);
110+
range.widget.rect_target.x = range.widget.rect_bar_progress.w - (range.widget.rect_target.w * 0.5f);
111+
break;
112+
case ekg::axis::vertical:
113+
range.widget.rect_bar_progress.h = range.widget.rect_bar.h * (value - min) / (max - min);
114+
range.widget.rect_target.y = range.widget.rect_bar_progress.h - (range.widget.rect_target.h * 0.5f);
115+
break;
116+
}
117+
}
118+
72119
void reload(
73120
ekg::property_t &property,
74121
ekg::slider_t &slider

src/handler/theme/handler.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,10 @@ void ekg::handler::theme::init() {
6767

6868
light_pinky_theme.slider_color_scheme.outline = {204, 204, 204, 0};
6969
light_pinky_theme.slider_color_scheme.background = {204, 204, 204, 30};
70-
light_pinky_theme.slider_color_scheme.bar_background = {245, 169, 184, 100};
70+
light_pinky_theme.slider_color_scheme.bar_background = {204, 204, 204, 50};
7171
light_pinky_theme.slider_color_scheme.bar_highlight = {245, 169, 184, 50};
7272
light_pinky_theme.slider_color_scheme.bar_active = {245, 169, 184, 100};
73+
light_pinky_theme.slider_color_scheme.text_foreground = {141, 141, 141, 255};
7374

7475
this->registry(light_pinky_theme.tag) = light_pinky_theme;
7576
this->set_current_theme(light_pinky_theme.tag);
@@ -114,9 +115,10 @@ void ekg::handler::theme::init() {
114115

115116
black_light_pinky_theme.slider_color_scheme.background = {204, 204, 204, 50};
116117
black_light_pinky_theme.slider_color_scheme.outline = {204, 204, 204, 0};
117-
black_light_pinky_theme.slider_color_scheme.bar_background = {245, 169, 184, 100};
118+
black_light_pinky_theme.slider_color_scheme.bar_background = {204, 204, 204, 50};
118119
black_light_pinky_theme.slider_color_scheme.bar_highlight = {245, 169, 184, 50};
119120
black_light_pinky_theme.slider_color_scheme.bar_active = {245, 169, 184, 100};
121+
black_light_pinky_theme.slider_color_scheme.text_foreground = {141, 141, 141, 255};
120122

121123
this->registry(black_light_pinky_theme.tag) = black_light_pinky_theme;
122124
//this->set_current_theme(black_light_pinky_theme.tag);

src/ui/slider/widget.cpp

Lines changed: 97 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void ekg::ui::reload(
3737
ekg::slider_t &slider
3838
) {
3939
constexpr ekg::pixel_t min_bar_width_factor {ekg::one_pixel * 4};
40-
ekg::pixel_t min_bar_width {slider.rect.w / min_bar_width};
40+
ekg::pixel_t min_bar_width {slider.rect.w / min_bar_width_factor};
4141

4242
ekg::theme_t &global_theme {ekg::p_core->handler_theme.get_current_theme()};
4343
ekg::aligned_t aligned_dimension {};
@@ -180,7 +180,75 @@ void ekg::ui::event(
180180
ekg::slider_t &slider,
181181
const ekg::io::stage &stage
182182
) {
183+
switch (stage) {
184+
case ekg::io::stage::process: {
185+
ekg::input_info_t &input {ekg::p_core->handler_input.input};
186+
if (!input.was_pressed && !input.was_released && !input.has_motion) {
187+
break;
188+
}
189+
190+
ekg::vec2_t<float> interact {static_cast<ekg::vec2_t<float>>(input.interact)};
191+
ekg::rect_t<float> &rect_abs {ekg::ui::get_abs_rect(property, slider.rect)};
192+
193+
if (property.states.is_hovering || property.states.is_active) {
194+
property.states.is_active = false;
195+
ekg::rect_t<float> bar {};
196+
197+
for (ekg::slider_t::range_t &range : slider.ranges) {
198+
bar = range.widget.rect_bar + rect_abs;
199+
range.widget.states.is_hovering = ekg::rect_collide_vec2<float>(bar, interact);
200+
201+
if (input.was_pressed && range.widget.states.is_hovering) {
202+
ekg_action(
203+
range.actions,
204+
ekg::action::press,
205+
(range.widget.states.is_active = true)
206+
);
207+
}
208+
209+
if (input.was_released && range.widget.states.is_active) {
210+
ekg_action(
211+
range.actions,
212+
ekg::action::release,
213+
(range.widget.states.is_active = false)
214+
);
215+
}
216+
217+
if (range.widget.states.is_active) {
218+
ekg::vec2_t<float> factor {
219+
ekg::max<float>(interact.x - bar.x, 0.0f),
220+
ekg::max<float>(interact.y - bar.y, 0.0f)
221+
};
222+
223+
ekg_ui_slider_range_task(
224+
range,
225+
{
226+
ekg::ui::calculate_value_by_factor(
227+
range,
228+
factor,
229+
ekg::axis::horizontal,
230+
min, max, value
231+
);
232+
}
233+
);
234+
235+
property.widget.should_buffering = true;
236+
ekg::gui.ui.redraw = true;
237+
property.states.is_active = true;
238+
}
239+
}
240+
}
183241

242+
break;
243+
}
244+
245+
case ekg::io::stage::pre:
246+
ekg::ui::pre_event(property, slider.rect, false);
247+
break;
248+
case ekg::io::stage::post:
249+
ekg::ui::post_event(property);
250+
break;
251+
}
184252
}
185253

186254
void ekg::ui::high_frequency(
@@ -231,8 +299,30 @@ void ekg::ui::buffering(
231299
);
232300

233301
ekg::rect_t<float> bar {};
302+
ekg::rect_t<float> bar_progress {};
303+
234304
for (ekg::slider_t::range_t &range : slider.ranges) {
305+
range.widget.rect_bar_progress = range.widget.rect_bar;
306+
307+
ekg_ui_slider_range_task(
308+
range,
309+
{
310+
ekg::ui::calculate_bar_progress_by_value(
311+
range,
312+
ekg::axis::horizontal,
313+
min, max, value
314+
);
315+
316+
ekg::utf8_number_precision(
317+
range.widget.text,
318+
value,
319+
range.precision
320+
);
321+
}
322+
);
323+
235324
bar = range.widget.rect_bar + rect_abs;
325+
bar_progress = range.widget.rect_bar_progress + rect_abs;
236326

237327
ekg::draw::rect(
238328
bar,
@@ -250,14 +340,12 @@ void ekg::ui::buffering(
250340
);
251341
}
252342

253-
if (range.widget.states.is_active) {
254-
ekg::draw::rect(
255-
bar,
256-
slider.color_scheme.bar_active,
257-
ekg::draw::mode::fill,
258-
range.layers[ekg::layer::active_bg]
259-
);
260-
}
343+
ekg::draw::rect(
344+
bar_progress,
345+
slider.color_scheme.bar_active,
346+
ekg::draw::mode::fill,
347+
range.layers[ekg::layer::active_bg]
348+
);
261349

262350
if (range.dock_text != ekg::dock::none) {
263351
ekg::draw::get_font_renderer(range.font_size)

0 commit comments

Comments
 (0)