diff --git a/editor/src/messages/input_mapper/default_mapping.rs b/editor/src/messages/input_mapper/default_mapping.rs index 07399a13..0464d2c8 100644 --- a/editor/src/messages/input_mapper/default_mapping.rs +++ b/editor/src/messages/input_mapper/default_mapping.rs @@ -280,6 +280,7 @@ pub fn default_mapping() -> Mapping { entry!(KeyDown(PageDown); modifiers=[Shift], action_dispatch=NavigationMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(-1., 0.) }), entry!(KeyDown(PageUp); action_dispatch=NavigationMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(0., 1.) }), entry!(KeyDown(PageDown); action_dispatch=NavigationMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(0., -1.) }), + entry!(KeyDown(Period); action_dispatch=NavigationMessage::FitViewportToSelection), // // PortfolioMessage entry!(KeyDown(KeyO); modifiers=[Accel], action_dispatch=PortfolioMessage::OpenDocument), diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 3b5d5513..503f69a6 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -186,7 +186,8 @@ impl MessageHandler { - self.navigation_handler.process_message(message, responses, (&self.document_legacy, ipp)); + self.navigation_handler + .process_message(message, responses, (&self.document_legacy, ipp, self.selected_visible_layers_bounding_box(&render_data))); } #[remain::unsorted] Overlays(message) => { diff --git a/editor/src/messages/portfolio/document/navigation/navigation_message.rs b/editor/src/messages/portfolio/document/navigation/navigation_message.rs index aa869b25..e7ed33dc 100644 --- a/editor/src/messages/portfolio/document/navigation/navigation_message.rs +++ b/editor/src/messages/portfolio/document/navigation/navigation_message.rs @@ -17,6 +17,7 @@ pub enum NavigationMessage { padding_scale_factor: Option, prevent_zoom_past_100: bool, }, + FitViewportToSelection, IncreaseCanvasZoom { center_on_mouse: bool, }, diff --git a/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs b/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs index 73771ae9..7e655d9a 100644 --- a/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs +++ b/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs @@ -1,4 +1,7 @@ -use crate::consts::{VIEWPORT_ROTATE_SNAP_INTERVAL, VIEWPORT_SCROLL_RATE, VIEWPORT_ZOOM_LEVELS, VIEWPORT_ZOOM_MOUSE_RATE, VIEWPORT_ZOOM_SCALE_MAX, VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_WHEEL_RATE}; +use crate::consts::{ + VIEWPORT_ROTATE_SNAP_INTERVAL, VIEWPORT_SCROLL_RATE, VIEWPORT_ZOOM_LEVELS, VIEWPORT_ZOOM_MOUSE_RATE, VIEWPORT_ZOOM_SCALE_MAX, VIEWPORT_ZOOM_SCALE_MIN, VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR, + VIEWPORT_ZOOM_WHEEL_RATE, +}; use crate::messages::frontend::utility_types::MouseCursorIcon; use crate::messages::input_mapper::utility_types::input_keyboard::{Key, KeysGroup}; use crate::messages::input_mapper::utility_types::input_mouse::{ViewportBounds, ViewportPosition}; @@ -48,9 +51,9 @@ impl Default for NavigationMessageHandler { } } -impl MessageHandler for NavigationMessageHandler { +impl MessageHandler)> for NavigationMessageHandler { #[remain::check] - fn process_message(&mut self, message: NavigationMessage, responses: &mut VecDeque, (document, ipp): (&Document, &InputPreprocessorMessageHandler)) { + fn process_message(&mut self, message: NavigationMessage, responses: &mut VecDeque, (document, ipp, selection_bounds): (&Document, &InputPreprocessorMessageHandler, Option<[DVec2; 2]>)) { use NavigationMessage::*; #[remain::sorted] @@ -91,6 +94,18 @@ impl MessageHandler { + if let Some(bounds) = selection_bounds { + responses.push_back( + FitViewportToBounds { + bounds, + padding_scale_factor: Some(VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR), + prevent_zoom_past_100: false, + } + .into(), + ) + } + } IncreaseCanvasZoom { center_on_mouse } => { let new_scale = *VIEWPORT_ZOOM_LEVELS.iter().find(|scale| **scale > self.zoom).unwrap_or(&self.zoom); if center_on_mouse { @@ -272,6 +287,7 @@ impl MessageHandler