dear-imgui-rs 0.14.0

High-level Rust bindings to Dear ImGui v1.92.7 with docking, WGPU/GL backends, and extensions (ImPlot/ImPlot3D, ImNodes, ImGuizmo, file browser, reflection-based UI)
Documentation
use super::types::*;
use crate::sys;

#[derive(Clone, Copy, Default)]
pub(in crate::platform_io::trampolines) struct CallbackSet {
    platform_create_window: Option<ViewportCb>,
    platform_destroy_window: Option<ViewportCb>,
    platform_show_window: Option<ViewportCb>,
    platform_set_window_pos: Option<ViewportVec2Cb>,
    platform_get_window_pos_raw: Option<RawViewportVec2OutCb>,
    platform_get_window_pos: Option<ViewportVec2OutCb>,
    platform_set_window_size: Option<ViewportVec2Cb>,
    platform_get_window_size_raw: Option<RawViewportVec2OutCb>,
    platform_get_window_size: Option<ViewportVec2OutCb>,
    platform_get_window_framebuffer_scale_raw: Option<RawViewportVec2OutCb>,
    platform_get_window_framebuffer_scale: Option<ViewportVec2OutCb>,
    platform_set_window_focus: Option<ViewportCb>,
    platform_get_window_dpi_scale: Option<ViewportF32RetCb>,
    platform_get_window_focus: Option<ViewportBoolRetCb>,
    platform_get_window_minimized: Option<ViewportBoolRetCb>,
    platform_on_changed_viewport: Option<ViewportCb>,
    platform_get_window_work_area_insets_raw: Option<RawViewportVec4OutCb>,
    platform_get_window_work_area_insets: Option<ViewportVec4OutCb>,
    platform_set_window_title: Option<ViewportTitleCb>,
    platform_set_window_alpha: Option<ViewportF32Cb>,
    platform_update_window: Option<ViewportCb>,
    platform_render_window: Option<ViewportRenderCb>,
    platform_swap_buffers: Option<ViewportRenderCb>,
    renderer_create_window: Option<ViewportCb>,
    renderer_destroy_window: Option<ViewportCb>,
    renderer_set_window_size: Option<ViewportVec2Cb>,
    renderer_render_window: Option<ViewportRenderCb>,
    renderer_swap_buffers: Option<ViewportRenderCb>,
}

impl CallbackSet {
    pub(in crate::platform_io::trampolines) fn clear_platform(&mut self) {
        self.platform_create_window = None;
        self.platform_destroy_window = None;
        self.platform_show_window = None;
        self.platform_set_window_pos = None;
        self.platform_get_window_pos_raw = None;
        self.platform_get_window_pos = None;
        self.platform_set_window_size = None;
        self.platform_get_window_size_raw = None;
        self.platform_get_window_size = None;
        self.platform_get_window_framebuffer_scale_raw = None;
        self.platform_get_window_framebuffer_scale = None;
        self.platform_set_window_focus = None;
        self.platform_get_window_dpi_scale = None;
        self.platform_get_window_focus = None;
        self.platform_get_window_minimized = None;
        self.platform_on_changed_viewport = None;
        self.platform_get_window_work_area_insets_raw = None;
        self.platform_get_window_work_area_insets = None;
        self.platform_set_window_title = None;
        self.platform_set_window_alpha = None;
        self.platform_update_window = None;
        self.platform_render_window = None;
        self.platform_swap_buffers = None;
    }

    pub(in crate::platform_io::trampolines) fn clear_renderer(&mut self) {
        self.renderer_create_window = None;
        self.renderer_destroy_window = None;
        self.renderer_set_window_size = None;
        self.renderer_render_window = None;
        self.renderer_swap_buffers = None;
    }

