dear_node_editor/frame/
core.rs1use super::validation::assert_finite_vec2;
2use crate::{EditorContext, context::CurrentEditorGuard, sys, vec2};
3use dear_imgui_rs::Ui;
4use std::{cell::Cell, ffi::CString};
5
6pub 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}