diff --git a/src/child_frame.rs b/src/child_frame.rs new file mode 100644 index 0000000..8ba8ac0 --- /dev/null +++ b/src/child_frame.rs @@ -0,0 +1,121 @@ +use imgui_sys; +use ImStr; +use ImVec2; +use ImGuiWindowFlags; + +use super::{ImGuiWindowFlags_NoMove, ImGuiWindowFlags_NoScrollbar, ImGuiWindowFlags_NoScrollWithMouse, + ImGuiWindowFlags_NoCollapse, ImGuiWindowFlags_AlwaysAutoResize, + ImGuiWindowFlags_ShowBorders, ImGuiWindowFlags_NoInputs, ImGuiWindowFlags_MenuBar, + ImGuiWindowFlags_HorizontalScrollbar, ImGuiWindowFlags_NoFocusOnAppearing, + ImGuiWindowFlags_NoBringToFrontOnFocus, ImGuiWindowFlags_AlwaysVerticalScrollbar, + ImGuiWindowFlags_AlwaysHorizontalScrollbar, ImGuiWindowFlags_AlwaysUseWindowPadding}; + +#[must_use] +pub struct ChildFrame<'p> { + name: &'p ImStr, + size: ImVec2, + flags: ImGuiWindowFlags, +} + +impl<'p> ChildFrame<'p> { + pub fn new(name: &'p ImStr, size: ImVec2) -> ChildFrame<'p> { + ChildFrame { + name: name, + size: size, + flags: ImGuiWindowFlags::empty(), + } + } + #[inline] + pub fn movable(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_NoMove, !value); + self + } + #[inline] + pub fn show_scrollbar(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_NoScrollbar, !value); + self + } + #[inline] + pub fn show_scrollbar_with_mouse(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_NoScrollWithMouse, !value); + self + } + #[inline] + pub fn collapsible(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_NoCollapse, !value); + self + } + #[inline] + pub fn always_resizable(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_AlwaysAutoResize, value); + self + } + #[inline] + pub fn show_borders(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_ShowBorders, value); + self + } + #[inline] + pub fn input_allow(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_NoInputs, !value); + self + } + #[inline] + pub fn show_menu(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_MenuBar, value); + self + } + #[inline] + pub fn scrollbar_horizontal(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_HorizontalScrollbar, value); + self + } + #[inline] + pub fn focus_on_appearing(mut self, value: bool) -> Self { + self.flags.set(ImGuiWindowFlags_NoFocusOnAppearing, !value); + self + } + #[inline] + pub fn bring_to_front_on_focus(mut self, value: bool) -> Self { + self.flags.set( + ImGuiWindowFlags_NoBringToFrontOnFocus, + !value, + ); + self + } + #[inline] + pub fn always_show_vertical_scroll_bar(mut self, value: bool) -> Self { + self.flags.set( + ImGuiWindowFlags_AlwaysVerticalScrollbar, + value, + ); + self + } + #[inline] + pub fn always_show_horizontal_scroll_bar(mut self, value: bool) -> Self { + self.flags.set( + ImGuiWindowFlags_AlwaysHorizontalScrollbar, + value, + ); + self + } + #[inline] + pub fn always_use_window_padding(mut self, value: bool) -> Self { + self.flags.set( + ImGuiWindowFlags_AlwaysUseWindowPadding, + value, + ); + self + } + pub fn build(self, f: F) { + // See issue for history. + // https://github.com/Gekkio/imgui-rs/pull/58 + let show_border = false; + + let render_child_frame = unsafe { imgui_sys::igBeginChild(self.name.as_ptr(), self.size, show_border, self.flags) }; + if render_child_frame { + f(); + } + unsafe { imgui_sys::igEndChild() }; + } +} diff --git a/src/lib.rs b/src/lib.rs index 9e9ad44..f2654a0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -35,6 +35,7 @@ pub use imgui_sys::{ImDrawIdx, ImDrawVert, ImGuiInputTextFlags, ImGuiInputTextFl ImGuiWindowFlags_NoSavedSettings, ImGuiWindowFlags_NoScrollWithMouse, ImGuiWindowFlags_NoScrollbar, ImGuiWindowFlags_NoTitleBar, ImGuiWindowFlags_ShowBorders, ImVec2, ImVec4}; +pub use child_frame::ChildFrame; pub use input::{ColorEdit3, ColorEdit4, InputFloat, InputFloat2, InputFloat3, InputFloat4, InputInt, InputInt2, InputInt3, InputInt4, InputText}; pub use menus::{Menu, MenuItem}; @@ -48,6 +49,7 @@ pub use style::StyleVar; pub use trees::{CollapsingHeader, TreeNode}; pub use window::Window; +mod child_frame; mod input; mod menus; mod plothistogram; @@ -756,6 +758,30 @@ impl<'ui> Ui<'ui> { pub fn progress_bar<'p>(&self, fraction: f32) -> ProgressBar<'p> { ProgressBar::new(fraction) } } +impl<'ui> Ui<'ui> { + /// Creates a child frame. Size is size of child_frame within parent window. + /// + /// # Example + /// ```rust,no_run + /// # use imgui::*; + /// # let mut imgui = ImGui::init(); + /// # let ui = imgui.frame((0, 0), (0, 0), 0.1); + /// ui.window(im_str!("ChatWindow")) + /// .title_bar(true) + /// .scrollable(false) + /// .build(|| { + /// ui.separator(); + /// + /// ui.child_frame(im_str!("child frame"), (400.0, 100.0)) + /// .show_borders(true) + /// .always_show_vertical_scroll_bar(true) + /// .build(|| { + /// ui.text_colored((1.0, 0.0, 0.0, 1.0), im_str!("hello mate!")); + /// }); + /// }); + pub fn child_frame<'p, S: Into>(&self, name: &'p ImStr, size: S) -> ChildFrame<'p> { ChildFrame::new(name, size.into()) } +} + impl<'ui> Ui<'ui> { #[inline] fn push_style_var(&self, style_var: StyleVar) {