diff --git a/desktop/src/app.rs b/desktop/src/app.rs index 487bfbfa7e..f66abbe19b 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -46,6 +46,7 @@ pub(crate) struct App { cli: Cli, startup_time: Option, exit_reason: ExitReason, + hide_ui: bool, } impl App { @@ -109,6 +110,7 @@ impl App { cli, exit_reason: ExitReason::Shutdown, startup_time: None, + hide_ui: false, } } @@ -125,6 +127,10 @@ impl App { } fn resize(&mut self) { + if self.hide_ui { + self.handle_desktop_frontend_message(DesktopFrontendMessage::TmpToggleHideUI, &mut Vec::new()); + } + let Some(window) = &self.window else { tracing::error!("Resize failed due to missing window"); return; @@ -239,6 +245,19 @@ impl App { }); } DesktopFrontendMessage::UpdateViewportPhysicalBounds { x, y, width, height } => { + if self.hide_ui { + if x != 0.0 && y != 0.0 { + let message = DesktopWrapperMessage::TmpUpdateViewport { + x: 0., + y: 0., + width: self.window_size.width as f64 / self.window_scale, + height: self.window_size.height as f64 / self.window_scale, + }; + self.dispatch_desktop_wrapper_message(message); + } + return; + } + if let Some(render_state) = &mut self.render_state && let Some(window) = &self.window { @@ -254,6 +273,9 @@ impl App { } } DesktopFrontendMessage::UpdateUIScale { scale } => { + if self.hide_ui { + return; + } self.ui_scale = scale; self.resize(); } @@ -402,6 +424,22 @@ impl App { DesktopFrontendMessage::Restart => { self.exit(Some(ExitReason::Restart)); } + + DesktopFrontendMessage::TmpToggleHideUI => { + if self.hide_ui { + self.hide_ui = false; + } else { + let message = DesktopWrapperMessage::TmpUpdateViewport { + x: 0., + y: 0., + width: self.window_size.width as f64 / self.window_scale, + height: self.window_size.height as f64 / self.window_scale, + }; + self.dispatch_desktop_wrapper_message(message); + self.render_state.as_mut().unwrap().unbind_ui_texture(); + self.hide_ui = true; + } + } } } @@ -451,6 +489,10 @@ impl App { NodeGraphExecutionResult::NotRun => {} }, AppEvent::UiUpdate(texture) => { + if self.hide_ui { + return; + } + if let Some(render_state) = self.render_state.as_mut() { render_state.bind_ui_texture(texture); } diff --git a/desktop/src/render/state.rs b/desktop/src/render/state.rs index 11abd851e6..cac12a2dc4 100644 --- a/desktop/src/render/state.rs +++ b/desktop/src/render/state.rs @@ -217,6 +217,11 @@ impl RenderState { self.update_bindgroup(); } + pub(crate) fn unbind_ui_texture(&mut self) { + self.ui_texture = None; + self.update_bindgroup(); + } + pub(crate) fn set_viewport_scale(&mut self, scale: [f32; 2]) { self.surface_outdated = true; self.viewport_scale = scale; diff --git a/desktop/wrapper/src/handle_desktop_wrapper_message.rs b/desktop/wrapper/src/handle_desktop_wrapper_message.rs index e4efc915c2..643f78dd95 100644 --- a/desktop/wrapper/src/handle_desktop_wrapper_message.rs +++ b/desktop/wrapper/src/handle_desktop_wrapper_message.rs @@ -97,5 +97,10 @@ pub(super) fn handle_desktop_wrapper_message(dispatcher: &mut DesktopWrapperMess let message = AppWindowMessage::PointerLockMove { x, y }; dispatcher.queue_editor_message(message); } + + DesktopWrapperMessage::TmpUpdateViewport { x, y, width, height } => { + let message = ViewportMessage::TmpUpdateBounds { x, y, width, height }; + dispatcher.queue_editor_message(message); + } } } diff --git a/desktop/wrapper/src/intercept_frontend_message.rs b/desktop/wrapper/src/intercept_frontend_message.rs index 0d8e6b21ac..f581f164ca 100644 --- a/desktop/wrapper/src/intercept_frontend_message.rs +++ b/desktop/wrapper/src/intercept_frontend_message.rs @@ -154,6 +154,10 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD FrontendMessage::WindowRestart => { dispatcher.respond(DesktopFrontendMessage::Restart); } + + FrontendMessage::TmpToggleHideUI => { + dispatcher.respond(DesktopFrontendMessage::TmpToggleHideUI); + } m => return Some(m), } None diff --git a/desktop/wrapper/src/messages.rs b/desktop/wrapper/src/messages.rs index 6a7105d5c7..3a57d62039 100644 --- a/desktop/wrapper/src/messages.rs +++ b/desktop/wrapper/src/messages.rs @@ -75,6 +75,8 @@ pub enum DesktopFrontendMessage { WindowHideOthers, WindowShowAll, Restart, + + TmpToggleHideUI, } pub enum DesktopWrapperMessage { @@ -126,6 +128,13 @@ pub enum DesktopWrapperMessage { x: f64, y: f64, }, + + TmpUpdateViewport { + x: f64, + y: f64, + width: f64, + height: f64, + }, } #[derive(Clone, serde::Serialize, serde::Deserialize, Debug)] diff --git a/editor/src/consts.rs b/editor/src/consts.rs index 5c820ff3e6..b7f7c4a5a3 100644 --- a/editor/src/consts.rs +++ b/editor/src/consts.rs @@ -26,7 +26,7 @@ pub const VIEWPORT_SCROLL_RATE: f64 = 0.6; pub const VIEWPORT_ROTATE_SNAP_INTERVAL: f64 = 15.; -pub const VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR: f64 = 0.95; +pub const VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR: f64 = 0.999; pub const DRAG_BEYOND_VIEWPORT_MAX_OVEREXTENSION_PIXELS: f64 = 50.; pub const DRAG_BEYOND_VIEWPORT_SPEED_FACTOR: f64 = 20.; diff --git a/editor/src/messages/app_window/app_window_message.rs b/editor/src/messages/app_window/app_window_message.rs index 2acf297fae..9b74652d84 100644 --- a/editor/src/messages/app_window/app_window_message.rs +++ b/editor/src/messages/app_window/app_window_message.rs @@ -14,4 +14,5 @@ pub enum AppWindowMessage { Hide, HideOthers, ShowAll, + TmpToggleHideUI } diff --git a/editor/src/messages/app_window/app_window_message_handler.rs b/editor/src/messages/app_window/app_window_message_handler.rs index fd7b05f630..ad5d181187 100644 --- a/editor/src/messages/app_window/app_window_message_handler.rs +++ b/editor/src/messages/app_window/app_window_message_handler.rs @@ -44,6 +44,19 @@ impl MessageHandler for AppWindowMessageHandler { responses.add(PortfolioMessage::AutoSaveAllDocuments); responses.add(FrontendMessage::WindowRestart); } + AppWindowMessage::TmpToggleHideUI => { + responses.add(FrontendMessage::TmpToggleHideUI); + responses.add(PortfolioMessage::ToggleFocusDocument); + responses.add(DeferMessage::AfterGraphRun { + messages: vec![ + DocumentMessage::ZoomCanvasToFitAll.into(), + DeferMessage::AfterGraphRun { + messages: vec![DocumentMessage::ZoomCanvasToFitAll.into()], + } + .into(), + ], + }); + } } } advertise_actions!(AppWindowMessageDiscriminant; @@ -54,6 +67,7 @@ impl MessageHandler for AppWindowMessageHandler { Drag, Hide, HideOthers, + TmpToggleHideUI, ); } diff --git a/editor/src/messages/frontend/frontend_message.rs b/editor/src/messages/frontend/frontend_message.rs index bf1535c9ad..aa128bb177 100644 --- a/editor/src/messages/frontend/frontend_message.rs +++ b/editor/src/messages/frontend/frontend_message.rs @@ -377,4 +377,6 @@ pub enum FrontendMessage { WindowHideOthers, WindowShowAll, WindowRestart, + + TmpToggleHideUI, } diff --git a/editor/src/messages/input_mapper/input_mappings.rs b/editor/src/messages/input_mapper/input_mappings.rs index 644b8d5a7b..07b3e98bcc 100644 --- a/editor/src/messages/input_mapper/input_mappings.rs +++ b/editor/src/messages/input_mapper/input_mappings.rs @@ -60,6 +60,7 @@ pub fn input_mappings(zoom_with_scroll: bool) -> Mapping { entry!(KeyDown(F11); disabled=is_mac, action_dispatch=AppWindowMessage::Fullscreen), entry!(KeyDown(KeyF); modifiers=[Command, Control], disabled=!is_mac, action_dispatch=AppWindowMessage::Fullscreen), entry!(KeyDown(KeyQ); modifiers=[Command], disabled=cfg!(not(target_os = "macos")), action_dispatch=AppWindowMessage::Close), + entry!(KeyDown(F11); modifiers=[Alt], action_dispatch=AppWindowMessage::TmpToggleHideUI), // // ClipboardMessage entry!(KeyDown(KeyX); modifiers=[Accel], action_dispatch=ClipboardMessage::Cut), diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 234c0f383a..f2ae7e31a1 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -1402,7 +1402,7 @@ impl MessageHandler> for DocumentMes responses.add(NavigationMessage::CanvasFlip); } responses.add(NavigationMessage::CanvasTiltSet { angle_radians: 0. }); - responses.add(NavigationMessage::FitViewportToBounds { bounds, prevent_zoom_past_100: true }); + responses.add(NavigationMessage::FitViewportToBounds { bounds, prevent_zoom_past_100: false }); } else { warn!("Cannot zoom due to no bounds") } diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index c9d5c57e68..3d020cc650 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -1111,6 +1111,16 @@ impl MessageHandler> for Portfolio responses.add(PortfolioMessage::UpdateDocumentWidgets); responses.add(PropertiesPanelMessage::Clear); } + + responses.add(DeferMessage::AfterGraphRun { + messages: vec![ + DocumentMessage::ZoomCanvasToFitAll.into(), + DeferMessage::AfterGraphRun { + messages: vec![DocumentMessage::ZoomCanvasToFitAll.into()], + } + .into(), + ], + }); } PortfolioMessage::SubmitDocumentExport { name, diff --git a/editor/src/messages/viewport/viewport_message.rs b/editor/src/messages/viewport/viewport_message.rs index 06c5af74c2..e6dd5678a7 100644 --- a/editor/src/messages/viewport/viewport_message.rs +++ b/editor/src/messages/viewport/viewport_message.rs @@ -4,5 +4,6 @@ use crate::messages::prelude::*; #[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)] pub enum ViewportMessage { Update { x: f64, y: f64, width: f64, height: f64, scale: f64 }, + TmpUpdateBounds { x: f64, y: f64, width: f64, height: f64 }, RepropagateUpdate, } diff --git a/editor/src/messages/viewport/viewport_message_handler.rs b/editor/src/messages/viewport/viewport_message_handler.rs index c0d64b92ef..7b0a2bc63c 100644 --- a/editor/src/messages/viewport/viewport_message_handler.rs +++ b/editor/src/messages/viewport/viewport_message_handler.rs @@ -35,6 +35,14 @@ impl MessageHandler for ViewportMessageHandler { }; responses.add(NodeGraphMessage::UpdateNodeGraphWidth); } + ViewportMessage::TmpUpdateBounds { x, y, width, height } => { + self.bounds = Bounds { + offset: Point { x, y }, + size: Point { x: width, y: height }, + }; + responses.add(NodeGraphMessage::UpdateNodeGraphWidth); + } + ViewportMessage::RepropagateUpdate => {} }