Skip to content

Commit 7d46c7d

Browse files
mTvare6Keavon
authored andcommitted
add: add all of the stuff for path tool
1 parent 06e8e4e commit 7d46c7d

4 files changed

Lines changed: 181 additions & 124 deletions

File tree

editor/src/messages/tool/common_functionality/pivot.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::messages::tool::tool_messages::path_tool::PathOptionsUpdate;
99
use crate::messages::tool::tool_messages::select_tool::SelectOptionsUpdate;
1010
use crate::messages::tool::tool_messages::tool_prelude::*;
1111
use glam::{DAffine2, DVec2};
12-
use graphene_std::transform::ReferencePoint;
12+
use graphene_std::{transform::ReferencePoint, vector::ManipulatorPointId};
1313
use std::fmt;
1414

1515
pub fn pin_pivot_widget(disabled: bool, source: Source) -> WidgetHolder {
@@ -79,6 +79,7 @@ pub struct Dot {
7979
pub pivot: Pivot,
8080
pub state: DotState,
8181
pub layer: Option<LayerNodeIdentifier>,
82+
pub point: Option<ManipulatorPointId>,
8283
}
8384

8485
impl Dot {
@@ -223,6 +224,23 @@ impl Pivot {
223224
self.pivot = Some(self.transform_from_normalized.transform_point2(self.normalized_pivot));
224225
}
225226

227+
pub fn recalculate_pivot_for_layer(&mut self, document: &DocumentMessageHandler, layer: LayerNodeIdentifier, bounds: Option<[DVec2; 2]>) {
228+
if !self.active {
229+
return;
230+
}
231+
232+
let selected = document.network_interface.selected_nodes();
233+
if !selected.has_selected_nodes() {
234+
self.normalized_pivot = DVec2::splat(0.5);
235+
self.pivot = None;
236+
return;
237+
};
238+
239+
let [min, max] = bounds.unwrap_or([DVec2::ZERO, DVec2::ONE]);
240+
self.transform_from_normalized = DAffine2::from_translation(min) * DAffine2::from_scale(max - min);
241+
self.pivot = Some(self.transform_from_normalized.transform_point2(self.normalized_pivot));
242+
}
243+
226244
pub fn update(&mut self, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext, draw_data: Option<(f64,)>, draw: bool) {
227245
if !overlay_context.visibility_settings.pivot() {
228246
self.active = false;

editor/src/messages/tool/tool_messages/path_tool.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ struct PathToolData {
500500
dragging_state: DraggingState,
501501
angle: f64,
502502
dot: Dot,
503+
ordered_points: Vec<ManipulatorPointId>,
503504
opposite_handle_position: Option<DVec2>,
504505
last_clicked_point_was_selected: bool,
505506
last_clicked_segment_was_selected: bool,
@@ -1377,6 +1378,12 @@ impl PathToolData {
13771378
fn get_as_dot(&self) -> Dot {
13781379
self.dot.clone()
13791380
}
1381+
1382+
fn sync_history(&mut self, points: &Vec<ManipulatorPointId>) {
1383+
self.ordered_points.retain(|layer| points.contains(layer));
1384+
self.ordered_points.extend(points.iter().find(|&layer| !self.ordered_points.contains(layer)));
1385+
self.dot.point = self.ordered_points.last().map(|x| *x)
1386+
}
13801387
}
13811388

13821389
impl Fsm for PathToolFsmState {
@@ -1389,9 +1396,6 @@ impl Fsm for PathToolFsmState {
13891396
update_dynamic_hints(self, responses, shape_editor, document, tool_data, tool_options);
13901397

13911398
let ToolMessage::Path(event) = event else { return self };
1392-
if !matches!(event, PathToolMessage::Overlays(_) | PathToolMessage::UpdateSelectedPointsStatus { .. }) {
1393-
// debug!("{event:?}");
1394-
}
13951399
match (self, event) {
13961400
(_, PathToolMessage::SelectionChanged) => {
13971401
// Set the newly targeted layers to visible
@@ -1408,6 +1412,9 @@ impl Fsm for PathToolFsmState {
14081412
shape_editor.update_selected_anchors_status(display_anchors);
14091413
shape_editor.update_selected_handles_status(display_handles);
14101414

1415+
let new_points = shape_editor.selected_points().copied().collect::<Vec<_>>();
1416+
tool_data.sync_history(&new_points);
1417+
14111418
self
14121419
}
14131420
(_, PathToolMessage::Overlays(mut overlay_context)) => {

editor/src/messages/tool/tool_messages/select_tool.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ struct SelectToolData {
361361
lasso_polygon: Vec<ViewportPosition>,
362362
selection_mode: Option<SelectionMode>,
363363
layers_dragging: Vec<LayerNodeIdentifier>, // Unordered, often used as temporary buffer
364-
orderer_layers: Vec<LayerNodeIdentifier>, // Ordered list of layers
364+
ordered_layers: Vec<LayerNodeIdentifier>, // Ordered list of layers
365365
layer_selected_on_start: Option<LayerNodeIdentifier>,
366366
select_single_layer: Option<LayerNodeIdentifier>,
367367
axis_align: bool,
@@ -548,9 +548,9 @@ impl SelectToolData {
548548
}
549549

550550
fn sync_history(&mut self) {
551-
self.orderer_layers.retain(|layer| self.layers_dragging.contains(layer));
552-
self.orderer_layers.extend(self.layers_dragging.iter().find(|&layer| !self.orderer_layers.contains(layer)));
553-
self.dot.layer = self.orderer_layers.last().map(|x| *x)
551+
self.ordered_layers.retain(|layer| self.layers_dragging.contains(layer));
552+
self.ordered_layers.extend(self.layers_dragging.iter().find(|&layer| !self.ordered_layers.contains(layer)));
553+
self.dot.layer = self.ordered_layers.last().map(|x| *x)
554554
}
555555
}
556556

0 commit comments

Comments
 (0)