using #tag for customizable config options
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 6 Oct 2021 03:22:17 +0000 (22:22 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 6 Oct 2021 03:22:17 +0000 (22:22 -0500)
src/app/colors.onyx
src/app/settings.onyx

index 64c57bb4f369b7a6cdeafa1fb94c2d5ad68b879e..4553dc7af69679aa8995160ee8e9553ed478e26e 100644 (file)
@@ -101,4 +101,10 @@ update_ui_colors :: () {
     ui.default_radio_theme.selected_color = config.Colors.secondary;
     ui.default_radio_theme.hover_color = config.Colors.primary;
     ui.default_radio_theme.click_color = config.Colors.primary_light;
+
+    ui.default_slider_theme.text_color       = config.Colors.primary_text;
+    ui.default_slider_theme.box_color        = config.Colors.primary_dark;
+    ui.default_slider_theme.box_border_color = config.Colors.primary;
+    ui.default_slider_theme.bar_hover_color  = config.Colors.secondary;
+    ui.default_slider_theme.bar_color        = config.Colors.primary_light;
 }
index 04ed206c1f8dfc75177011d3fcbade9352808640..3e558583679b0f4cf52ce1eb89f733c76c47b537 100644 (file)
@@ -12,25 +12,10 @@ package app
 
 Application_Settings :: struct {
     colorscheme := Colorscheme.Undefined;
-
-    coolness : Slider_Option(i32) = .{ 5, 0, 5 };
-    badness  : Slider_Option(f32) = .{ 0, 0, 10 };
-
-    test  : Test = .{ 5, 5 };
-    test2 : Test = .{ 0, 0 };
-    wrapped : Wrapper = .{ value = 40 };
-
-    Test :: struct { x: i32; y: f32; }
-    Wrapper :: struct {
-        test := Test.{ 10, 10 };
-        value: i32;
-    }
 }
 
-Slider_Option :: struct (T: type_expr) {
-    value: T;
-    min, max: T;
-}
+Slider_Int   :: struct { min, max: i32; }
+Slider_Float :: struct { min, max: f32; }
 
 settings_save :: (settings: ^Application_Settings) {
     use type_info;
@@ -163,27 +148,29 @@ settings_window_draw :: (obj: ^any, win: ^Application_Window) {
                     struct_type := cast(^Type_Info_Struct) member_type;
                     sub_object := cast(rawptr) (cast(^u8) obj.data + member.offset);
 
-                    switch member.type {
-                        case #type Slider_Option(i32) do render_slider_option(i32, sub_object);
-                        case #type Slider_Option(f32) do render_slider_option(f32, sub_object);
+                    rect.x0 += 32;
+                    defer rect.x0 -= 32;
 
-                        case #default {
-                            rect.x0 += 32;
-                            defer rect.x0 -= 32;
-
-                            sub_object_any := any.{ sub_object, member.type };
-                            render_settings(rect, win_rect, ^sub_object_any);
-                        }
-                    }
+                    sub_object_any := any.{ sub_object, member.type };
+                    render_settings(rect, win_rect, ^sub_object_any);
                 }
 
                 case .Basic do switch member.type {
                     case i32 {
                         value := cast(^i32) (cast(^u8) obj.data + member.offset);
 
+                        low, high : i32;
+                        low, high = 0, 10;
+
+                        if elem := array.first(member.tags, (x) => x.type == Slider_Int); elem != null {
+                            slider_int := cast(^Slider_Int) elem.data;
+                            low  = slider_int.min;
+                            high = slider_int.max;
+                        }
+
                         tmp_rect, *rect = ui.Flow.split_horizontal(*rect, top_height=32);
                         if ui.Rectangle.intersects(tmp_rect, win_rect) {
-                            ui.slider(tmp_rect, value, -10, 10, increment=counter);
+                            ui.slider(tmp_rect, value, low, high, increment=counter);
                             ui.draw_text(tmp_rect, conv.str_format(msg_buffer, "   Current: {}", *value));
                         }
                     }
@@ -191,9 +178,18 @@ settings_window_draw :: (obj: ^any, win: ^Application_Window) {
                     case f32 {
                         value := cast(^f32) (cast(^u8) obj.data + member.offset);
 
+                        low, high : f32;
+                        low, high = 0, 1;
+
+                        if elem := array.first(member.tags, (x) => x.type == Slider_Float); elem != null {
+                            slider_int := cast(^Slider_Float) elem.data;
+                            low  = slider_int.min;
+                            high = slider_int.max;
+                        }
+
                         tmp_rect, *rect = ui.Flow.split_horizontal(*rect, top_height=32);
                         if ui.Rectangle.intersects(tmp_rect, win_rect) {
-                            ui.slider(tmp_rect, value, 0, 100, increment=counter);
+                            ui.slider(tmp_rect, value, low, high, increment=counter);
                             ui.draw_text(tmp_rect, conv.str_format(msg_buffer, "   Current: {}", *value));
                         }
                     }
@@ -201,15 +197,4 @@ settings_window_draw :: (obj: ^any, win: ^Application_Window) {
             }
         }
     }
-
-    render_slider_option :: macro ($T: type_expr, so: rawptr) {
-        so_ := cast(^Slider_Option(T)) so;
-
-        tmp_rect, *rect = ui.Flow.split_horizontal(*rect, top_height=32);
-
-        if ui.Rectangle.intersects(tmp_rect, win_rect) {
-            ui.slider(tmp_rect, ^so_.value, so_.min, so_.max, increment=counter);
-            ui.draw_text(tmp_rect, conv.str_format(msg_buffer, "   Current: {}", so_.value));
-        }
-    }
 }