imgui_ext/
input.rs

1//! # Optional fields
2//!
3//! * `label` override widget label.
4//! * `step`
5//! * `step_fast`
6//! * `flags` path to a function that returns the input [flags].
7//! * `size` size of the text box (multiline text input).
8//! * `catch`
9//! * `map` Applies a mapping function to `&mut Self` (see [example](#mapping)).
10//!
11//! [flags]: https://docs.rs/imgui/0.0/imgui/struct.ImGuiInputTextFlags.html
12//!
13//! # Limitations
14//!
15//! Text input is only supported for [`imgui::ImString`](https://docs.rs/imgui/*/imgui/struct.ImString.html) types.
16//!
17//! # Example
18//!
19//! The input trait is implemented for numeric types (`f32`, `f64`, `i32` and
20//! `u32`) and their corresponding array and tuple types of up to 9 elements, as
21//! well as [`imgui::ImGuiExt`](https://docs.rs/imgui/*/imgui/struct.ImString.html) for text input.
22//!
23//! ```
24//! #[derive(imgui_ext::Gui)]
25//! struct Example {
26//!     #[imgui(input)]
27//!     input_0: f32,
28//!
29//!     #[imgui(input)]
30//!     input_1: [f32; 2],
31//!
32//!     #[imgui(input(step = 4, step_fast = 42))]
33//!     input_2: i32,
34//! }
35//! ```
36//!
37//! ## Result
38//!
39//! ![result][result]
40//!
41//! # Input flags
42//!
43//! You can load input flags from a function:
44//!
45//! ```
46//! use imgui::ImGuiInputTextFlags;
47//!
48//! #[derive(imgui_ext::Gui)]
49//! struct Example {
50//!     #[imgui(input(flags = "my_flags"))]
51//!     n: f32,
52//! }
53//!
54//! fn my_flags() -> ImGuiInputTextFlags {
55//!     ImGuiInputTextFlags::Password
56//! }
57//! ```
58//!
59//! [result]: https://i.imgur.com/BPvMGAp.png
60//!
61//! # Mapping
62//!
63//! The attribite `map` references a function to map from a `&mut Self` of the
64//! field, into a type that is is compatible with a given annotation.
65//!
66//! ```
67//! // Note that Foo doesn't derive 'imgui_ext::Gui'
68//! struct Foo {
69//!     inner: [f32; 4],
70//! }
71//!
72//! #[derive(imgui_ext::Gui)]
73//! struct Bar {
74//!     // The Foo type is not compatible with the input() annotation, but its inner attribute is.
75//!     #[imgui(input(map = "foo_to_array"))]
76//!     foo: Foo,
77//! }
78//!
79//! fn foo_to_array(foo: &mut Foo) -> &mut [f32; 4] {
80//!     &mut foo.inner
81//! }
82//! ```
83use imgui::sys;
84use imgui::{ImGuiInputTextFlags, ImStr, ImString, InputText, InputTextMultiline, Ui};
85
86pub struct InputParams<'a, T> {
87    pub label: &'a ImStr,
88    pub step: Option<T>,
89    pub step_fast: Option<T>,
90    pub flags: Option<ImGuiInputTextFlags>,
91    pub size: Option<[f32; 2]>,
92}
93
94pub trait Input<T> {
95    fn build(ui: &Ui, elem: &mut Self, params: InputParams<T>) -> bool;
96}
97
98impl<T, I: Input<T>> Input<T> for Box<I> {
99    fn build(ui: &Ui, elem: &mut Self, params: InputParams<T>) -> bool {
100        I::build(ui, elem, params)
101    }
102}
103
104impl<T, I: Input<T>> Input<T> for Option<I> {
105    fn build(ui: &Ui, elem: &mut Self, params: InputParams<T>) -> bool {
106        if let Some(ref mut elem) = elem {
107            I::build(ui, elem, params)
108        } else {
109            false
110        }
111    }
112}
113
114impl Input<()> for ImString {
115    fn build(ui: &Ui, elem: &mut Self, params: InputParams<()>) -> bool {
116        if let Some(size) = params.size {
117            let mut input = InputTextMultiline::new(ui, params.label, elem, size);
118            if let Some(flags) = params.flags {
119                input = input.flags(flags);
120            }
121            input.build()
122        } else {
123            let mut input = InputText::new(ui, params.label, elem);
124            if let Some(flags) = params.flags {
125                input = input.flags(flags);
126            }
127            input.build()
128        }
129    }
130}
131
132imgui_input_scalar! { (f32, f32, f32, f32, f32, f32, f32, f32), 8, sys::ImGuiDataType_Float }
133imgui_input_scalar! { (f64, f64, f64, f64, f64, f64, f64, f64), 8, sys::ImGuiDataType_Double }
134imgui_input_scalar! { (u32, u32, u32, u32, u32, u32, u32, u32), 8, sys::ImGuiDataType_U32 }
135imgui_input_scalar! { (i32, i32, i32, i32, i32, i32, i32, i32), 8, sys::ImGuiDataType_S32 }
136
137// matrix types
138// TODO macro Y expansion
139
140imgui_input_matrix! { (f32, f32, f32, f32, f32, f32, f32, f32), 8, 8, sys::ImGuiDataType_Float }
141imgui_input_matrix! { (f32, f32, f32, f32, f32, f32, f32, f32), 8, 7, sys::ImGuiDataType_Float }
142imgui_input_matrix! { (f32, f32, f32, f32, f32, f32, f32, f32), 8, 6, sys::ImGuiDataType_Float }
143imgui_input_matrix! { (f32, f32, f32, f32, f32, f32, f32, f32), 8, 5, sys::ImGuiDataType_Float }
144imgui_input_matrix! { (f32, f32, f32, f32, f32, f32, f32, f32), 8, 4, sys::ImGuiDataType_Float }
145imgui_input_matrix! { (f32, f32, f32, f32, f32, f32, f32, f32), 8, 3, sys::ImGuiDataType_Float }
146imgui_input_matrix! { (f32, f32, f32, f32, f32, f32, f32, f32), 8, 2, sys::ImGuiDataType_Float }
147imgui_input_matrix! { (f32, f32, f32, f32, f32, f32, f32, f32), 8, 1, sys::ImGuiDataType_Float }
148
149imgui_input_matrix! { (f64, f64, f64, f64, f64, f64, f64, f64), 8, 8, sys::ImGuiDataType_Double }
150imgui_input_matrix! { (f64, f64, f64, f64, f64, f64, f64, f64), 8, 7, sys::ImGuiDataType_Double }
151imgui_input_matrix! { (f64, f64, f64, f64, f64, f64, f64, f64), 8, 6, sys::ImGuiDataType_Double }
152imgui_input_matrix! { (f64, f64, f64, f64, f64, f64, f64, f64), 8, 5, sys::ImGuiDataType_Double }
153imgui_input_matrix! { (f64, f64, f64, f64, f64, f64, f64, f64), 8, 4, sys::ImGuiDataType_Double }
154imgui_input_matrix! { (f64, f64, f64, f64, f64, f64, f64, f64), 8, 3, sys::ImGuiDataType_Double }
155imgui_input_matrix! { (f64, f64, f64, f64, f64, f64, f64, f64), 8, 2, sys::ImGuiDataType_Double }
156imgui_input_matrix! { (f64, f64, f64, f64, f64, f64, f64, f64), 8, 1, sys::ImGuiDataType_Double }
157
158imgui_input_matrix! { (u32, u32, u32, u32, u32, u32, u32, u32), 8, 8, sys::ImGuiDataType_U32 }
159imgui_input_matrix! { (u32, u32, u32, u32, u32, u32, u32, u32), 8, 7, sys::ImGuiDataType_U32 }
160imgui_input_matrix! { (u32, u32, u32, u32, u32, u32, u32, u32), 8, 6, sys::ImGuiDataType_U32 }
161imgui_input_matrix! { (u32, u32, u32, u32, u32, u32, u32, u32), 8, 5, sys::ImGuiDataType_U32 }
162imgui_input_matrix! { (u32, u32, u32, u32, u32, u32, u32, u32), 8, 4, sys::ImGuiDataType_U32 }
163imgui_input_matrix! { (u32, u32, u32, u32, u32, u32, u32, u32), 8, 3, sys::ImGuiDataType_U32 }
164imgui_input_matrix! { (u32, u32, u32, u32, u32, u32, u32, u32), 8, 2, sys::ImGuiDataType_U32 }
165imgui_input_matrix! { (u32, u32, u32, u32, u32, u32, u32, u32), 8, 1, sys::ImGuiDataType_U32 }
166
167imgui_input_matrix! { (i32, i32, i32, i32, i32, i32, i32, i32), 8, 8, sys::ImGuiDataType_S32 }
168imgui_input_matrix! { (i32, i32, i32, i32, i32, i32, i32, i32), 8, 7, sys::ImGuiDataType_S32 }
169imgui_input_matrix! { (i32, i32, i32, i32, i32, i32, i32, i32), 8, 6, sys::ImGuiDataType_S32 }
170imgui_input_matrix! { (i32, i32, i32, i32, i32, i32, i32, i32), 8, 5, sys::ImGuiDataType_S32 }
171imgui_input_matrix! { (i32, i32, i32, i32, i32, i32, i32, i32), 8, 4, sys::ImGuiDataType_S32 }
172imgui_input_matrix! { (i32, i32, i32, i32, i32, i32, i32, i32), 8, 3, sys::ImGuiDataType_S32 }
173imgui_input_matrix! { (i32, i32, i32, i32, i32, i32, i32, i32), 8, 2, sys::ImGuiDataType_S32 }
174imgui_input_matrix! { (i32, i32, i32, i32, i32, i32, i32, i32), 8, 1, sys::ImGuiDataType_S32 }