aboutsummaryrefslogtreecommitdiff
path: root/teensy/teensy_ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'teensy/teensy_ui.c')
-rw-r--r--teensy/teensy_ui.c55
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)
{