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;
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));
}
}
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));
}
}
}
}
}
-
- 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));
- }
- }
}