Skip to content

Commit 14e921a

Browse files
committed
add: active pivot
1 parent 63d01fc commit 14e921a

3 files changed

Lines changed: 39 additions & 15 deletions

File tree

editor/src/consts.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ pub const COLOR_OVERLAY_BLUE: &str = "#00a8ff";
137137
pub const COLOR_OVERLAY_YELLOW: &str = "#ffc848";
138138
pub const COLOR_OVERLAY_GREEN: &str = "#63ce63";
139139
pub const COLOR_OVERLAY_RED: &str = "#ef5454";
140+
pub const COLOR_OVERLAY_ORANGE: &str = "#e27a44";
140141
pub const COLOR_OVERLAY_GRAY: &str = "#cccccc";
141142
pub const COLOR_OVERLAY_WHITE: &str = "#ffffff";
142143
pub const COLOR_OVERLAY_LABEL_BACKGROUND: &str = "#000000cc";

editor/src/messages/portfolio/document/overlays/utility_types.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -558,8 +558,9 @@ impl OverlayContext {
558558
self.end_dpi_aware_transform();
559559
}
560560

561-
pub fn dowel_pin(&mut self, position: DVec2) {
561+
pub fn dowel_pin(&mut self, position: DVec2, color: Option<&str>) {
562562
let (x, y) = (position.round() - DVec2::splat(0.5)).into();
563+
let color = color.unwrap_or(COLOR_OVERLAY_YELLOW);
563564

564565
self.start_dpi_aware_transform();
565566

@@ -568,7 +569,7 @@ impl OverlayContext {
568569
self.render_context.arc(x, y, DOWEL_PIN_RADIUS, 0., TAU).expect("Failed to draw the circle");
569570
self.render_context.set_fill_style_str(COLOR_OVERLAY_WHITE);
570571
self.render_context.fill();
571-
self.render_context.set_stroke_style_str(COLOR_OVERLAY_YELLOW);
572+
self.render_context.set_stroke_style_str(color);
572573
self.render_context.stroke();
573574

574575
// Draw the two blue filled sectors
@@ -581,7 +582,7 @@ impl OverlayContext {
581582
self.render_context.move_to(x, y);
582583
self.render_context.arc(x, y, DOWEL_PIN_RADIUS, PI + FRAC_PI_2, TAU).expect("Failed to draw arc");
583584
self.render_context.close_path();
584-
self.render_context.set_fill_style_str(COLOR_OVERLAY_YELLOW);
585+
self.render_context.set_fill_style_str(color);
585586
self.render_context.fill();
586587

587588
self.end_dpi_aware_transform();

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

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub enum NestedSelectionBehavior {
5656
}
5757

5858
#[derive(PartialEq, Clone, Debug, Default, serde::Serialize, serde::Deserialize)]
59-
pub struct Dot(Pivot, DotState);
59+
pub struct Dot(Pivot, DotState, Option<LayerNodeIdentifier>);
6060

6161
impl Dot {
6262
pub fn position(&self, document: &DocumentMessageHandler) -> DVec2 {
@@ -67,6 +67,7 @@ impl Dot {
6767
match self.1.dot {
6868
DotType::Average => Some(network.selected_nodes().selected_visible_and_unlocked_layers_mean_average_origin(network)),
6969
DotType::Pivot => self.0.position(),
70+
DotType::Active => self.2.map(|layer| graph_modification_utils::get_viewport_origin(layer, network)),
7071
}
7172
})
7273
.flatten()
@@ -84,10 +85,9 @@ pub enum DotType {
8485
#[default]
8586
Pivot,
8687
// Origin
87-
8888
// Indidual,
8989
Average,
90-
// Active,
90+
Active,
9191
}
9292

9393
impl DotType {
@@ -122,6 +122,7 @@ impl fmt::Display for DotType {
122122
match self {
123123
DotType::Pivot => write!(f, "Draft Pivot"),
124124
DotType::Average => write!(f, "Average of Origins"),
125+
DotType::Active => write!(f, "Active Object Origin"),
125126
}
126127
}
127128
}
@@ -207,7 +208,7 @@ impl SelectTool {
207208
.widget_holder()
208209
}
209210
fn dot_type_widget(&self) -> Vec<WidgetHolder> {
210-
let dot_type_entries = [DotType::Pivot, DotType::Average]
211+
let dot_type_entries = [DotType::Pivot, DotType::Average, DotType::Active]
211212
.iter()
212213
.map(|dot_type| {
213214
MenuListEntry::new(format!("{dot_type:?}"))
@@ -227,6 +228,7 @@ impl SelectTool {
227228
.selected_index(Some(match self.tool_data.dot_state.dot {
228229
DotType::Pivot => 0,
229230
DotType::Average => 1,
231+
DotType::Active => 2,
230232
}))
231233
.tooltip("Choose between type of Transform Pivot Point")
232234
.disabled(!self.tool_data.dot_state.enabled)
@@ -449,7 +451,9 @@ struct SelectToolData {
449451
drag_current: ViewportPosition,
450452
lasso_polygon: Vec<ViewportPosition>,
451453
selection_mode: Option<SelectionMode>,
452-
layers_dragging: Vec<LayerNodeIdentifier>,
454+
layers_dragging: Vec<LayerNodeIdentifier>, // Unordered, often used as temporary buffer
455+
orderer_layers: Vec<LayerNodeIdentifier>, // Ordered list of layers
456+
active_layer: Option<LayerNodeIdentifier>,
453457
layer_selected_on_start: Option<LayerNodeIdentifier>,
454458
select_single_layer: Option<LayerNodeIdentifier>,
455459
axis_align: bool,
@@ -633,7 +637,15 @@ impl SelectToolData {
633637
}
634638

635639
fn get_as_dot(&self) -> Dot {
636-
Dot(self.pivot.clone(), self.dot_state)
640+
Dot(self.pivot.clone(), self.dot_state, self.active_layer.clone())
641+
}
642+
643+
fn sync_history(&mut self) {
644+
debug!("{:?}", self.layers_dragging);
645+
self.orderer_layers.retain(|layer| self.layers_dragging.contains(layer));
646+
self.orderer_layers.extend(self.layers_dragging.iter().find(|&layer| !self.orderer_layers.contains(layer)));
647+
debug!("{:?}", self.orderer_layers);
648+
self.active_layer = self.orderer_layers.last().map(|x| *x)
637649
}
638650
}
639651

@@ -848,12 +860,20 @@ impl Fsm for SelectToolFsmState {
848860
.flatten()
849861
});
850862

863+
let mut active_origin = None;
851864
if overlay_context.visibility_settings.origin() && !tool_data.dot_state.is_pivot() {
852865
for layer in document.network_interface.selected_nodes().selected_visible_and_unlocked_layers(&document.network_interface) {
853866
let origin = graph_modification_utils::get_viewport_origin(layer, &document.network_interface);
854-
overlay_context.dowel_pin(origin);
867+
if Some(layer) == tool_data.active_layer {
868+
active_origin = Some(origin);
869+
continue;
870+
}
871+
overlay_context.dowel_pin(origin, None);
855872
}
856873
}
874+
if let Some(origin) = active_origin {
875+
overlay_context.dowel_pin(origin, Some(COLOR_OVERLAY_ORANGE));
876+
}
857877

858878
let draw_pivot = tool_data.dot_state.dot.is_pivot() && overlay_context.visibility_settings.pivot();
859879
tool_data.pivot.update(document, &mut overlay_context, Some((angle,)), draw_pivot);
@@ -1436,11 +1456,7 @@ impl Fsm for SelectToolFsmState {
14361456
SelectToolFsmState::Ready { selection }
14371457
}
14381458
(
1439-
SelectToolFsmState::ResizingBounds
1440-
| SelectToolFsmState::SkewingBounds { .. }
1441-
| SelectToolFsmState::RotatingBounds
1442-
| SelectToolFsmState::Dragging { .. }
1443-
| SelectToolFsmState::DraggingPivot,
1459+
SelectToolFsmState::ResizingBounds | SelectToolFsmState::SkewingBounds { .. } | SelectToolFsmState::RotatingBounds | SelectToolFsmState::DraggingPivot,
14441460
SelectToolMessage::DragStop { .. } | SelectToolMessage::Enter,
14451461
) => {
14461462
let drag_too_small = input.mouse.position.distance(tool_data.drag_start) < 10. * f64::EPSILON;
@@ -1498,6 +1514,7 @@ impl Fsm for SelectToolFsmState {
14981514
NestedSelectionBehavior::Deepest => {
14991515
let filtered_selections = filter_nested_selection(document.metadata(), &new_selected);
15001516
tool_data.layers_dragging.extend(filtered_selections);
1517+
tool_data.sync_history();
15011518
}
15021519
NestedSelectionBehavior::Shallowest => {
15031520
// Find each new_selected's parent node
@@ -1506,6 +1523,7 @@ impl Fsm for SelectToolFsmState {
15061523
.map(|layer| layer.ancestors(document.metadata()).filter(not_artboard(document)).last().unwrap_or(layer))
15071524
.collect();
15081525
tool_data.layers_dragging.extend(parent_selected.iter().copied());
1526+
tool_data.sync_history();
15091527
}
15101528
}
15111529
}
@@ -1760,6 +1778,7 @@ fn drag_shallowest_manipulation(responses: &mut VecDeque<Message>, selected: Vec
17601778
}
17611779
}
17621780

1781+
tool_data.sync_history();
17631782
responses.add(NodeGraphMessage::SelectedNodesSet {
17641783
nodes: tool_data
17651784
.layers_dragging
@@ -1811,10 +1830,13 @@ fn drag_deepest_manipulation(responses: &mut VecDeque<Message>, selected: Vec<La
18111830
.next()
18121831
.expect("ROOT_PARENT should have a layer child when clicking"),
18131832
);
1833+
18141834
if !remove {
18151835
tool_data.layers_dragging.extend(vec![layer]);
1836+
tool_data.sync_history();
18161837
} else {
18171838
tool_data.layers_dragging.retain(|&selected_layer| layer != selected_layer);
1839+
tool_data.sync_history();
18181840
}
18191841
responses.add(NodeGraphMessage::SelectedNodesSet {
18201842
nodes: tool_data

0 commit comments

Comments
 (0)