use super::validation::dock_node_depth_from_i32;
use crate::sys;
use crate::ui::Ui;
use std::marker::PhantomData;
pub struct DockNode<'ui> {
raw: *mut sys::ImGuiDockNode,
_phantom: PhantomData<&'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>(raw: *mut sys::ImGuiDockNode) -> DockNode<'ui> {
DockNode {
raw,
_phantom: PhantomData,
}
}
impl<'ui> DockNode<'ui> {
pub fn is_central(&self) -> bool {
unsafe { sys::ImGuiDockNode_IsCentralNode(self.raw) }
}
pub fn is_dock_space(&self) -> bool {
unsafe { sys::ImGuiDockNode_IsDockSpace(self.raw) }
}
pub fn is_empty(&self) -> bool {
unsafe { sys::ImGuiDockNode_IsEmpty(self.raw) }
}
pub fn is_split(&self) -> bool {
unsafe { sys::ImGuiDockNode_IsSplitNode(self.raw) }
}
pub fn is_root(&self) -> bool {
unsafe { sys::ImGuiDockNode_IsRootNode(self.raw) }
}
pub fn is_floating(&self) -> bool {
unsafe { sys::ImGuiDockNode_IsFloatingNode(self.raw) }
}
pub fn is_hidden_tab_bar(&self) -> bool {
unsafe { sys::ImGuiDockNode_IsHiddenTabBar(self.raw) }
}
pub fn is_no_tab_bar(&self) -> bool {
unsafe { sys::ImGuiDockNode_IsNoTabBar(self.raw) }
}
pub fn is_leaf(&self) -> bool {
unsafe { sys::ImGuiDockNode_IsLeafNode(self.raw) }
}
pub fn depth(&self) -> usize {
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 {
unsafe {
crate::Id::from(sys::igDockNodeGetWindowMenuButtonId(
self.raw as *const sys::ImGuiDockNode,
))
}
}
pub fn root<'a>(&self, _ui: &'a Ui) -> Option<DockNode<'a>> {
let ptr = unsafe { sys::igDockNodeGetRootNode(self.raw) };
if ptr.is_null() {
None
} else {
Some(new_dock_node(ptr))
}
}
pub fn is_in_hierarchy_of(&self, parent: &DockNode<'_>) -> bool {
unsafe { sys::igDockNodeIsInHierarchyOf(self.raw, parent.raw) }
}
pub fn rect(&self) -> NodeRect {
let r = unsafe { sys::ImGuiDockNode_Rect(self.raw) };
NodeRect {
min: [r.Min.x, r.Min.y],
max: [r.Max.x, r.Max.y],
}
}
}