diff --git a/imgui/src/io.rs b/imgui/src/io.rs index 2f52152..e753df5 100644 --- a/imgui/src/io.rs +++ b/imgui/src/io.rs @@ -486,6 +486,9 @@ fn test_io_memory_layout() { }; } + // We move this test into a Thread with a larger stack + // since the stack size of the default thread is not large enough in + // debug mode. std::thread::Builder::new() .stack_size(4 * 1024 * 1024) .spawn(|| { diff --git a/imgui/src/widget/image.rs b/imgui/src/widget/image.rs index ea4cbb9..04bc620 100644 --- a/imgui/src/widget/image.rs +++ b/imgui/src/widget/image.rs @@ -86,10 +86,38 @@ pub struct ImageButton<'ui, StrId> { ui: &'ui Ui, } +#[derive(Copy, Clone, Debug)] +#[must_use] +pub struct ImageButtonDeprecated { + texture_id: TextureId, + size: [f32; 2], + uv0: [f32; 2], + uv1: [f32; 2], + frame_padding: i32, + bg_col: [f32; 4], + tint_col: [f32; 4], +} + +impl ImageButton<'static, ()> { + /// Creates a new image button builder with the given texture and size + #[deprecated(since = "0.10.0", note = "Use `ui.image_button_config(...)` instead")] + pub fn new(texture_id: TextureId, size: impl Into) -> ImageButtonDeprecated { + ImageButtonDeprecated { + texture_id, + size: size.into().into(), + uv0: [0.0, 0.0], + uv1: [1.0, 1.0], + frame_padding: -1, + bg_col: [0.0, 0.0, 0.0, 0.0], + tint_col: [1.0, 1.0, 1.0, 1.0], + } + } +} + impl<'ui, StrId: AsRef> ImageButton<'ui, StrId> { /// Creates a new image button builder with the given texture and size #[deprecated(since = "0.10.0", note = "Use `ui.image_button_config(...)` instead")] - pub fn new( + pub fn new_with_id( ui: &'ui Ui, str_id: StrId, texture_id: TextureId, @@ -149,6 +177,75 @@ impl<'ui, StrId: AsRef> ImageButton<'ui, StrId> { } } +impl ImageButtonDeprecated { + /// Sets the image button size + #[deprecated(note = "just set the size in the `new` constructor.")] + pub fn size(mut self, size: impl Into) -> Self { + self.size = size.into().into(); + self + } + /// Sets uv0 (default `[0.0, 0.0]`) + pub fn uv0(mut self, uv0: impl Into) -> Self { + self.uv0 = uv0.into().into(); + self + } + /// Sets uv1 (default `[1.0, 1.0]`) + pub fn uv1(mut self, uv1: impl Into) -> Self { + self.uv1 = uv1.into().into(); + self + } + /// Sets the background color (default: no background color) + pub fn background_col(mut self, bg_col: impl Into) -> Self { + self.bg_col = bg_col.into().into(); + self + } + /// Sets the tint color (default: no tint color) + pub fn tint_col(mut self, tint_col: impl Into) -> Self { + self.tint_col = tint_col.into().into(); + self + } + /// Sets the frame padding (default: uses frame padding from style). + /// + /// - `< 0`: uses frame padding from style (default) + /// - `= 0`: no framing + /// - `> 0`: set framing size + pub fn frame_padding(mut self, frame_padding: i32) -> Self { + self.frame_padding = frame_padding; + self + } + /// Builds the image button + pub fn build(self, _: &Ui) -> bool { + unsafe { + sys::igPushID_Ptr(self.texture_id.id() as *const _); + + if self.frame_padding >= 0 { + sys::igPushStyleVar_Vec2( + sys::ImGuiStyleVar_FramePadding as i32, + [self.frame_padding as f32, self.frame_padding as f32].into(), + ); + } + + let res = sys::igImageButton( + b"#image".as_ptr().cast(), + self.texture_id.id() as *mut c_void, + self.size.into(), + self.uv0.into(), + self.uv1.into(), + self.bg_col.into(), + self.tint_col.into(), + ); + + if self.frame_padding >= 0 { + sys::igPopStyleVar(1); + } + + sys::igPopID(); + + res + } + } +} + impl Ui { pub fn image_button( &self,