use super::validation::dock_node_depth_from_i32;
use crate::sys;
use crate::ui::Ui;
pub struct DockNode<'ui> {
raw: *mut sys::ImGuiDockNode,
ui: &'ui Ui,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct NodeRect {
pub min: [f32; 2],
pub max: [f32; 2],
}
pub(super) fn new_dock_node<'ui>(ui: &'ui Ui, raw: *mut sys::ImGuiDockNode) -> DockNode<'ui> {
DockNode { raw, ui }
}
impl<'ui> DockNode<'ui> {
pub fn is_central(&self) -> bool {
self.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_IsCentralNode(self.raw) })
}
pub fn is_dock_space(&self) -> bool {
self.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_IsDockSpace(self.raw) })
}
pub fn is_empty(&self) -> bool {
self.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_IsEmpty(self.raw) })
}
pub fn is_split(&self) -> bool {
self.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_IsSplitNode(self.raw) })
}
pub fn is_root(&self) -> bool {
self.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_IsRootNode(self.raw) })
}
pub fn is_floating(&self) -> bool {
self.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_IsFloatingNode(self.raw) })
}
pub fn is_hidden_tab_bar(&self) -> bool {
self.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_IsHiddenTabBar(self.raw) })
}
pub fn is_no_tab_bar(&self) -> bool {
self.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_IsNoTabBar(self.raw) })
}
pub fn is_leaf(&self) -> bool {
self.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_IsLeafNode(self.raw) })
}
pub fn depth(&self) -> usize {
self.ui.run_with_bound_context(|| {
dock_node_depth_from_i32(unsafe {
sys::igDockNodeGetDepth(self.raw as *const sys::ImGuiDockNode) as i32
})
})
}
pub fn window_menu_button_id(&self) -> crate::Id {
self.ui.run_with_bound_context(|| unsafe {
crate::Id::from(sys::igDockNodeGetWindowMenuButtonId(
self.raw as *const sys::ImGuiDockNode,
))
})
}
pub fn root(&self) -> Option<DockNode<'ui>> {
let ptr = self
.ui
.run_with_bound_context(|| unsafe { sys::igDockNodeGetRootNode(self.raw) });
if ptr.is_null() {
None
} else {
Some(new_dock_node(self.ui, ptr))
}
}
pub fn is_in_hierarchy_of(&self, parent: &DockNode<'_>) -> bool {
assert!(
self.ui.context_raw() == parent.ui.context_raw(),
"DockNode::is_in_hierarchy_of() requires nodes from the same ImGui context"
);
self.ui.run_with_bound_context(|| unsafe {
sys::igDockNodeIsInHierarchyOf(self.raw, parent.raw)
})
}
pub fn rect(&self) -> NodeRect {
let r = self
.ui
.run_with_bound_context(|| unsafe { sys::ImGuiDockNode_Rect(self.raw) });
NodeRect {
min: [r.Min.x, r.Min.y],
max: [r.Max.x, r.Max.y],
}
}
}