@@ -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
186254void 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