diff --git a/crates/egui-winit/src/lib.rs b/crates/egui-winit/src/lib.rs index 3688426d9..3d98a783c 100644 --- a/crates/egui-winit/src/lib.rs +++ b/crates/egui-winit/src/lib.rs @@ -1029,7 +1029,9 @@ pub fn process_viewport_commands( } ViewportCommand::CursorVisible(v) => win.set_cursor_visible(v), ViewportCommand::CursorHitTest(v) => { - win.set_cursor_hittest(v); + if let Err(err) = win.set_cursor_hittest(v) { + log::error!("Setting viewport CursorHitTest: {err}"); + } } } } @@ -1054,6 +1056,8 @@ pub fn create_winit_window_builder(builder: &ViewportBuilder) -> winit::window:: .with_decorations(builder.decorations.map_or(false, |e| e)) .with_resizable(builder.resizable.map_or(false, |e| e)) .with_visible(builder.visible.map_or(false, |e| e)) + .with_maximized(builder.minimized.map_or(false, |e| e)) + .with_maximized(builder.maximized.map_or(false, |e| e)) .with_fullscreen( builder .fullscreen @@ -1061,8 +1065,16 @@ pub fn create_winit_window_builder(builder: &ViewportBuilder) -> winit::window:: .flatten(), ) .with_enabled_buttons( - WindowButtons::MAXIMIZE - | WindowButtons::MINIMIZE + builder + .minimize_button + .map(|v| v.then(|| WindowButtons::MINIMIZE)) + .flatten() + .unwrap_or(WindowButtons::empty()) + | builder + .maximize_button + .map(|v| v.then(|| WindowButtons::MAXIMIZE)) + .flatten() + .unwrap_or(WindowButtons::empty()) | builder .close_button .map(|v| v.then(|| WindowButtons::CLOSE)) @@ -1098,6 +1110,9 @@ pub fn create_winit_window_builder(builder: &ViewportBuilder) -> winit::window:: )); } + // TODO: implement `ViewportBuilder::hittest` + // Is not implemented because winit in his current state will not allow to set cursor_hittest on a `WindowBuilder` + window_builder } @@ -1211,6 +1226,13 @@ pub fn changes_between_builders( } } + if let Some(hittest) = new.hittest { + if Some(hittest) != last.hittest { + last.hittest = Some(hittest); + commands.push(ViewportCommand::CursorHitTest(hittest)); + } + } + // TODO: Implement compare for windows buttons let mut recreate_window = false; @@ -1229,6 +1251,20 @@ pub fn changes_between_builders( } } + if let Some(minimize_button) = new.minimize_button { + if Some(minimize_button) != last.minimize_button { + last.minimize_button = Some(minimize_button); + recreate_window = true; + } + } + + if let Some(maximized_button) = new.maximize_button { + if Some(maximized_button) != last.maximize_button { + last.maximize_button = Some(maximized_button); + recreate_window = true; + } + } + if let Some(title_hidden) = new.title_hidden { if Some(title_hidden) != last.title_hidden { last.title_hidden = Some(title_hidden); diff --git a/crates/egui/src/containers/popup.rs b/crates/egui/src/containers/popup.rs index bcf9bb31e..c74794466 100644 --- a/crates/egui/src/containers/popup.rs +++ b/crates/egui/src/containers/popup.rs @@ -257,9 +257,19 @@ fn show_tooltip_area_dyn<'c, R>( add_contents: Box R + 'c>, ) -> InnerResponse { use containers::*; + // TODO: Get window pos from winit + let parent_window_pos = (0, 0); + // TODO: Need some how to calculate the ui size before rendering! ctx.create_viewport_sync( - ViewportBuilder::default().with_title(format!("Popup Window: {area_id:?}")), + ViewportBuilder::default() + .with_position(Some(( + window_pos.x as i32 + parent_window_pos.0, + window_pos.y as i32 + parent_window_pos.1, + ))) + .with_decorations(false) + .with_title(format!("Popup Window: {area_id:?}")), |ctx| { + ctx.viewport_command(ctx.get_viewport_id(), ViewportCommand::CursorHitTest(false)); Area::new(area_id) .order(Order::Tooltip) .fixed_pos(window_pos) diff --git a/crates/egui/src/viewport.rs b/crates/egui/src/viewport.rs index 2e5b6ae6a..6977a0f18 100644 --- a/crates/egui/src/viewport.rs +++ b/crates/egui/src/viewport.rs @@ -47,6 +47,10 @@ pub struct ViewportBuilder { pub drag_and_drop: Option, pub close_button: Option, + pub minimize_button: Option, + pub maximize_button: Option, + + pub hittest: Option, } impl Default for ViewportBuilder { @@ -72,6 +76,9 @@ impl Default for ViewportBuilder { drag_and_drop: None, close_button: None, minimized: Some(false), + minimize_button: Some(true), + maximize_button: Some(true), + hittest: Some(true), } } } @@ -99,6 +106,9 @@ impl ViewportBuilder { drag_and_drop: None, close_button: None, minimized: None, + minimize_button: None, + maximize_button: None, + hittest: None, } } pub fn with_title(mut self, title: impl Into) -> Self { @@ -187,6 +197,16 @@ impl ViewportBuilder { self } + pub fn with_minimize_button(mut self, value: bool) -> Self { + self.minimize_button = Some(value); + self + } + + pub fn with_maximize_button(mut self, value: bool) -> Self { + self.maximize_button = Some(value); + self + } + pub fn with_drag_and_drop(mut self, value: bool) -> Self { self.drag_and_drop = Some(value); self @@ -196,8 +216,16 @@ impl ViewportBuilder { self.position = Some(value); self } + + /// Is not implemented for winit + /// You should use `ViewportCommand::CursorHitTest` if you want to set this! + pub fn with_hittest(mut self, value: bool) -> Self { + self.hittest = Some(value); + self + } } +/// You can send a `ViewportCommand` to the viewport with `Context::viewport_command` #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub enum ViewportCommand {