    pub(in crate::platform_io::trampolines) fn is_empty(&self) -> bool {
        self.platform_create_window.is_none()
            && self.platform_destroy_window.is_none()
            && self.platform_show_window.is_none()
            && self.platform_set_window_pos.is_none()
            && self.platform_get_window_pos_raw.is_none()
            && self.platform_get_window_pos.is_none()
            && self.platform_set_window_size.is_none()
            && self.platform_get_window_size_raw.is_none()
            && self.platform_get_window_size.is_none()
            && self.platform_get_window_framebuffer_scale_raw.is_none()
            && self.platform_get_window_framebuffer_scale.is_none()
            && self.platform_set_window_focus.is_none()
            && self.platform_get_window_dpi_scale.is_none()
            && self.platform_get_window_focus.is_none()
            && self.platform_get_window_minimized.is_none()
            && self.platform_on_changed_viewport.is_none()
            && self.platform_get_window_work_area_insets_raw.is_none()
            && self.platform_get_window_work_area_insets.is_none()
            && self.platform_set_window_title.is_none()
            && self.platform_set_window_alpha.is_none()
            && self.platform_update_window.is_none()
            && self.platform_render_window.is_none()
            && self.platform_swap_buffers.is_none()
            && self.renderer_create_window.is_none()
            && self.renderer_destroy_window.is_none()
            && self.renderer_set_window_size.is_none()
            && self.renderer_render_window.is_none()
            && self.renderer_swap_buffers.is_none()
    }
}

pub(in crate::platform_io::trampolines) struct ContextCallbacks {
    pub(in crate::platform_io::trampolines) ctx: *mut sys::ImGuiContext,
    pub(in crate::platform_io::trampolines) callbacks: CallbackSet,
}

pub(in crate::platform_io) struct CallbackSlot<T: Copy> {
    pub(in crate::platform_io::trampolines) get: fn(&CallbackSet) -> Option<T>,
    pub(in crate::platform_io::trampolines) set: fn(&mut CallbackSet, Option<T>),
}

macro_rules! callback_slot {
    ($name:ident, $field:ident, $ty:ty, $getter:ident, $setter:ident) => {
        fn $getter(callbacks: &CallbackSet) -> Option<$ty> {
            callbacks.$field
        }

        fn $setter(callbacks: &mut CallbackSet, callback: Option<$ty>) {
            callbacks.$field = callback;
        }

        pub(in crate::platform_io) const $name: CallbackSlot<$ty> = CallbackSlot {
            get: $getter,
            set: $setter,
        };
    };
}

