Fix navigate and rulers

This commit is contained in:
0hypercube 2023-08-21 22:19:32 +01:00 committed by Keavon Chambers
parent b52f831b21
commit 239ca698e5
4 changed files with 39 additions and 24 deletions

View File

@ -129,6 +129,8 @@ pub enum DocumentMessage {
new_name: String, new_name: String,
}, },
RenderDocument, RenderDocument,
RenderRulers,
RenderScrollbars,
RollbackTransaction, RollbackTransaction,
SaveDocument, SaveDocument,
SelectAllLayers, SelectAllLayers,

View File

@ -28,6 +28,7 @@ use document_legacy::{DocumentError, DocumentResponse, LayerId, Operation as Doc
use graph_craft::document::value::TaggedValue; use graph_craft::document::value::TaggedValue;
use graph_craft::document::{NodeInput, NodeNetwork}; use graph_craft::document::{NodeInput, NodeNetwork};
use graphene_core::raster::ImageFrame; use graphene_core::raster::ImageFrame;
use graphene_core::renderer::Quad;
use graphene_core::text::Font; use graphene_core::text::Font;
use glam::{DAffine2, DVec2}; use glam::{DAffine2, DVec2};
@ -175,7 +176,7 @@ impl MessageHandler<DocumentMessage, (u64, &InputPreprocessorMessageHandler, &Pe
} }
#[remain::unsorted] #[remain::unsorted]
Navigation(message) => { Navigation(message) => {
let document_bounds = self.document_bounds(&render_data); let document_bounds = self.document_bounds();
self.navigation_handler.process_message( self.navigation_handler.process_message(
message, message,
responses, responses,
@ -674,12 +675,29 @@ impl MessageHandler<DocumentMessage, (u64, &InputPreprocessorMessageHandler, &Pe
responses.add(FrontendMessage::UpdateDocumentArtwork { responses.add(FrontendMessage::UpdateDocumentArtwork {
svg: self.document_legacy.render_root(&render_data), svg: self.document_legacy.render_root(&render_data),
}); });
}
RenderRulers => {
let document_transform_scale = self.navigation_handler.snapped_scale(); 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 scale = 0.5 + ASYMPTOTIC_EFFECT + document_transform_scale * SCALE_EFFECT;
let viewport_size = ipp.viewport_bounds.size(); let viewport_size = ipp.viewport_bounds.size();
let viewport_mid = ipp.viewport_bounds.center(); 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 bounds1 = bounds1.min(viewport_mid) - viewport_size * scale;
let bounds2 = bounds2.max(viewport_mid) + viewport_size * scale; let bounds2 = bounds2.max(viewport_mid) + viewport_size * scale;
let bounds_length = (bounds2 - bounds1) * (1. + SCROLLBAR_SPACING); let bounds_length = (bounds2 - bounds1) * (1. + SCROLLBAR_SPACING);
@ -687,23 +705,11 @@ impl MessageHandler<DocumentMessage, (u64, &InputPreprocessorMessageHandler, &Pe
let scrollbar_multiplier = bounds_length - viewport_size; let scrollbar_multiplier = bounds_length - viewport_size;
let scrollbar_size = viewport_size / bounds_length; let scrollbar_size = viewport_size / bounds_length;
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;
let ruler_origin = self.document_legacy.metadata.document_to_viewport.transform_point2(DVec2::ZERO);
responses.add(FrontendMessage::UpdateDocumentScrollbars { responses.add(FrontendMessage::UpdateDocumentScrollbars {
position: scrollbar_position.into(), position: scrollbar_position.into(),
size: scrollbar_size.into(), size: scrollbar_size.into(),
multiplier: scrollbar_multiplier.into(), multiplier: scrollbar_multiplier.into(),
}); });
responses.add(FrontendMessage::UpdateDocumentRulers {
origin: ruler_origin.into(),
spacing: ruler_spacing,
interval: ruler_interval,
});
} }
RollbackTransaction => { RollbackTransaction => {
self.rollback(responses).unwrap_or_else(|e| warn!("{}", e)); self.rollback(responses).unwrap_or_else(|e| warn!("{}", e));
@ -935,6 +941,8 @@ impl MessageHandler<DocumentMessage, (u64, &InputPreprocessorMessageHandler, &Pe
self.document_legacy.metadata.document_to_viewport = transform; self.document_legacy.metadata.document_to_viewport = transform;
let transform = graphene_core::renderer::format_transform_matrix(transform); let transform = graphene_core::renderer::format_transform_matrix(transform);
responses.add(FrontendMessage::UpdateDocumentTransform { transform }); responses.add(FrontendMessage::UpdateDocumentTransform { transform });
responses.add(DocumentMessage::RenderRulers);
responses.add(DocumentMessage::RenderScrollbars);
} }
UpdateLayerMetadata { layer_path, layer_metadata } => { UpdateLayerMetadata { layer_path, layer_metadata } => {
self.layer_metadata.insert(layer_path, layer_metadata); self.layer_metadata.insert(layer_path, layer_metadata);
@ -946,7 +954,7 @@ impl MessageHandler<DocumentMessage, (u64, &InputPreprocessorMessageHandler, &Pe
responses.add_front(NavigationMessage::SetCanvasZoom { zoom_factor: 2. }); responses.add_front(NavigationMessage::SetCanvasZoom { zoom_factor: 2. });
} }
ZoomCanvasToFitAll => { ZoomCanvasToFitAll => {
if let Some(bounds) = self.document_bounds(&render_data) { if let Some(bounds) = self.document_bounds() {
responses.add(NavigationMessage::FitViewportToBounds { responses.add(NavigationMessage::FitViewportToBounds {
bounds, bounds,
padding_scale_factor: Some(VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR), 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)) /// 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]> { pub fn document_bounds(&self) -> Option<[DVec2; 2]> {
self.all_layer_bounds(render_data) 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. /// Calculate the path that new layers should be inserted to.

View File

@ -72,10 +72,10 @@ impl MessageHandler<NavigationMessage, (&Document, Option<[DVec2; 2]>, &InputPre
padding_scale_factor, padding_scale_factor,
prevent_zoom_past_100, prevent_zoom_past_100,
} => { } => {
let pos1 = document.root.transform.inverse().transform_point2(bounds_corner_a); let pos1 = document.metadata.document_to_viewport.inverse().transform_point2(bounds_corner_a);
let pos2 = document.root.transform.inverse().transform_point2(bounds_corner_b); let pos2 = document.metadata.document_to_viewport.inverse().transform_point2(bounds_corner_b);
let v1 = document.root.transform.inverse().transform_point2(DVec2::ZERO); let v1 = document.metadata.document_to_viewport.inverse().transform_point2(DVec2::ZERO);
let v2 = document.root.transform.inverse().transform_point2(ipp.viewport_bounds.size()); 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 center = v1.lerp(v2, 0.5) - pos1.lerp(pos2, 0.5);
let size = (pos2 - pos1) / (v2 - v1); let size = (pos2 - pos1) / (v2 - v1);
@ -260,7 +260,7 @@ impl MessageHandler<NavigationMessage, (&Document, Option<[DVec2; 2]>, &InputPre
responses.add(TransformCanvasEnd { abort_transform }); responses.add(TransformCanvasEnd { abort_transform });
} }
TranslateCanvas { delta } => { 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; self.pan += transformed_delta;
responses.add(BroadcastEvent::CanvasTransformed); responses.add(BroadcastEvent::CanvasTransformed);
@ -281,7 +281,7 @@ impl MessageHandler<NavigationMessage, (&Document, Option<[DVec2; 2]>, &InputPre
self.transform_operation = TransformOperation::Pan { pre_commit_pan: self.pan }; self.transform_operation = TransformOperation::Pan { pre_commit_pan: self.pan };
} }
TranslateCanvasByViewportFraction { delta } => { 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; self.pan += transformed_delta;
responses.add(BroadcastEvent::DocumentIsDirty); responses.add(BroadcastEvent::DocumentIsDirty);

View File

@ -552,6 +552,7 @@ impl NodeGraphExecutor {
// Send to frontend // Send to frontend
responses.add(FrontendMessage::UpdateDocumentNodeRender { svg }); responses.add(FrontendMessage::UpdateDocumentNodeRender { svg });
responses.add(DocumentMessage::RenderScrollbars);
} }
_ => { _ => {
return Err(format!("Invalid node graph output type: {:#?}", node_graph_output)); return Err(format!("Invalid node graph output type: {:#?}", node_graph_output));