Fix primitive tool shapes appearing at document origin before dragging; fix Ctrl+0 recenter shifting (#1751)

* fix ghost shape when starting to draw

* fix indeterminate recenter

* fix typo infinate

* cargo fmt

* Code review and add to Line tool

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
Elbert Ronnie 2024-05-22 15:01:26 +05:30 committed by GitHub
parent af6dae29fc
commit 4587457bfa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 43 additions and 7 deletions

View File

@ -204,12 +204,17 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
let v1 = metadata.document_to_viewport.inverse().transform_point2(DVec2::ZERO); let v1 = metadata.document_to_viewport.inverse().transform_point2(DVec2::ZERO);
let v2 = metadata.document_to_viewport.inverse().transform_point2(ipp.viewport_bounds.size()); let v2 = 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 + v2) - (pos1 + pos2)) / 2.;
let size = (pos2 - pos1) / (v2 - v1); let size = 1. / ((pos2 - pos1) / (v2 - v1));
let size = 1. / size;
let new_scale = size.min_element(); let new_scale = size.min_element();
let viewport_change = metadata.document_to_viewport.transform_vector2(center);
// Only change the pan if the change will be visible in the viewport
if viewport_change.x.abs() > 0.5 || viewport_change.y.abs() > 0.5 {
ptz.pan += center; ptz.pan += center;
}
ptz.zoom *= new_scale * VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR; ptz.zoom *= new_scale * VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR;
// Keep the canvas filling less than the full available viewport bounds if requested. // Keep the canvas filling less than the full available viewport bounds if requested.

View File

@ -1,4 +1,5 @@
use super::tool_prelude::*; use super::tool_prelude::*;
use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn;
use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; use crate::messages::portfolio::document::overlays::utility_types::OverlayContext;
use crate::messages::tool::common_functionality::auto_panning::AutoPanning; use crate::messages::tool::common_functionality::auto_panning::AutoPanning;
use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType};
@ -206,6 +207,13 @@ impl Fsm for EllipseToolFsmState {
graph_modification_utils::set_manipulator_colinear_handles_state(&manipulator_groups, layer, true, responses); graph_modification_utils::set_manipulator_colinear_handles_state(&manipulator_groups, layer, true, responses);
shape_data.layer = Some(layer); shape_data.layer = Some(layer);
responses.add(GraphOperationMessage::TransformSet {
layer,
transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position),
transform_in: TransformIn::Viewport,
skip_rerender: false,
});
let fill_color = tool_options.fill.active_color(); let fill_color = tool_options.fill.active_color();
responses.add(GraphOperationMessage::FillSet { responses.add(GraphOperationMessage::FillSet {
layer, layer,

View File

@ -182,12 +182,20 @@ impl Fsm for LineToolFsmState {
responses.add(DocumentMessage::StartTransaction); responses.add(DocumentMessage::StartTransaction);
let layer = graph_modification_utils::new_vector_layer(vec![subpath], NodeId(generate_uuid()), document.new_layer_parent(true), responses); let layer = graph_modification_utils::new_vector_layer(vec![subpath], NodeId(generate_uuid()), document.new_layer_parent(true), responses);
responses.add(GraphOperationMessage::TransformSet {
layer,
transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position),
transform_in: TransformIn::Viewport,
skip_rerender: false,
});
responses.add(GraphOperationMessage::StrokeSet { responses.add(GraphOperationMessage::StrokeSet {
layer, layer,
stroke: Stroke::new(tool_options.stroke.active_color(), tool_options.line_weight), stroke: Stroke::new(tool_options.stroke.active_color(), tool_options.line_weight),
}); });
tool_data.layer = Some(layer);
tool_data.layer = Some(layer);
tool_data.weight = tool_options.line_weight; tool_data.weight = tool_options.line_weight;
LineToolFsmState::Drawing LineToolFsmState::Drawing

View File

@ -1,4 +1,5 @@
use super::tool_prelude::*; use super::tool_prelude::*;
use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn;
use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; use crate::messages::portfolio::document::overlays::utility_types::OverlayContext;
use crate::messages::tool::common_functionality::auto_panning::AutoPanning; use crate::messages::tool::common_functionality::auto_panning::AutoPanning;
use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType};
@ -250,6 +251,13 @@ impl Fsm for PolygonToolFsmState {
let layer = graph_modification_utils::new_vector_layer(vec![subpath], NodeId(generate_uuid()), document.new_layer_parent(true), responses); let layer = graph_modification_utils::new_vector_layer(vec![subpath], NodeId(generate_uuid()), document.new_layer_parent(true), responses);
polygon_data.layer = Some(layer); polygon_data.layer = Some(layer);
responses.add(GraphOperationMessage::TransformSet {
layer,
transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position),
transform_in: TransformIn::Viewport,
skip_rerender: false,
});
let fill_color = tool_options.fill.active_color(); let fill_color = tool_options.fill.active_color();
responses.add(GraphOperationMessage::FillSet { responses.add(GraphOperationMessage::FillSet {
layer, layer,

View File

@ -1,5 +1,5 @@
use super::tool_prelude::*; use super::tool_prelude::*;
use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; use crate::messages::portfolio::document::{graph_operation::utility_types::TransformIn, overlays::utility_types::OverlayContext};
use crate::messages::tool::common_functionality::auto_panning::AutoPanning; use crate::messages::tool::common_functionality::auto_panning::AutoPanning;
use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType};
use crate::messages::tool::common_functionality::graph_modification_utils; use crate::messages::tool::common_functionality::graph_modification_utils;
@ -212,6 +212,13 @@ impl Fsm for RectangleToolFsmState {
let layer = graph_modification_utils::new_vector_layer(vec![subpath], NodeId(generate_uuid()), document.new_layer_parent(true), responses); let layer = graph_modification_utils::new_vector_layer(vec![subpath], NodeId(generate_uuid()), document.new_layer_parent(true), responses);
shape_data.layer = Some(layer); shape_data.layer = Some(layer);
responses.add(GraphOperationMessage::TransformSet {
layer,
transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position),
transform_in: TransformIn::Viewport,
skip_rerender: false,
});
let fill_color = tool_options.fill.active_color(); let fill_color = tool_options.fill.active_color();
responses.add(GraphOperationMessage::FillSet { responses.add(GraphOperationMessage::FillSet {
layer, layer,

View File

@ -586,7 +586,7 @@ impl Bezier {
Bezier::from_cubic_dvec2(self.end, handle1, handle2, other.start) Bezier::from_cubic_dvec2(self.end, handle1, handle2, other.start)
} }
/// Compute the winding order (number of times crossing an infinate line to the left of the point) /// Compute the winding order (number of times crossing an infinite line to the left of the point)
/// ///
/// Assumes curve is split at the extrema. /// Assumes curve is split at the extrema.
fn pre_split_winding_number(&self, target_point: DVec2) -> i32 { fn pre_split_winding_number(&self, target_point: DVec2) -> i32 {