callback_slot!(
    PLATFORM_CREATE_WINDOW_CB,
    platform_create_window,
    ViewportCb,
    get_platform_create_window,
    set_platform_create_window
);
callback_slot!(
    PLATFORM_DESTROY_WINDOW_CB,
    platform_destroy_window,
    ViewportCb,
    get_platform_destroy_window,
    set_platform_destroy_window
);
callback_slot!(
    PLATFORM_SHOW_WINDOW_CB,
    platform_show_window,
    ViewportCb,
    get_platform_show_window,
    set_platform_show_window
);
callback_slot!(
    PLATFORM_SET_WINDOW_POS_CB,
    platform_set_window_pos,
    ViewportVec2Cb,
    get_platform_set_window_pos,
    set_platform_set_window_pos
);
callback_slot!(
    PLATFORM_GET_WINDOW_POS_RAW_CB,
    platform_get_window_pos_raw,
    RawViewportVec2OutCb,
    get_platform_get_window_pos_raw,
    set_platform_get_window_pos_raw
);
callback_slot!(
    PLATFORM_GET_WINDOW_POS_CB,
    platform_get_window_pos,
    ViewportVec2OutCb,
    get_platform_get_window_pos,
    set_platform_get_window_pos
);
callback_slot!(
    PLATFORM_SET_WINDOW_SIZE_CB,
    platform_set_window_size,
    ViewportVec2Cb,
    get_platform_set_window_size,
    set_platform_set_window_size
);
callback_slot!(
    PLATFORM_GET_WINDOW_SIZE_RAW_CB,
    platform_get_window_size_raw,
    RawViewportVec2OutCb,
    get_platform_get_window_size_raw,
    set_platform_get_window_size_raw
);
callback_slot!(
    PLATFORM_GET_WINDOW_SIZE_CB,
    platform_get_window_size,
    ViewportVec2OutCb,
    get_platform_get_window_size,
    set_platform_get_window_size
);
callback_slot!(
    PLATFORM_GET_WINDOW_FRAMEBUFFER_SCALE_RAW_CB,
    platform_get_window_framebuffer_scale_raw,
    RawViewportVec2OutCb,
    get_platform_get_window_framebuffer_scale_raw,
    set_platform_get_window_framebuffer_scale_raw
);
callback_slot!(
    PLATFORM_GET_WINDOW_FRAMEBUFFER_SCALE_CB,
    platform_get_window_framebuffer_scale,
    ViewportVec2OutCb,
    get_platform_get_window_framebuffer_scale,
    set_platform_get_window_framebuffer_scale
);
callback_slot!(
    PLATFORM_SET_WINDOW_FOCUS_CB,
    platform_set_window_focus,
    ViewportCb,
    get_platform_set_window_focus,
    set_platform_set_window_focus
);
callback_slot!(
    PLATFORM_GET_WINDOW_DPI_SCALE_CB,
    platform_get_window_dpi_scale,
    ViewportF32RetCb,
    get_platform_get_window_dpi_scale,
    set_platform_get_window_dpi_scale
);
callback_slot!(
    PLATFORM_GET_WINDOW_FOCUS_CB,
    platform_get_window_focus,
    ViewportBoolRetCb,
    get_platform_get_window_focus,
    set_platform_get_window_focus
);
callback_slot!(
    PLATFORM_GET_WINDOW_MINIMIZED_CB,
    platform_get_window_minimized,
    ViewportBoolRetCb,
    get_platform_get_window_minimized,
    set_platform_get_window_minimized
);
callback_slot!(
    PLATFORM_ON_CHANGED_VIEWPORT_CB,
    platform_on_changed_viewport,
    ViewportCb,
    get_platform_on_changed_viewport,
    set_platform_on_changed_viewport
);
callback_slot!(
    PLATFORM_GET_WINDOW_WORK_AREA_INSETS_RAW_CB,
    platform_get_window_work_area_insets_raw,
    RawViewportVec4OutCb,
    get_platform_get_window_work_area_insets_raw,
    set_platform_get_window_work_area_insets_raw
);
callback_slot!(
    PLATFORM_GET_WINDOW_WORK_AREA_INSETS_CB,
    platform_get_window_work_area_insets,
    ViewportVec4OutCb,
    get_platform_get_window_work_area_insets,
    set_platform_get_window_work_area_insets
);
callback_slot!(
    PLATFORM_SET_WINDOW_TITLE_CB,
    platform_set_window_title,
    ViewportTitleCb,
    get_platform_set_window_title,
    set_platform_set_window_title
);
callback_slot!(
    PLATFORM_SET_WINDOW_ALPHA_CB,
    platform_set_window_alpha,
    ViewportF32Cb,
    get_platform_set_window_alpha,
    set_platform_set_window_alpha
);
callback_slot!(
    PLATFORM_UPDATE_WINDOW_CB,
    platform_update_window,
    ViewportCb,
    get_platform_update_window,
    set_platform_update_window
);
callback_slot!(
    PLATFORM_RENDER_WINDOW_CB,
    platform_render_window,
    ViewportRenderCb,
    get_platform_render_window,
    set_platform_render_window
);
callback_slot!(
    PLATFORM_SWAP_BUFFERS_CB,
    platform_swap_buffers,
    ViewportRenderCb,
    get_platform_swap_buffers,
    set_platform_swap_buffers
);
callback_slot!(
    RENDERER_CREATE_WINDOW_CB,
    renderer_create_window,
    ViewportCb,
    get_renderer_create_window,
    set_renderer_create_window
);
callback_slot!(
    RENDERER_DESTROY_WINDOW_CB,
    renderer_destroy_window,
    ViewportCb,
    get_renderer_destroy_window,
    set_renderer_destroy_window
);
callback_slot!(
    RENDERER_SET_WINDOW_SIZE_CB,
    renderer_set_window_size,
    ViewportVec2Cb,
    get_renderer_set_window_size,
    set_renderer_set_window_size
);
callback_slot!(
    RENDERER_RENDER_WINDOW_CB,
    renderer_render_window,
    ViewportRenderCb,
    get_renderer_render_window,
    set_renderer_render_window
);
callback_slot!(
    RENDERER_SWAP_BUFFERS_CB,
    renderer_swap_buffers,
    ViewportRenderCb,
    get_renderer_swap_buffers,
    set_renderer_swap_buffers
);