From 239ca698e5c04200fbb21f65a825e8824e510bc5 Mon Sep 17 00:00:00 2001 From: 0hypercube <0hypercube@gmail.com> Date: Mon, 21 Aug 2023 22:19:32 +0100 Subject: [PATCH] Fix navigate and rulers --- .../portfolio/document/document_message.rs | 2 + .../document/document_message_handler.rs | 48 ++++++++++++------- .../navigation/navigation_message_handler.rs | 12 ++--- editor/src/node_graph_executor.rs | 1 + 4 files changed, 39 insertions(+), 24 deletions(-) diff --git a/editor/src/messages/portfolio/document/document_message.rs b/editor/src/messages/portfolio/document/document_message.rs index c9caa7ec..fa67c9ad 100644 --- a/editor/src/messages/portfolio/document/document_message.rs +++ b/editor/src/messages/portfolio/document/document_message.rs @@ -129,6 +129,8 @@ pub enum DocumentMessage { new_name: String, }, RenderDocument, + RenderRulers, + RenderScrollbars, RollbackTransaction, SaveDocument, SelectAllLayers, diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index e319a712..b8a96576 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -28,6 +28,7 @@ use document_legacy::{DocumentError, DocumentResponse, LayerId, Operation as Doc use graph_craft::document::value::TaggedValue; use graph_craft::document::{NodeInput, NodeNetwork}; use graphene_core::raster::ImageFrame; +use graphene_core::renderer::Quad; use graphene_core::text::Font; use glam::{DAffine2, DVec2}; @@ -175,7 +176,7 @@ impl MessageHandler { - let document_bounds = self.document_bounds(&render_data); + let document_bounds = self.document_bounds(); self.navigation_handler.process_message( message, responses, @@ -674,12 +675,29 @@ impl MessageHandler { let document_transform_scale = self.navigation_handler.snapped_scale(); + + let ruler_origin = self.document_legacy.metadata.document_to_viewport.transform_point2(DVec2::ZERO); + let log = document_transform_scale.log2(); + let ruler_interval = if log < 0. { 100. * 2_f64.powf(-log.ceil()) } else { 100. / 2_f64.powf(log.ceil()) }; + let ruler_spacing = ruler_interval * document_transform_scale; + + responses.add(FrontendMessage::UpdateDocumentRulers { + origin: ruler_origin.into(), + spacing: ruler_spacing, + interval: ruler_interval, + }); + } + RenderScrollbars => { + let document_transform_scale = self.navigation_handler.snapped_scale(); + let scale = 0.5 + ASYMPTOTIC_EFFECT + document_transform_scale * SCALE_EFFECT; + let viewport_size = ipp.viewport_bounds.size(); let viewport_mid = ipp.viewport_bounds.center(); - let [bounds1, bounds2] = self.document_bounds(&render_data).unwrap_or([viewport_mid; 2]); + let [bounds1, bounds2] = self.document_bounds().unwrap_or([viewport_mid; 2]); let bounds1 = bounds1.min(viewport_mid) - viewport_size * scale; let bounds2 = bounds2.max(viewport_mid) + viewport_size * scale; let bounds_length = (bounds2 - bounds1) * (1. + SCROLLBAR_SPACING); @@ -687,23 +705,11 @@ impl MessageHandler { self.rollback(responses).unwrap_or_else(|e| warn!("{}", e)); @@ -935,6 +941,8 @@ impl MessageHandler { self.layer_metadata.insert(layer_path, layer_metadata); @@ -946,7 +954,7 @@ impl MessageHandler { - if let Some(bounds) = self.document_bounds(&render_data) { + if let Some(bounds) = self.document_bounds() { responses.add(NavigationMessage::FitViewportToBounds { bounds, padding_scale_factor: Some(VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR), @@ -1513,8 +1521,12 @@ impl DocumentMessageHandler { } /// Calculates the document bounds used for scrolling and centring (the layer bounds or the artboard (if applicable)) - pub fn document_bounds(&self, render_data: &RenderData) -> Option<[DVec2; 2]> { - self.all_layer_bounds(render_data) + pub fn document_bounds(&self) -> Option<[DVec2; 2]> { + self.document_legacy + .metadata + .all_layers() + .filter_map(|layer| self.document_legacy.metadata.bounding_box_viewport(layer)) + .reduce(Quad::combine_bounds) } /// Calculate the path that new layers should be inserted to. 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 6c48b76c..f13cb97e 100644 --- a/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs +++ b/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs @@ -72,10 +72,10 @@ impl MessageHandler, &InputPre padding_scale_factor, prevent_zoom_past_100, } => { - let pos1 = document.root.transform.inverse().transform_point2(bounds_corner_a); - let pos2 = document.root.transform.inverse().transform_point2(bounds_corner_b); - let v1 = document.root.transform.inverse().transform_point2(DVec2::ZERO); - let v2 = document.root.transform.inverse().transform_point2(ipp.viewport_bounds.size()); + let pos1 = document.metadata.document_to_viewport.inverse().transform_point2(bounds_corner_a); + let pos2 = document.metadata.document_to_viewport.inverse().transform_point2(bounds_corner_b); + let v1 = document.metadata.document_to_viewport.inverse().transform_point2(DVec2::ZERO); + let v2 = document.metadata.document_to_viewport.inverse().transform_point2(ipp.viewport_bounds.size()); let center = v1.lerp(v2, 0.5) - pos1.lerp(pos2, 0.5); let size = (pos2 - pos1) / (v2 - v1); @@ -260,7 +260,7 @@ impl MessageHandler, &InputPre responses.add(TransformCanvasEnd { abort_transform }); } TranslateCanvas { delta } => { - let transformed_delta = document.root.transform.inverse().transform_vector2(delta); + let transformed_delta = document.metadata.document_to_viewport.inverse().transform_vector2(delta); self.pan += transformed_delta; responses.add(BroadcastEvent::CanvasTransformed); @@ -281,7 +281,7 @@ impl MessageHandler, &InputPre self.transform_operation = TransformOperation::Pan { pre_commit_pan: self.pan }; } TranslateCanvasByViewportFraction { delta } => { - let transformed_delta = document.root.transform.inverse().transform_vector2(delta * ipp.viewport_bounds.size()); + let transformed_delta = document.metadata.document_to_viewport.inverse().transform_vector2(delta * ipp.viewport_bounds.size()); self.pan += transformed_delta; responses.add(BroadcastEvent::DocumentIsDirty); diff --git a/editor/src/node_graph_executor.rs b/editor/src/node_graph_executor.rs index 0b11c320..503e08dc 100644 --- a/editor/src/node_graph_executor.rs +++ b/editor/src/node_graph_executor.rs @@ -552,6 +552,7 @@ impl NodeGraphExecutor { // Send to frontend responses.add(FrontendMessage::UpdateDocumentNodeRender { svg }); + responses.add(DocumentMessage::RenderScrollbars); } _ => { return Err(format!("Invalid node graph output type: {:#?}", node_graph_output));