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:
parent
af6dae29fc
commit
4587457bfa
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue