Skip to main content

dear_node_editor/frame/
core.rs

1use super::validation::assert_finite_vec2;
2use crate::{EditorContext, context::CurrentEditorGuard, sys, vec2};
3use dear_imgui_rs::Ui;
4use std::{cell::Cell, ffi::CString};
5
6/// RAII token for an active node-editor frame.
7pub struct NodeEditorFrame<'ui> {
8    pub(super) _ui: &'ui Ui,
9    pub(super) _editor: &'ui EditorContext,
10    pub(super) _current_editor: CurrentEditorGuard<'ui>,
11    pub(super) suspended: Cell<bool>,
12    pub(super) ended: bool,
13}
14
15impl<'ui> NodeEditorFrame<'ui> {
16    pub(crate) fn new(
17        ui: &'ui Ui,
18        editor: &'ui EditorContext,
19        id: impl AsRef<str>,
20        size: [f32; 2],
21    ) -> Self {
22        assert_finite_vec2("Ui::node_editor()", "size", size);
23        let current_editor = editor.bind_current("Ui::node_editor");
24        let id = CString::new(id.as_ref()).expect("node editor id cannot contain NUL bytes");
25        unsafe { sys::dne_begin(id.as_ptr(), vec2(size)) };
26        Self {
27            _ui: ui,
28            _editor: editor,
29            _current_editor: current_editor,
30            suspended: Cell::new(false),
31            ended: false,
32        }
33    }
34
35    pub fn end(mut self) {
36        self.end_inner();
37    }
38
39    fn end_inner(&mut self) {
40        if !self.ended {
41            unsafe { sys::dne_end() };
42            self.ended = true;
43        }
44    }
45}
46
47impl Drop for NodeEditorFrame<'_> {
48    fn drop(&mut self) {
49        self.end_inner();
50    }
51}