diff options
Diffstat (limited to 'teensy/teensy_ui.c')
| -rw-r--r-- | teensy/teensy_ui.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/teensy/teensy_ui.c b/teensy/teensy_ui.c index a0bb5e3..c58113c 100644 --- a/teensy/teensy_ui.c +++ b/teensy/teensy_ui.c @@ -88,6 +88,7 @@ tyui_Style default_style = { .padding = 1, .control_padding = 2, .frame_size = 1, + .grabber_size = 4, }; static @@ -450,6 +451,60 @@ bool tyui_button(const char *text) return clicked; } +void tyui_slider_ex( + float min, + float max, + float *value_ptr, + bool show_value, + tyui_Align value_align +) { + assert(value_ptr); + + const int grabber_size = uictx.style.grabber_size; + + ty_Recti rect = next_rect(TEXT_HEIGHT + control_padding() * 2); + ty_Color bg_col = uictx.style.bg_normal; + ty_Color fg_col = uictx.style.fg_normal; + + bool clicked = false; + if (is_hovered(rect)) { + clicked = window()->has_lmb; + if (ty_button_down(TY_BTN_DB_LMB)) { + bg_col = uictx.style.bg_pressed; + fg_col = uictx.style.fg_pressed; + } else { + bg_col = uictx.style.bg_hover; + fg_col = uictx.style.fg_hover; + } + } + + if (clicked) { + ty_Vec2i mp = ty_mouse_pos(); + float x = mp.x - rect.x; + float p = x / (rect.w - 1); + *value_ptr = ty_clamp(p * (max - min) + min, min, max); + } + + float value = *value_ptr; + + draw_frame(rect, bg_col); + if (show_value) + text_cmd(ty_format("%d", (int)round(value)), rect, value_align); + + // Grabber + { + float p = (value - min) / max; + int x = (rect.w - grabber_size) * p + rect.x; + + ty_Recti grabber_rect = ty_recti( + x, rect.y, + grabber_size, rect.h + ); + + draw_frame(grabber_rect, fg_col); + } +} + static void draw_window(Window *win) { |
