@@ -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
6161impl 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
9393impl 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