diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown index c2eb1a2..57e6e32 100644 --- a/CHANGELOG.markdown +++ b/CHANGELOG.markdown @@ -2,6 +2,60 @@ ## [Unreleased] +### Added + +- New things in imgui/cimgui 1.53.1 + - Style: Add `PopupRounding`, `FrameBorderSize`, `WindowBorderSize`, `PopupBorderSize`. + - DemoWindow: Add `no_close` state. + - Input: Add `no_undo_redo` method. + - *imgui-sys*: + - `igStyleColorsDark` and `igStyleColorsLight` + - DragDrop low level API + - `igGetFrameHeight` + - `igBeginCombo`, `igEndCombo` + - `igSetItemDefaultFocus` + - `igGetOverlayDrawList` and `igGetDrawListSharedData` + - `ImFontConfig_DefaultConstructor` + - `ImDrawList_AddImageRounded` +- Input: Add `read_only` and `password` methods. + +### Changed + +- Upgrade to imgui/cimgui 1.53.1 + - Rename `Ui::show_test_window` to `Ui::show_demo_window`. Keep redirection. + - Rename `sys::igGetItemsLineHeightWithSpacing` to `sys::igGetFrameHeightWithSpacing`. + Keep redirection. + - Rename `ImGuiTreeNodeFlags::AllowOverlapMode` to `ImGuiTreeNodeFlags::AllowItemOverlap`. + `sys::igSetNextWindowContentSize()`. Keep redirection. + - Rename `sys::ImGuiTextBuffer_append()` helper to `appendf()`. + - Rename `ImGuiStyleVar::ChildWindowRounding` to `ImGuiStyleVar::ChildRounding`. + Keep redirection. + - Rename `StyleVar::ChildWindowRounding` to `StyleVar::ChildRounding`. + Keep redirection. + - Rename `ImGuiCol::ChildWindowBg` to `ImGuiCol::ChildBg`. + Keep redirection. + +### Deprecated + +- Various imgui-sys things that were deprecated in imgui/cimgui 1.53.1 + - Obsolete `sys::igIsRootWindowFocused()` in favor of using + `sys::igIsWindowFocused(ImGuiFocusedFlags::RootWindow)`. + - Obsolete `sys::igIsRootWindowOrAnyChildFocused()` in favor of using + `sys::igIsWindowFocused(ImGuiFocusedFlags::RootAndChildWindows)`. + - Obsolete `sys::igIsRootWindowOrAnyChildHovered()` in favor of using + `sys::igIsWindowHovered(ImGuiHoveredFlags::RootAndChildWindows)`. + - Obsolete `sys::SetNextWindowContentWidth()` in favor of using + - Obsolete `Window::show_borders`. Use `StyleVar` instead. + - Obsolete `ImGuiCol::ComboBg`. Use `PopupBg` instead. + +### Removed + +- Features that were removed in imgui/cimgui 1.53.1 + - Remove `anti_aliased: bool` final parameter of `sys::ImDrawList_AddPolyline` + and `sys::ImDrawList_AddConvexPolyFilled`. + - Remove `ImGuiWindowFlags::ShowBorders` window flag. Borders are now fully + set up in the ImGuiStyle structure. + ## [0.0.18] - 2017-12-23 ### Added diff --git a/imgui-examples/examples/test_window.rs b/imgui-examples/examples/test_window.rs index 652b228..d111416 100644 --- a/imgui-examples/examples/test_window.rs +++ b/imgui-examples/examples/test_window.rs @@ -9,7 +9,7 @@ const CLEAR_COLOR: [f32; 4] = [0.2, 0.2, 0.2, 1.0]; fn main() { support::run("test_window.rs".to_owned(), CLEAR_COLOR, |ui| { let mut open = true; - ui.show_test_window(&mut open); + ui.show_demo_window(&mut open); open }); } diff --git a/imgui-examples/examples/test_window_impl.rs b/imgui-examples/examples/test_window_impl.rs index 66a0f74..a8a6ec1 100644 --- a/imgui-examples/examples/test_window_impl.rs +++ b/imgui-examples/examples/test_window_impl.rs @@ -23,12 +23,12 @@ struct State { show_app_metrics: bool, show_app_about: bool, no_titlebar: bool, - no_border: bool, no_resize: bool, no_move: bool, no_scrollbar: bool, no_collapse: bool, no_menu: bool, + no_close: bool, wrap_width: f32, buf: ImString, item: i32, @@ -72,12 +72,12 @@ impl Default for State { show_app_metrics: false, show_app_about: false, no_titlebar: false, - no_border: true, no_resize: false, no_move: false, no_scrollbar: false, no_collapse: false, no_menu: false, + no_close: false, wrap_width: 200.0, buf: buf, item: 0, @@ -267,17 +267,18 @@ fn show_test_window(ui: &Ui, state: &mut State, opened: &mut bool) { ); } - ui.window(im_str!("ImGui Demo")) + let mut window = ui.window(im_str!("ImGui Demo")) .title_bar(!state.no_titlebar) - .show_borders(!state.no_border) .resizable(!state.no_resize) .movable(!state.no_move) .scroll_bar(!state.no_scrollbar) .collapsible(!state.no_collapse) .menu_bar(!state.no_menu) - .size((550.0, 680.0), ImGuiCond::FirstUseEver) - .opened(opened) - .build(|| { + .size((550.0, 680.0), ImGuiCond::FirstUseEver); + if !state.no_close { + window = window.opened(opened) + } + window.build(|| { ui.push_item_width(-140.0); ui.text(format!("dear imgui says hello. ({})", imgui::get_version())); ui.menu_bar(|| { @@ -344,15 +345,15 @@ fn show_test_window(ui: &Ui, state: &mut State, opened: &mut bool) { if ui.collapsing_header(im_str!("Window options")).build() { ui.checkbox(im_str!("No titlebar"), &mut state.no_titlebar); ui.same_line(150.0); - ui.checkbox(im_str!("No border"), &mut state.no_border); - ui.same_line(300.0); - ui.checkbox(im_str!("No resize"), &mut state.no_resize); - ui.checkbox(im_str!("No move"), &mut state.no_move); - ui.same_line(150.0); ui.checkbox(im_str!("No scrollbar"), &mut state.no_scrollbar); ui.same_line(300.0); - ui.checkbox(im_str!("No collapse"), &mut state.no_collapse); ui.checkbox(im_str!("No menu"), &mut state.no_menu); + ui.checkbox(im_str!("No move"), &mut state.no_move); + ui.same_line(150.0); + ui.checkbox(im_str!("No resize"), &mut state.no_resize); + ui.same_line(300.0); + ui.checkbox(im_str!("No collapse"), &mut state.no_collapse); + ui.checkbox(im_str!("No close"), &mut state.no_close); ui.tree_node(im_str!("Style")).build(|| { ui.show_default_style_editor() diff --git a/imgui-sys/Cargo.toml b/imgui-sys/Cargo.toml index bbc0fe1..40488d7 100644 --- a/imgui-sys/Cargo.toml +++ b/imgui-sys/Cargo.toml @@ -13,6 +13,7 @@ build = "build.rs" travis-ci = { repository = "Gekkio/imgui-rs" } [dependencies] +libc = "0.2" bitflags = "1.0" glium = { version = "0.21", default-features = false, optional = true } gfx = { version = "0.17", optional = true } diff --git a/imgui-sys/src/lib.rs b/imgui-sys/src/lib.rs index 3d0f6a1..8173361 100644 --- a/imgui-sys/src/lib.rs +++ b/imgui-sys/src/lib.rs @@ -3,6 +3,8 @@ #[macro_use] extern crate bitflags; +extern crate libc; + #[cfg(feature = "gfx")] #[macro_use] extern crate gfx; @@ -13,7 +15,6 @@ extern crate glium; use std::convert::From; use std::mem; use std::os::raw::{c_char, c_float, c_int, c_short, c_uchar, c_uint, c_ushort, c_void}; -use std::ptr; use std::slice; #[cfg(feature = "gfx")] @@ -44,7 +45,7 @@ pub enum ImGuiCol { Text, TextDisabled, WindowBg, - ChildWindowBg, + ChildBg, PopupBg, Border, BorderShadow, @@ -59,7 +60,6 @@ pub enum ImGuiCol { ScrollbarGrab, ScrollbarGrabHovered, ScrollbarGrabActive, - ComboBg, CheckMark, SliderGrab, SliderGrabActive, @@ -84,15 +84,21 @@ pub enum ImGuiCol { PlotHistogramHovered, TextSelectedBg, ModalWindowDarkening, + DragDropTarget, } impl ImGuiCol { + #[deprecated(since = "0.0.19", note = "ComboBg has been merged with PopupBg. Please use PopupBg instead")] + pub const ComboBg: ImGuiCol = ImGuiCol::PopupBg; + #[deprecated(since = "0.0.19", note = "please use ChildBg instead")] + pub const ChildWindowBg: ImGuiCol = ImGuiCol::ChildBg; + pub fn values() -> &'static [ImGuiCol] { use ImGuiCol::*; static values: &'static [ImGuiCol] = &[ Text, TextDisabled, WindowBg, - ChildWindowBg, + ChildBg, PopupBg, Border, BorderShadow, @@ -107,7 +113,6 @@ impl ImGuiCol { ScrollbarGrab, ScrollbarGrabHovered, ScrollbarGrabActive, - ComboBg, CheckMark, SliderGrab, SliderGrabActive, @@ -132,6 +137,7 @@ impl ImGuiCol { PlotHistogramHovered, TextSelectedBg, ModalWindowDarkening, + DragDropTarget, ]; values } @@ -145,17 +151,27 @@ pub enum ImGuiStyleVar { Alpha, WindowPadding, WindowRounding, + WindowBorderSize, WindowMinSize, - ChildWindowRounding, + ChildRounding, + ChildBorderSize, + PopupRounding, + PopupBorderSize, FramePadding, FrameRounding, + FrameBorderSize, ItemSpacing, ItemInnerSpacing, IndentSpacing, GrabMinSize, ButtonTextAlign, } -pub const ImGuiStyleVar_COUNT: usize = 12; +pub const ImGuiStyleVar_COUNT: usize = 17; + +impl ImGuiStyleVar { + #[deprecated(since = "0.0.19", note = "please use ChildRounding instead")] + pub const ChildWindowRounding: ImGuiStyleVar = ImGuiStyleVar::ChildRounding; +} /// A key identifier (ImGui-side enum) #[repr(C)] @@ -235,7 +251,6 @@ bitflags!( const NoScrollWithMouse = 1 << 4; const NoCollapse = 1 << 5; const AlwaysAutoResize = 1 << 6; - const ShowBorders = 1 << 7; const NoSavedSettings = 1 << 8; const NoInputs = 1 << 9; const MenuBar = 1 << 10; @@ -245,6 +260,7 @@ bitflags!( const AlwaysVerticalScrollbar = 1 << 14; const AlwaysHorizontalScrollbar = 1 << 15; const AlwaysUseWindowPadding = 1 << 16; + const ResizeFromAnySide = 1 << 17; } ); @@ -279,6 +295,7 @@ bitflags!( const AlwaysInsertMode = 1 << 13; const ReadOnly = 1 << 14; const Password = 1 << 15; + const NoUndoRedo = 1 << 16; } ); @@ -298,7 +315,9 @@ bitflags!( pub struct ImGuiTreeNodeFlags: c_int { const Selected = 1; const Framed = 1 << 1; + #[deprecated(since = "0.0.19", note = "please use AllowItemOverlap instead")] const AllowOverlapMode = 1 << 2; + const AllowItemOverlap = 1 << 2; const NoTreePushOnOpen = 1 << 3; const NoAutoOpenOnLog = 1 << 4; const DefaultOpen = 1 << 5; @@ -312,16 +331,94 @@ bitflags!( } ); +bitflags!( + /// Flags for window focus check + #[repr(C)] + pub struct ImGuiFocusedFlags: c_int { + const ChildWindows = 1 << 0; + const RootWindow = 1 << 1; + const RootAndChildWindows = + ImGuiFocusedFlags::RootWindow.bits | ImGuiFocusedFlags::ChildWindows.bits; + } +); + bitflags!( /// Flags for hover checks #[repr(C)] pub struct ImGuiHoveredFlags: c_int { - const AllowWhenBlockedByPopup = 1; - const AllowWhenBlockedByActiveItem = 1 << 2; - const AllowWhenOverlapped = 1 << 3; + const ChildWindows = 1 << 0; + const RootWindow = 1 << 1; + const AllowWhenBlockedByPopup = 1 << 2; + const AllowWhenBlockedByActiveItem = 1 << 4; + const AllowWhenOverlapped = 1 << 5; const RectOnly = ImGuiHoveredFlags::AllowWhenBlockedByPopup.bits | ImGuiHoveredFlags::AllowWhenBlockedByActiveItem.bits | ImGuiHoveredFlags::AllowWhenOverlapped.bits; + const RootAndChildWindows = ImGuiFocusedFlags::RootWindow.bits + | ImGuiFocusedFlags::ChildWindows.bits; + } +); + +bitflags!( + /// Flags for igBeginCombo + #[repr(C)] + pub struct ImGuiComboFlags: c_int { + /// Align the popup toward the left by default + const PopupAlignLeft = 1 << 0; + /// Max ~4 items visible. + /// Tip: If you want your combo popup to be a specific size you can use + /// igSetNextWindowSizeConstraints() prior to calling igBeginCombo() + const HeightSmall = 1 << 1; + /// Max ~8 items visible (default) + const HeightRegular = 1 << 2; + /// Max ~20 items visible + const HeightLarge = 1 << 3; + /// As many fitting items as possible + const HeightLargest = 1 << 4; + const HeightMask = ImGuiComboFlags::HeightSmall.bits + | ImGuiComboFlags::HeightRegular.bits + | ImGuiComboFlags::HeightLarge.bits + | ImGuiComboFlags::HeightLargest.bits; + } +); + +bitflags!( + /// Flags for igBeginDragDropSource(), igAcceptDragDropPayload() + #[repr(C)] + pub struct ImGuiDragDropFlags: c_int { + // BeginDragDropSource() flags + /// By default, a successful call to igBeginDragDropSource opens a + /// tooltip so you can display a preview or description of the source + /// contents. This flag disable this behavior. + const SourceNoPreviewTooltip = 1 << 0; + /// By default, when dragging we clear data so that igIsItemHovered() + /// will return true, to avoid subsequent user code submitting tooltips. + /// This flag disable this behavior so you can still call + /// igIsItemHovered() on the source item. + const SourceNoDisableHover = 1 << 1; + /// Disable the behavior that allows to open tree nodes and collapsing + /// header by holding over them while dragging a source item. + const SourceNoHoldToOpenOthers = 1 << 2; + /// Allow items such as igText(), igImage() that have no unique + /// identifier to be used as drag source, by manufacturing a temporary + /// identifier based on their window-relative position. This is + /// extremely unusual within the dear imgui ecosystem and so we made it + /// explicit. + const SourceAllowNullID = 1 << 3; + /// External source (from outside of imgui), won't attempt to read + /// current item/window info. Will always return true. Only one Extern + /// source can be active simultaneously. + const SourceExtern = 1 << 4; + // AcceptDragDropPayload() flags + /// igAcceptDragDropPayload() will returns true even before the mouse + /// button is released. You can then call igIsDelivery() to test if the + /// payload needs to be delivered. + const AcceptBeforeDelivery = 1 << 10; + /// Do not draw the default highlight rectangle when hovering over target. + const AcceptNoDrawDefaultRect = 1 << 11; + /// For peeking ahead and inspecting the payload before delivery. + const AcceptPeekOnly = ImGuiDragDropFlags::AcceptBeforeDelivery.bits + | ImGuiDragDropFlags::AcceptNoDrawDefaultRect.bits; } ); @@ -331,8 +428,8 @@ bitflags!( pub struct ImDrawCornerFlags: c_int { const TopLeft = 1 << 0; const TopRight = 1 << 1; - const BotRight = 1 << 2; - const BotLeft = 1 << 3; + const BotLeft = 1 << 2; + const BotRight = 1 << 3; const Top = ImDrawCornerFlags::TopLeft.bits | ImDrawCornerFlags::TopRight.bits; const Bot = ImDrawCornerFlags::BotLeft.bits @@ -345,6 +442,14 @@ bitflags!( } ); +bitflags!( + #[repr(C)] + pub struct ImDrawListFlags: c_int { + const AntiAliasedLines = 1 << 0; + const AntiAliasedFill = 1 << 1; + } +); + pub type ImGuiTextEditCallback = Option< extern "C" fn(data: *mut ImGuiTextEditCallbackData) -> c_int, >; @@ -443,19 +548,29 @@ pub struct ImGuiStyle { pub alpha: c_float, /// Padding within a window pub window_padding: ImVec2, - /// Minimum window size - pub window_min_size: ImVec2, /// Radius of window corners rounding. Set to 0.0f to have rectangular windows pub window_rounding: c_float, + /// Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. + pub window_border_size: c_float, + /// Minimum window size + pub window_min_size: ImVec2, /// Alignment for title bar text. Defaults to (0.0f, 0.5f) for left-aligned, vertically centered pub window_title_align: ImVec2, /// Radius of child window corners rounding. Set to 0.0f to have rectangular child windows - pub child_window_rounding: c_float, + pub child_rounding: c_float, + /// Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. + pub child_border_size: c_float, + /// Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows + pub popup_rounding: c_float, + /// Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested. + pub popup_border_size: c_float, /// Padding within a framed rectangle (used by most widgets) pub frame_padding: ImVec2, /// Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most /// widgets). pub frame_rounding: c_float, + /// Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. + pub frame_border_size: c_float, /// Horizontal and vertical spacing between widgets/lines pub item_spacing: ImVec2, /// Horizontal and vertical spacing between within elements of a composed @@ -490,7 +605,7 @@ pub struct ImGuiStyle { /// Enable anti-aliasing on lines/borders. Disable if you are really short on CPU/GPU. pub anti_aliased_lines: bool, /// Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.) - pub anti_aliased_shapes: bool, + pub anti_aliased_fill: bool, /// Tessellation tolerance. Decrease for highly tessellated curves (higher quality, more /// polygons), increase to reduce quality. pub curve_tessellation_tol: c_float, @@ -522,7 +637,8 @@ pub struct ImGuiIO { pub display_visible_min: ImVec2, pub display_visible_max: ImVec2, - pub osx_behaviors: bool, + pub opt_mac_osx_behaviors: bool, + pub opt_cursor_blink: bool, pub render_draw_lists_fn: Option, @@ -567,6 +683,7 @@ pub struct ImGuiIO { mouse_down_owned: [bool; 5], mouse_down_duration: [c_float; 5], mouse_down_duration_prev: [c_float; 5], + mouse_drag_max_distance_abs: [ImVec2; 5], mouse_drag_max_distance_sqr: [c_float; 5], keys_down_duration: [c_float; 512], keys_down_duration_prev: [c_float; 512], @@ -597,6 +714,28 @@ pub struct ImGuiTextFilter { pub count_grep: c_int, } +/// Data payload for Drag and Drop operations +#[repr(C)] +pub struct ImGuiPayload { + /// Data (copied and owned by dear imgui) + pub data: *const c_void, + /// Data size + pub data_size: c_int, + + /// Source item id + source_id: ImGuiID, + /// Source parent id (if available) + source_parent_id: ImGuiID, + /// Data timestamp + data_frame_count: c_int, + /// Data type tag (short user-supplied string) + data_type: [c_char; 8 + 1], + /// Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets) + preview: bool, + /// Set when AcceptDragDropPayload() was called and mouse button is released over the target item. + delivery: bool, +} + #[repr(C)] pub struct ImGuiTextBuffer { pub buf: ImVector, @@ -706,6 +845,8 @@ pub struct ImDrawList { pub idx_buffer: ImVector, pub vtx_buffer: ImVector, + flags: ImDrawListFlags, + data: *const ImDrawListSharedData, owner_name: *const c_char, vtx_current_idx: c_uint, vtx_write_ptr: *mut ImDrawVert, @@ -718,6 +859,20 @@ pub struct ImDrawList { channels: ImVector, } +#[repr(C)] +pub struct ImDrawListSharedData { + /// UV of white pixel in the atlas + tex_uv_white_pixel: ImVec2, + /// Current/default font (optional, for simplified AddText overload) + font: *mut ImFont, + /// Current/default font size (optional, for simplified AddText overload) + font_size: c_float, + curve_tessellation_tol: c_float, + /// Value for PushClipRectFullscreen() + clip_rect_fullscreen: ImVec4, + circle_vtx12: [ImVec2; 12], +} + /// All draw command lists required to render the frame #[repr(C)] pub struct ImDrawData { @@ -756,31 +911,6 @@ pub struct ImFontConfig { name: [c_char; 32], dst_font: *mut ImFont, } -impl ImFontConfig { - // This function only exists because cimgui does not provide a wrapper around - // `ImGuiConfig::ImGuiConfig()`. This code is based off that constructor. - pub fn new() -> ImFontConfig { - ImFontConfig { - font_data: ptr::null_mut(), - font_data_size: 0, - font_data_owned_by_atlas: true, - font_no: 0, - size_pixels: 0.0, - oversample_h: 3, - oversample_v: 1, - pixel_snap_h: false, - glyph_extra_spacing: ImVec2::zero(), - glyph_offset: ImVec2::zero(), - glyph_ranges: ptr::null(), - merge_mode: false, - rasterizer_flags: 0, - rasterizer_multiply: 1.0, - - name: [0; 32], - dst_font: ptr::null_mut(), - } - } -} #[repr(C)] #[derive(Copy, Clone, Debug, Default)] @@ -855,17 +985,26 @@ extern "C" { pub fn igGetDrawData() -> *mut ImDrawData; pub fn igNewFrame(); pub fn igRender(); + pub fn igEndFrame(); pub fn igShutdown(); } // Demo/Debug/Info extern "C" { - pub fn igShowTestWindow(opened: *mut bool); + pub fn igShowDemoWindow(opened: *mut bool); pub fn igShowMetricsWindow(opened: *mut bool); pub fn igShowStyleEditor(style: *mut ImGuiStyle); + pub fn igShowStyleSelector(label: *const c_char); + pub fn igShowFontSelector(label: *const c_char); pub fn igShowUserGuide(); } +#[allow(non_snake_case)] +#[deprecated(since = "0.0.19", note = "please use igShowDemoWindow instead")] +pub unsafe fn igShowTestWindow(opened: *mut bool) { + igShowDemoWindow(opened) +} + // Window extern "C" { pub fn igBegin(name: *const c_char, open: *mut bool, flags: ImGuiWindowFlags) -> bool; @@ -907,7 +1046,6 @@ extern "C" { custom_callback_data: *mut c_void, ); pub fn igSetNextWindowContentSize(size: ImVec2); - pub fn igSetNextWindowContentWidth(width: c_float); pub fn igSetNextWindowCollapsed(collapsed: bool, cond: ImGuiCond); pub fn igSetNextWindowFocus(); pub fn igSetWindowPos(pos: ImVec2, cond: ImGuiCond); @@ -927,7 +1065,6 @@ extern "C" { pub fn igSetScrollY(scroll_y: c_float); pub fn igSetScrollHere(center_y_ratio: c_float); pub fn igSetScrollFromPosY(pos_y: c_float, center_y_ratio: c_float); - pub fn igSetKeyboardFocusHere(offset: c_int); pub fn igSetStateStorage(tree: *mut ImGuiStorage); pub fn igGetStateStorage() -> *mut ImGuiStorage; } @@ -940,6 +1077,15 @@ pub unsafe fn igSetNextWindowPosCenter(cond: ImGuiCond) { let pivot = ImVec2::new(0.5, 0.5); igSetNextWindowPos(pos, cond, pivot); } +/// Set next window content's width. +/// +/// Original non-deprecated version preserved last Y value set by +/// [`igSetNextWindowContentSize`]. +#[allow(non_snake_case)] +#[deprecated(since = "0.0.19", note = "please use igSetNextWindowContentSize instead")] +pub unsafe fn igSetNextWindowContentWidth(width: c_float) { + igSetNextWindowContentSize(ImVec2 { x: width, y: 0.0 }) +} // Parameter stack (shared) extern "C" { @@ -996,13 +1142,20 @@ extern "C" { pub fn igAlignTextToFramePadding(); pub fn igGetTextLineHeight() -> c_float; pub fn igGetTextLineHeightWithSpacing() -> c_float; - pub fn igGetItemsLineHeightWithSpacing() -> c_float; + pub fn igGetFrameHeight() -> c_float; + pub fn igGetFrameHeightWithSpacing() -> c_float; } #[allow(non_snake_case)] #[deprecated(since = "0.0.18", note = "please use igAlignTextToFramePadding instead")] pub unsafe fn igAlignFirstTextHeightToWidgets() { igAlignTextToFramePadding(); } +#[allow(non_snake_case)] +#[deprecated(since = "0.0.19", note = "please use igGetFrameHeightWithSpacing instead")] +pub unsafe fn igGetItemsLineHeightWithSpacing() -> c_float { + igGetFrameHeightWithSpacing() +} + // Columns extern "C" { pub fn igColumns(count: c_int, id: *const c_char, border: bool); @@ -1067,28 +1220,6 @@ extern "C" { pub fn igCheckboxFlags(label: *const c_char, flags: *mut c_uint, flags_value: c_uint) -> bool; pub fn igRadioButtonBool(label: *const c_char, active: bool) -> bool; pub fn igRadioButton(label: *const c_char, v: *mut c_int, v_button: c_int) -> bool; - pub fn igCombo( - label: *const c_char, - current_item: *mut c_int, - items: *const *const c_char, - items_count: c_int, - height_in_items: c_int, - ) -> bool; - pub fn igCombo2( - label: *const c_char, - current_item: *mut c_int, - items_separated_by_zeros: *const c_char, - height_in_items: c_int, - ) -> bool; - pub fn igCombo3( - label: *const c_char, - current_item: *mut c_int, - items_getter: extern "C" fn(data: *mut c_void, idx: c_int, out_text: *mut *const c_char) - -> bool, - data: *mut c_void, - items_count: c_int, - height_in_items: c_int, - ) -> bool; pub fn igPlotLines( label: *const c_char, values: *const c_float, @@ -1136,6 +1267,37 @@ extern "C" { pub fn igProgressBar(fraction: c_float, size_arg: *const ImVec2, overlay: *const c_char); } +// Combo +extern "C" { + pub fn igBeginCombo( + label: *const c_char, + preview_value: *const c_char, + flags: ImGuiComboFlags, + ) -> bool; + pub fn igEndCombo(); + pub fn igCombo( + label: *const c_char, + current_item: *mut c_int, + items: *const *const c_char, + items_count: c_int, + height_in_items: c_int, + ) -> bool; + pub fn igCombo2( + label: *const c_char, + current_item: *mut c_int, + items_separated_by_zeros: *const c_char, + height_in_items: c_int, + ) -> bool; + pub fn igCombo3( + label: *const c_char, + current_item: *mut c_int, + items_getter: extern "C" fn(data: *mut c_void, idx: c_int, out_text: *mut *const c_char) -> bool, + data: *mut c_void, + items_count: c_int, + height_in_items: c_int, + ) -> bool; +} + // Widgets: Color Editor/Picker extern "C" { pub fn igColorEdit3( @@ -1564,6 +1726,24 @@ extern "C" { pub fn igLogText(fmt: *const c_char, ...); } +// DragDrop +extern "C" { + /// Call when current ID is active. + /// + /// When this returns true you need to: + /// + /// 1. call [`igSetDragDropPayload`] exactly once, + /// 2. you may render the payload visual/description, + /// 3. pcall [`igEndDragDropSource`] + pub fn igBeginDragDropSource(flags: ImGuiDragDropFlags, mouse_button: c_int) -> bool; + /// Use 'cond' to choose to submit payload on drag start or every frame + pub fn igSetDragDropPayload(type_: *const c_char, data: *const c_void, size: libc::size_t, cond: ImGuiCond) -> bool; + pub fn igEndDragDropSource(); + pub fn igBeginDragDropTarget() -> bool; + pub fn igAcceptDragDropPayload(type_: *const c_char, flags: ImGuiDragDropFlags) -> *const ImGuiPayload; + pub fn igEndDragDropTarget(); +} + // Clipping extern "C" { pub fn igPushClipRect( @@ -1577,6 +1757,14 @@ extern "C" { // Styles extern "C" { pub fn igStyleColorsClassic(dst: *mut ImGuiStyle); + pub fn igStyleColorsDark(dst: *mut ImGuiStyle); + pub fn igStyleColorsLight(dst: *mut ImGuiStyle); +} + +// Focus +extern "C" { + pub fn igSetItemDefaultFocus(); + pub fn igSetKeyboardFocusHere(offset: c_int); } // Utilities @@ -1591,11 +1779,8 @@ extern "C" { pub fn igGetItemRectMax(out: *mut ImVec2); pub fn igGetItemRectSize(out: *mut ImVec2); pub fn igSetItemAllowOverlap(); - pub fn igIsWindowFocused() -> bool; + pub fn igIsWindowFocused(flags: ImGuiFocusedFlags) -> bool; pub fn igIsWindowHovered(flags: ImGuiHoveredFlags) -> bool; - pub fn igIsRootWindowFocused() -> bool; - pub fn igIsRootWindowOrAnyChildFocused() -> bool; - pub fn igIsRootWindowOrAnyChildHovered(flags: ImGuiHoveredFlags) -> bool; pub fn igIsAnyWindowHovered() -> bool; pub fn igIsRectVisible(item_size: ImVec2) -> bool; pub fn igIsRectVisible2(rect_min: *const ImVec2, rect_max: *const ImVec2) -> bool; @@ -1645,6 +1830,28 @@ extern "C" { ); } +#[allow(non_snake_case)] +#[deprecated(since = "0.0.19", note = "please use igIsWindowFocused(ImGuiFocusedFlags::RootWindow) instead")] +pub unsafe fn igIsRootWindowFocused() -> bool { + igIsWindowFocused(ImGuiFocusedFlags::RootWindow) +} +#[allow(non_snake_case)] +#[deprecated(since = "0.0.19", note = "please use igIsWindowFocused(ImGuiFocusedFlags::RootAndChildWindows) instead")] +pub unsafe fn igIsRootWindowOrAnyChildFocused() -> bool { + igIsWindowFocused(ImGuiFocusedFlags::RootAndChildWindows) +} +#[allow(non_snake_case)] +#[deprecated(since = "0.0.19", note = "please use igIsWindowFocused(ImGuiFocusedFlags::RootAndChildWindows) instead")] +pub unsafe fn igIsRootWindowOrAnyChildHovered(_flags: ImGuiHoveredFlags) -> bool { + igIsWindowHovered(ImGuiHoveredFlags::RootAndChildWindows) +} + +// DrawList +extern "C" { + pub fn igGetOverlayDrawList() -> *mut ImDrawList; + pub fn igGetDrawListSharedData() -> *mut ImDrawListSharedData; +} + // Inputs extern "C" { pub fn igGetKeyIndex(imgui_key: ImGuiKey) -> c_int; @@ -1701,6 +1908,10 @@ extern "C" { pub fn igSetCurrentContext(ctx: *mut ImGuiContext); } +extern "C" { + pub fn ImFontConfig_DefaultConstructor(config: *mut ImFontConfig); +} + // ImGuiIO extern "C" { pub fn ImGuiIO_AddInputCharacter(c: c_ushort); @@ -1739,7 +1950,7 @@ extern "C" { pub fn ImGuiTextBuffer_empty(buffer: *mut ImGuiTextBuffer) -> bool; pub fn ImGuiTextBuffer_clear(buffer: *mut ImGuiTextBuffer); pub fn ImGuiTextBuffer_c_str(buffer: *const ImGuiTextBuffer) -> *const c_char; - pub fn ImGuiTextBuffer_append(buffer: *const ImGuiTextBuffer, fmt: *const c_char, ...); + pub fn ImGuiTextBuffer_appendf(buffer: *const ImGuiTextBuffer, fmt: *const c_char, ...); // pub fn ImGuiTextBuffer_appendv( // buffer: *const ImGuiTextBuffer, // fmt: *const c_char, @@ -1967,6 +2178,17 @@ extern "C" { uv_d: ImVec2, col: ImU32, ); + pub fn ImDrawList_AddImageRounded( + list: *mut ImDrawList, + user_texture_id: ImTextureID, + a: ImVec2, + b: ImVec2, + uv_a: ImVec2, + uv_b: ImVec2, + col: ImU32, + rounding: c_float, + rounding_corners: c_int, + ); pub fn ImDrawList_AddPolyLine( list: *mut ImDrawList, points: *const ImVec2, @@ -1974,14 +2196,12 @@ extern "C" { col: ImU32, closed: bool, thickness: c_float, - anti_aliased: bool, ); pub fn ImDrawList_AddConvexPolyFilled( list: *mut ImDrawList, points: *const ImVec2, num_points: c_int, col: ImU32, - anti_aliased: bool, ); pub fn ImDrawList_AddBezierCurve( list: *mut ImDrawList, @@ -2183,6 +2403,7 @@ extern "C" { pub fn ImFont_SetFallbackChar(font: *mut ImFont, c: ImWchar); pub fn ImFont_GetCharAdvance(font: *const ImFont, c: ImWchar) -> c_float; pub fn ImFont_IsLoaded(font: *const ImFont) -> bool; + pub fn ImFont_GetDebugName(font: *const ImFont) -> *const c_char; pub fn ImFont_CalcTextSizeA( font: *const ImFont, out: *mut ImVec2, @@ -2256,12 +2477,15 @@ fn test_default_style() { let style = unsafe { &*igGetStyle() }; assert_eq!(style.alpha, 1.0); assert_eq!(style.window_padding, ImVec2::new(8.0, 8.0)); + assert_eq!(style.window_rounding, 7.0); + assert_eq!(style.window_border_size, 0.0); assert_eq!(style.window_min_size, ImVec2::new(32.0, 32.0)); - assert_eq!(style.window_rounding, 9.0); assert_eq!(style.window_title_align, ImVec2::new(0.0, 0.5)); - assert_eq!(style.child_window_rounding, 0.0); + assert_eq!(style.popup_rounding, 0.0); + assert_eq!(style.popup_border_size, 1.0); assert_eq!(style.frame_padding, ImVec2::new(4.0, 3.0)); assert_eq!(style.frame_rounding, 0.0); + assert_eq!(style.frame_border_size, 0.0); assert_eq!(style.item_spacing, ImVec2::new(8.0, 4.0)); assert_eq!(style.item_inner_spacing, ImVec2::new(4.0, 4.0)); assert_eq!(style.touch_extra_padding, ImVec2::new(0.0, 0.0)); @@ -2275,6 +2499,6 @@ fn test_default_style() { assert_eq!(style.display_window_padding, ImVec2::new(22.0, 22.0)); assert_eq!(style.display_safe_area_padding, ImVec2::new(4.0, 4.0)); assert_eq!(style.anti_aliased_lines, true); - assert_eq!(style.anti_aliased_shapes, true); + assert_eq!(style.anti_aliased_fill, true); assert_eq!(style.curve_tessellation_tol, 1.25); } diff --git a/imgui-sys/third-party/cimgui b/imgui-sys/third-party/cimgui index 5112189..0781f92 160000 --- a/imgui-sys/third-party/cimgui +++ b/imgui-sys/third-party/cimgui @@ -1 +1 @@ -Subproject commit 511218914b6dde6d5e52c0d98454ead3369eb38d +Subproject commit 0781f921354a3f7a9eefd7aaab557a89cb14baea diff --git a/src/child_frame.rs b/src/child_frame.rs index b14f03a..aa1a0fd 100644 --- a/src/child_frame.rs +++ b/src/child_frame.rs @@ -7,6 +7,7 @@ use super::{ImStr, ImVec2, ImGuiWindowFlags, Ui}; pub struct ChildFrame<'ui, 'p> { name: &'p ImStr, size: ImVec2, + border: bool, flags: ImGuiWindowFlags, _phantom: PhantomData<&'ui Ui<'ui>>, } @@ -16,6 +17,7 @@ impl<'ui, 'p> ChildFrame<'ui, 'p> { ChildFrame { name: name, size: size.into(), + border: false, flags: ImGuiWindowFlags::empty(), _phantom: PhantomData, } @@ -47,7 +49,7 @@ impl<'ui, 'p> ChildFrame<'ui, 'p> { } #[inline] pub fn show_borders(mut self, value: bool) -> Self { - self.flags.set(ImGuiWindowFlags::ShowBorders, value); + self.border = value; self } #[inline] @@ -103,12 +105,8 @@ impl<'ui, 'p> ChildFrame<'ui, 'p> { 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 { sys::igBeginChild(self.name.as_ptr(), self.size, show_border, self.flags) }; + unsafe { sys::igBeginChild(self.name.as_ptr(), self.size, self.border, self.flags) }; if render_child_frame { f(); } diff --git a/src/fonts.rs b/src/fonts.rs index e5c0aae..a3023b7 100644 --- a/src/fonts.rs +++ b/src/fonts.rs @@ -156,7 +156,11 @@ impl ImFontConfig { } fn make_config(self) -> sys::ImFontConfig { - let mut config = sys::ImFontConfig::new(); + let mut config = unsafe { + let mut config = mem::uninitialized(); + sys::ImFontConfig_DefaultConstructor(&mut config); + config + }; config.size_pixels = self.size_pixels; config.oversample_h = self.oversample_h as c_int; config.oversample_v = self.oversample_v as c_int; diff --git a/src/input.rs b/src/input.rs index 8b8413b..ec16428 100644 --- a/src/input.rs +++ b/src/input.rs @@ -89,6 +89,24 @@ macro_rules! impl_text_flags { self.flags.set(ImGuiInputTextFlags::AlwaysInsertMode, value); self } + + #[inline] + pub fn read_only(mut self, value: bool) -> Self { + self.flags.set(ImGuiInputTextFlags::ReadOnly, value); + self + } + + #[inline] + pub fn password(mut self, value: bool) -> Self { + self.flags.set(ImGuiInputTextFlags::Password, value); + self + } + + #[inline] + pub fn no_undo_redo(mut self, value: bool) -> Self { + self.flags.set(ImGuiInputTextFlags::NoUndoRedo, value); + self + } } } diff --git a/src/lib.rs b/src/lib.rs index 888405c..0c99b31 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -421,9 +421,13 @@ impl<'ui> Ui<'ui> { sys::igShowStyleEditor(style as *mut ImGuiStyle); } } + #[deprecated(since = "0.0.19", note = "please use show_demo_window instead")] pub fn show_test_window(&self, opened: &mut bool) { + self.show_demo_window(opened) + } + pub fn show_demo_window(&self, opened: &mut bool) { unsafe { - sys::igShowTestWindow(opened); + sys::igShowDemoWindow(opened); } } pub fn show_metrics_window(&self, opened: &mut bool) { @@ -1198,12 +1202,25 @@ impl<'ui> Ui<'ui> { Alpha(v) => unsafe { igPushStyleVar(ImGuiStyleVar::Alpha, v) }, WindowPadding(v) => unsafe { igPushStyleVarVec(ImGuiStyleVar::WindowPadding, v) }, WindowRounding(v) => unsafe { igPushStyleVar(ImGuiStyleVar::WindowRounding, v) }, + WindowBorderSize(v) => unsafe { igPushStyleVar(ImGuiStyleVar::WindowBorderSize, v) }, WindowMinSize(v) => unsafe { igPushStyleVarVec(ImGuiStyleVar::WindowMinSize, v) }, - ChildWindowRounding(v) => unsafe { - igPushStyleVar(ImGuiStyleVar::ChildWindowRounding, v) + ChildRounding(v) => unsafe { + igPushStyleVar(ImGuiStyleVar::ChildRounding, v) + }, + ChildBorderSize(v) => unsafe { + igPushStyleVar(ImGuiStyleVar::ChildBorderSize, v) + }, + PopupRounding(v) => unsafe { + igPushStyleVar(ImGuiStyleVar::PopupRounding, v) + }, + PopupBorderSize(v) => unsafe { + igPushStyleVar(ImGuiStyleVar::PopupBorderSize, v) }, FramePadding(v) => unsafe { igPushStyleVarVec(ImGuiStyleVar::FramePadding, v) }, FrameRounding(v) => unsafe { igPushStyleVar(ImGuiStyleVar::FrameRounding, v) }, + FrameBorderSize(v) => unsafe { + igPushStyleVar(ImGuiStyleVar::FrameBorderSize, v) + }, ItemSpacing(v) => unsafe { igPushStyleVarVec(ImGuiStyleVar::ItemSpacing, v) }, ItemInnerSpacing(v) => unsafe { igPushStyleVarVec(ImGuiStyleVar::ItemInnerSpacing, v) }, IndentSpacing(v) => unsafe { igPushStyleVar(ImGuiStyleVar::IndentSpacing, v) }, diff --git a/src/style.rs b/src/style.rs index 04c683c..5e3039b 100644 --- a/src/style.rs +++ b/src/style.rs @@ -5,13 +5,26 @@ pub enum StyleVar { Alpha(f32), WindowPadding(ImVec2), WindowRounding(f32), + WindowBorderSize(f32), WindowMinSize(ImVec2), - ChildWindowRounding(f32), + ChildRounding(f32), + ChildBorderSize(f32), + PopupRounding(f32), + PopupBorderSize(f32), FramePadding(ImVec2), FrameRounding(f32), + FrameBorderSize(f32), ItemSpacing(ImVec2), ItemInnerSpacing(ImVec2), IndentSpacing(f32), GrabMinSize(f32), ButtonTextAlign(ImVec2), } + +impl StyleVar { + #[allow(non_snake_case)] + #[deprecated(since = "0.0.19", note = "please use ChildRounding instead")] + pub fn ChildWindowRounding(value: f32) -> Self { + StyleVar::ChildRounding(value) + } +} diff --git a/src/window.rs b/src/window.rs index 40d5d6c..7f6427e 100644 --- a/src/window.rs +++ b/src/window.rs @@ -2,7 +2,7 @@ use sys; use std::marker::PhantomData; use std::ptr; -use super::{ImGuiCond, ImGuiWindowFlags, ImStr, ImVec2, Ui}; +use super::{ImGuiCond, ImGuiStyleVar, ImGuiWindowFlags, ImStr, ImVec2, Ui}; #[must_use] pub struct Window<'ui, 'p> { @@ -13,6 +13,8 @@ pub struct Window<'ui, 'p> { name: &'p ImStr, opened: Option<&'p mut bool>, flags: ImGuiWindowFlags, + // Deprecated. Should be removed along with Window::show_borders + border: bool, _phantom: PhantomData<&'ui Ui<'ui>>, } @@ -26,6 +28,7 @@ impl<'ui, 'p> Window<'ui, 'p> { name: name, opened: None, flags: ImGuiWindowFlags::empty(), + border: false, _phantom: PhantomData, } } @@ -87,8 +90,9 @@ impl<'ui, 'p> Window<'ui, 'p> { self } #[inline] + #[deprecated(since = "0.0.19", note = "please use StyleVar instead")] pub fn show_borders(mut self, value: bool) -> Self { - self.flags.set(ImGuiWindowFlags::ShowBorders, value); + self.border = value; self } #[inline] @@ -156,6 +160,9 @@ impl<'ui, 'p> Window<'ui, 'p> { if !self.size_cond.is_empty() { sys::igSetNextWindowSize(self.size.into(), self.size_cond); } + if self.border { + sys::igPushStyleVar(ImGuiStyleVar::WindowBorderSize, 1.0); + } sys::igBegin( self.name.as_ptr(), self.opened.map(|x| x as *mut bool).unwrap_or( @@ -167,6 +174,11 @@ impl<'ui, 'p> Window<'ui, 'p> { if render { f(); } - unsafe { sys::igEnd() }; + unsafe { + sys::igEnd(); + if self.border { + sys::igPopStyleVar(1); + } + }; } }