use crate::{EditorContext, sys};
use imgui::ImColor32;
#[derive(Debug, Clone)] #[repr(transparent)]
pub struct Style(sys::ImNodesStyle);
impl Default for Style {
fn default() -> Self {
let mut style = sys::ImNodesStyle {
GridSpacing: 24.0,
NodeCornerRounding: 4.0,
NodePadding: sys::ImVec2 { x: 8.0, y: 8.0 },
NodeBorderThickness: 1.0,
LinkThickness: 3.0,
LinkLineSegmentsPerLength: 0.1,
LinkHoverDistance: 10.0,
PinCircleRadius: 4.0,
PinQuadSideLength: 7.0,
PinTriangleSideLength: 9.5,
PinLineThickness: 1.0,
PinHoverRadius: 10.0,
PinOffset: 0.0,
MiniMapPadding: sys::ImVec2 { x: 8.0, y: 8.0 },
MiniMapOffset: sys::ImVec2 { x: 4.0, y: 4.0 },
Flags: (StyleFlags::GridLines as i32) | (StyleFlags::NodeOutline as i32),
Colors: [0; sys::ImNodesCol__ImNodesCol_COUNT as usize],
};
unsafe {
sys::imnodes_StyleColorsDark(&mut style);
}
Style(style)
}
}
#[deprecated = "Use `imnodes::Style::default()` instead."]
#[must_use]
pub fn create_imnodes_style() -> sys::ImNodesStyle {
Style::default().0 }
impl EditorContext {
#[doc(alias = "StyleColorsDark")]
pub fn set_style_colors_dark(&self, style: &mut Style) -> &Self {
unsafe { sys::imnodes_StyleColorsDark(&mut style.0) };
self
}
#[doc(alias = "StyleColorsClassic")]
pub fn set_style_colors_classic(&self, style: &mut Style) -> &Self {
unsafe { sys::imnodes_StyleColorsClassic(&mut style.0) };
self
}
#[doc(alias = "StyleColorsLight")]
pub fn set_style_colors_light(&self, style: &mut Style) -> &Self {
unsafe { sys::imnodes_StyleColorsLight(&mut style.0) };
self
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[repr(u32)]
pub enum ColorStyle {
NodeBackground = sys::ImNodesCol__ImNodesCol_NodeBackground,
NodeBackgroundHovered = sys::ImNodesCol__ImNodesCol_NodeBackgroundHovered,
NodeBackgroundSelected = sys::ImNodesCol__ImNodesCol_NodeBackgroundSelected,
NodeOutline = sys::ImNodesCol__ImNodesCol_NodeOutline,
TitleBar = sys::ImNodesCol__ImNodesCol_TitleBar,
TitleBarHovered = sys::ImNodesCol__ImNodesCol_TitleBarHovered,
TitleBarSelected = sys::ImNodesCol__ImNodesCol_TitleBarSelected,
Link = sys::ImNodesCol__ImNodesCol_Link,
LinkHovered = sys::ImNodesCol__ImNodesCol_LinkHovered,
LinkSelected = sys::ImNodesCol__ImNodesCol_LinkSelected,
Pin = sys::ImNodesCol__ImNodesCol_Pin,
PinHovered = sys::ImNodesCol__ImNodesCol_PinHovered,
BoxSelector = sys::ImNodesCol__ImNodesCol_BoxSelector,
BoxSelectorOutline = sys::ImNodesCol__ImNodesCol_BoxSelectorOutline,
GridBackground = sys::ImNodesCol__ImNodesCol_GridBackground,
GridLine = sys::ImNodesCol__ImNodesCol_GridLine,
GridLinePrimary = sys::ImNodesCol__ImNodesCol_GridLinePrimary,
MiniMapBackground = sys::ImNodesCol__ImNodesCol_MiniMapBackground,
MiniMapBackgroundHovered = sys::ImNodesCol__ImNodesCol_MiniMapBackgroundHovered,
MiniMapOutline = sys::ImNodesCol__ImNodesCol_MiniMapOutline,
MiniMapOutlineHovered = sys::ImNodesCol__ImNodesCol_MiniMapOutlineHovered,
MiniMapNodeBackground = sys::ImNodesCol__ImNodesCol_MiniMapNodeBackground,
MiniMapNodeBackgroundHovered = sys::ImNodesCol__ImNodesCol_MiniMapNodeBackgroundHovered,
MiniMapNodeBackgroundSelected = sys::ImNodesCol__ImNodesCol_MiniMapNodeBackgroundSelected,
MiniMapNodeOutline = sys::ImNodesCol__ImNodesCol_MiniMapNodeOutline,
MiniMapLink = sys::ImNodesCol__ImNodesCol_MiniMapLink,
MiniMapLinkSelected = sys::ImNodesCol__ImNodesCol_MiniMapLinkSelected,
MiniMapCanvas = sys::ImNodesCol__ImNodesCol_MiniMapCanvas,
MiniMapCanvasOutline = sys::ImNodesCol__ImNodesCol_MiniMapCanvasOutline,
COUNT = sys::ImNodesCol__ImNodesCol_COUNT,
}
impl ColorStyle {
pub const COUNT: u32 = sys::ImNodesCol__ImNodesCol_COUNT;
#[doc(alias = "PushColorStyle")]
#[must_use = "The returned ColorToken must be popped to restore the previous color"]
pub fn push_color<C: Into<ImColor32>>(self, color: C, _context: &EditorContext) -> ColorToken {
let color: ImColor32 = color.into();
unsafe { sys::imnodes_PushColorStyle(self as i32, color.into()) };
ColorToken { ended: false }
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct ColorToken {
ended: bool,
}
impl ColorToken {
#[doc(alias = "PopColorStyle")]
pub fn pop(mut self) {
self.ended = true;
unsafe { sys::imnodes_PopColorStyle() };
}
}
impl Drop for ColorToken {
fn drop(&mut self) {
assert!(
self.ended,
"`ColorToken` was dropped without calling `pop()`. This likely means a color style was pushed but not popped, leading to an incorrect style stack."
);
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[repr(u32)]
pub enum MiniMapLocation {
BottomLeft = sys::ImNodesMiniMapLocation__ImNodesMiniMapLocation_BottomLeft,
BottomRight = sys::ImNodesMiniMapLocation__ImNodesMiniMapLocation_BottomRight,
TopLeft = sys::ImNodesMiniMapLocation__ImNodesMiniMapLocation_TopLeft,
TopRight = sys::ImNodesMiniMapLocation__ImNodesMiniMapLocation_TopRight,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[repr(u32)]
pub enum StyleVar {
GridSpacing = sys::ImNodesStyleVar__ImNodesStyleVar_GridSpacing,
NodeCornerRounding = sys::ImNodesStyleVar__ImNodesStyleVar_NodeCornerRounding,
NodePadding = sys::ImNodesStyleVar__ImNodesStyleVar_NodePadding,
NodeBorderThickness = sys::ImNodesStyleVar__ImNodesStyleVar_NodeBorderThickness,
LinkThickness = sys::ImNodesStyleVar__ImNodesStyleVar_LinkThickness,
LinkLineSegmentsPerLength = sys::ImNodesStyleVar__ImNodesStyleVar_LinkLineSegmentsPerLength,
LinkHoverDistance = sys::ImNodesStyleVar__ImNodesStyleVar_LinkHoverDistance,
PinCircleRadius = sys::ImNodesStyleVar__ImNodesStyleVar_PinCircleRadius,
PinQuadSideLength = sys::ImNodesStyleVar__ImNodesStyleVar_PinQuadSideLength,
PinTriangleSideLength = sys::ImNodesStyleVar__ImNodesStyleVar_PinTriangleSideLength,
PinLineThickness = sys::ImNodesStyleVar__ImNodesStyleVar_PinLineThickness,
PinHoverRadius = sys::ImNodesStyleVar__ImNodesStyleVar_PinHoverRadius,
PinOffset = sys::ImNodesStyleVar__ImNodesStyleVar_PinOffset,
MiniMapPadding = sys::ImNodesStyleVar__ImNodesStyleVar_MiniMapPadding,
MiniMapOffset = sys::ImNodesStyleVar__ImNodesStyleVar_MiniMapOffset,
COUNT = sys::ImNodesStyleVar__ImNodesStyleVar_COUNT,
}
impl StyleVar {
#[doc(alias = "PushStyleVar_Float")]
#[must_use = "The returned StyleVarToken must be popped to restore the previous value"]
pub fn push_f32(self, value: f32, _context: &EditorContext) -> StyleVarToken {
match self {
StyleVar::NodePadding | StyleVar::MiniMapPadding | StyleVar::MiniMapOffset => {
panic!("StyleVar {self:?} expects an ImVec2, use push_vec2");
}
_ => {}
}
unsafe { sys::imnodes_PushStyleVar_Float(self as i32, value) };
StyleVarToken { ended: false }
}
#[doc(alias = "PushStyleVar_Vec2")]
#[must_use = "The returned StyleVarToken must be popped to restore the previous value"]
pub fn push_vec2(self, value: sys::ImVec2, _context: &EditorContext) -> StyleVarToken {
match self {
StyleVar::NodePadding | StyleVar::MiniMapPadding | StyleVar::MiniMapOffset => {}
_ => {
panic!("StyleVar {self:?} expects a float, use push_f32");
}
}
unsafe { sys::imnodes_PushStyleVar_Vec2(self as i32, value) };
StyleVarToken { ended: false }
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct StyleVarToken {
ended: bool,
}
impl StyleVarToken {
#[doc(alias = "PopStyleVar")]
pub fn pop(mut self, count: i32) {
assert!(count > 0, "Pop count must be positive");
self.ended = true;
unsafe { sys::imnodes_PopStyleVar(count) };
}
}
impl Drop for StyleVarToken {
fn drop(&mut self) {
assert!(
self.ended,
"`StyleVarToken` was dropped without calling `pop()`. This likely means a style variable was pushed but not popped, leading to an incorrect style stack."
);
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[repr(i32)] pub enum StyleFlags {
None = sys::ImNodesStyleFlags__ImNodesStyleFlags_None as i32,
NodeOutline = sys::ImNodesStyleFlags__ImNodesStyleFlags_NodeOutline as i32,
GridLines = sys::ImNodesStyleFlags__ImNodesStyleFlags_GridLines as i32,
GridLinesPrimary = sys::ImNodesStyleFlags__ImNodesStyleFlags_GridLinesPrimary as i32,
GridSnapping = sys::ImNodesStyleFlags__ImNodesStyleFlags_GridSnapping as i32,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[repr(u32)]
pub enum PinShape {
Circle = sys::ImNodesPinShape__ImNodesPinShape_Circle,
CircleFilled = sys::ImNodesPinShape__ImNodesPinShape_CircleFilled,
Triangle = sys::ImNodesPinShape__ImNodesPinShape_Triangle,
TriangleFilled = sys::ImNodesPinShape__ImNodesPinShape_TriangleFilled,
Quad = sys::ImNodesPinShape__ImNodesPinShape_Quad,
QuadFilled = sys::ImNodesPinShape__ImNodesPinShape_QuadFilled,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[repr(i32)] pub enum AttributeFlags {
None = sys::ImNodesAttributeFlags__ImNodesAttributeFlags_None as i32,
EnableLinkDetachWithDragClick =
sys::ImNodesAttributeFlags__ImNodesAttributeFlags_EnableLinkDetachWithDragClick as i32,
EnableLinkCreationOnSnap =
sys::ImNodesAttributeFlags__ImNodesAttributeFlags_EnableLinkCreationOnSnap as i32,
}
impl EditorContext {
#[doc(alias = "PushAttributeFlag")]
#[must_use = "The returned AttributeFlagToken must be popped to restore the previous flag state"]
pub fn push_attribute_flag(&self, flag: AttributeFlags) -> AttributeFlagToken {
unsafe { sys::imnodes_PushAttributeFlag(flag as i32) };
AttributeFlagToken { ended: false }
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct AttributeFlagToken {
ended: bool,
}
impl AttributeFlagToken {
#[doc(alias = "PopAttributeFlag")]
pub fn pop(mut self) {
self.ended = true;
unsafe { sys::imnodes_PopAttributeFlag() };
}
}
impl Drop for AttributeFlagToken {
fn drop(&mut self) {
assert!(
self.ended,
"`AttributeFlagToken` was dropped without calling `pop()`. This likely means an attribute flag was pushed but not popped, leading to incorrect behavior."
);
}
}