From dfbe4231a825dd75ba82740f081c542132bc7be9 Mon Sep 17 00:00:00 2001 From: Joonas Javanainen Date: Sat, 19 Sep 2020 20:02:58 +0300 Subject: [PATCH] Add basic slider examples --- imgui-examples/examples/slider.rs | 99 +++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 imgui-examples/examples/slider.rs diff --git a/imgui-examples/examples/slider.rs b/imgui-examples/examples/slider.rs new file mode 100644 index 0000000..01af3dc --- /dev/null +++ b/imgui-examples/examples/slider.rs @@ -0,0 +1,99 @@ +use imgui::*; + +mod support; + +fn main() { + let mut state = State::default(); + let system = support::init(file!()); + system.main_loop(move |run, ui| { + example_selector(run, ui, &mut state); + match state.example { + 1 => example_1(ui, &mut state), + 2 => example_2(ui, &mut state), + _ => (), + } + }); +} + +fn example_selector(run: &mut bool, ui: &mut Ui, state: &mut State) { + let w = Window::new(im_str!("Slider examples")) + .opened(run) + .position([20.0, 20.0], Condition::Appearing) + .size([700.0, 80.0], Condition::Appearing) + .resizable(false); + w.build(&ui, || { + let mut clicked = false; + clicked |= ui.radio_button(im_str!("Example 1: Basic sliders"), &mut state.example, 1); + clicked |= ui.radio_button(im_str!("Example 2: Slider arrays"), &mut state.example, 2); + if clicked { + state.reset(); + } + }); +} + +fn example_1(ui: &Ui, state: &mut State) { + let w = Window::new(im_str!("Example 1: Basic sliders")) + .size([700.0, 340.0], Condition::Appearing) + .position([20.0, 120.0], Condition::Appearing); + w.build(&ui, || { + ui.text("All of the following data types are supported:"); + ui.text("Signed: i8 i16 i32 i64"); + ui.text("Unsigned: u8 u16 u32 u64"); + ui.text("Floats: f32 f64"); + + Slider::new(im_str!("u8 value")) + .build(&ui, &mut state.u8_value); + + Slider::new(im_str!("f32 value")) + .build(&ui, &mut state.f32_value); + + ui.separator(); + ui.text("Slider range can be limited:"); + Slider::new(im_str!("i32 value with range")) + .range(-999 ..= 999) + .build(&ui, &mut state.i32_value); + ui.text("Note that for 32-bit/64-bit types, sliders are always limited to half of the natural type range!"); + + ui.separator(); + ui.text("Value formatting can be customized with a C-style printf string:"); + Slider::new(im_str!("f64 value with custom formatting")) + .range(-999_999_999.0 ..= 999_999_999.0) + .display_format(im_str!("%09.0f")) + .build(&ui, &mut state.f64_formatted); + + ui.separator(); + ui.text("Vertical sliders require a size parameter but otherwise work in a similar way:"); + VerticalSlider::new(im_str!("vertical\nu8 value"), [50.0, 50.0]) + .build(&ui, &mut state.u8_value); + }); +} + +fn example_2(ui: &Ui, state: &mut State) { + let w = Window::new(im_str!("Example 2: Slider arrays")) + .size([700.0, 260.0], Condition::Appearing) + .position([20.0, 120.0], Condition::Appearing); + w.build(&ui, || { + ui.text("You can easily build a slider group from an array of values:"); + Slider::new(im_str!("[u8; 4]")) + .build_array(&ui, &mut state.array); + + ui.text("You don't need to use arrays with known length; arbitrary slices can be used:"); + let slice: &mut [u8] = &mut state.array[1..=2]; + Slider::new(im_str!("subslice")) + .build_array(&ui, slice); + }); +} + +#[derive(Default)] +struct State { + example: u32, + i32_value: i32, + u8_value: u8, + f32_value: f32, + f64_formatted: f64, + array: [u8; 4], +} + +impl State { + fn reset(&mut self) {} +}