From 0aafa08ddb154f3861400576ce0779b679734bba Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sun, 15 Feb 2026 20:51:49 +0300 Subject: [PATCH] Subwindow shortcut --- utility/src/gui/mod.rs | 8 +++++--- utility/src/gui/subwindow.rs | 39 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 utility/src/gui/subwindow.rs diff --git a/utility/src/gui/mod.rs b/utility/src/gui/mod.rs index adc3f22..667f4ba 100644 --- a/utility/src/gui/mod.rs +++ b/utility/src/gui/mod.rs @@ -1,7 +1,9 @@ +mod boot; pub mod lengths_table; pub mod render; mod slider; -mod boot; +mod subwindow; -pub use slider::{slider, labeled_slider}; -pub use boot::boot_eframe; \ No newline at end of file +pub use boot::boot_eframe; +pub use slider::{labeled_slider, slider}; +pub use subwindow::subwindow; diff --git a/utility/src/gui/subwindow.rs b/utility/src/gui/subwindow.rs new file mode 100644 index 0000000..0a4548f --- /dev/null +++ b/utility/src/gui/subwindow.rs @@ -0,0 +1,39 @@ +use eframe::egui; +use eframe::egui::{Frame, Ui, ViewportBuilder}; + +pub fn subwindow( + ui: &mut Ui, + id: &str, + title: &str, + extra_settings: impl FnOnce(ViewportBuilder) -> ViewportBuilder, + mut content: impl FnMut(&mut Ui), +) -> Response { + let id = egui::ViewportId::from_hash_of(id); + let vb = extra_settings(ViewportBuilder::default().with_title(title)); + + let closed = ui.ctx().show_viewport_immediate(id, vb, |ui, _| { + egui::CentralPanel::default() + .frame(Frame::default().inner_margin(0.0)) + .show(ui, |ui| content(ui)); + + return ui.input(|i| i.viewport().close_requested()); + }); + + return Response { closed }; +} + +pub struct Response { + closed: bool, +} + +impl Response { + pub fn close_requested(&self) -> bool { + return self.closed; + } + + pub fn on_close(&self, cb: impl FnOnce()) { + if self.closed { + cb() + } + } +}