Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 54 additions & 8 deletions editor/src/messages/tool/tool_messages/select_tool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,10 @@ struct SelectToolData {
selected_layers_changed: bool,
snap_candidates: Vec<SnapCandidatePoint>,
auto_panning: AutoPanning,
previously_selected_layers: Vec<LayerNodeIdentifier>,
previous_selected: bool,
restore_selection_debounce: bool,
shift_pressed_before_drag: bool,
}

impl SelectToolData {
Expand Down Expand Up @@ -557,6 +561,7 @@ impl Fsm for SelectToolFsmState {
.collect();
let intersection_list = document.click_list(input).collect::<Vec<_>>();
let intersection = document.find_deepest(&intersection_list);
tool_data.previously_selected_layers = selected.clone();

// If the user is dragging the bounding box bounds, go into ResizingBounds mode.
// If the user is dragging the rotate trigger, go into RotatingBounds mode.
Expand Down Expand Up @@ -656,10 +661,14 @@ impl Fsm for SelectToolFsmState {
// Dragging a selection box
else {
tool_data.layers_dragging = selected;
tool_data.previous_selected = true;
tool_data.shift_pressed_before_drag = true;

if !input.keyboard.key(extend_selection) {
responses.add(DocumentMessage::DeselectAllLayers);
tool_data.layers_dragging.clear();
tool_data.previous_selected = false;
tool_data.shift_pressed_before_drag = false
}

if let Some(intersection) = intersection {
Expand All @@ -672,14 +681,14 @@ impl Fsm for SelectToolFsmState {
}
tool_data.get_snap_candidates(document, input);

responses.add(DocumentMessage::StartTransaction);
SelectToolFsmState::Dragging
} else {
// Make a box selection, preserving previously selected layers
let selection = tool_data.nested_selection_behavior;
SelectToolFsmState::DrawingBox { selection }
}
};
responses.add(DocumentMessage::StartTransaction);
SelectToolFsmState::Dragging
} else {
// Make a box selection, preserving previously selected layers
let selection = tool_data.nested_selection_behavior;
SelectToolFsmState::DrawingBox { selection }
}
};
tool_data.non_duplicated_layers = None;

state
Expand Down Expand Up @@ -826,6 +835,43 @@ impl Fsm for SelectToolFsmState {
}
(SelectToolFsmState::DrawingBox { .. }, SelectToolMessage::PointerMove(modifier_keys)) => {
tool_data.drag_current = input.mouse.position;

let selection_set: HashSet<_> = tool_data.previously_selected_layers.iter().collect();

if input.keyboard.key(Key::Shift) && !tool_data.restore_selection_debounce {
log::info!("when shift is pressed:{:?}", tool_data.previous_selected);
tool_data.layers_dragging.extend(&tool_data.previously_selected_layers);
tool_data.previous_selected = false;
tool_data.restore_selection_debounce = true;
}

if !input.keyboard.key(Key::Shift) && tool_data.restore_selection_debounce {
if tool_data.previous_selected {
tool_data.layers_dragging.extend(&tool_data.previously_selected_layers);
} else {
tool_data.layers_dragging.retain(|layer| !selection_set.contains(layer));
}
if tool_data.shift_pressed_before_drag {
tool_data.layers_dragging.extend(&tool_data.previously_selected_layers);
tool_data.shift_pressed_before_drag = false;
}
tool_data.restore_selection_debounce = false;
}

let selected_nodes: Vec<_> = tool_data
.layers_dragging
.iter()
.filter_map(|layer| {
if *layer != LayerNodeIdentifier::ROOT_PARENT {
Some(layer.to_node())
} else {
log::error!("ROOT_PARENT found in tool_data.layers_dragging during selection set");
None
}
})
.collect();

responses.add(NodeGraphMessage::SelectedNodesSet { nodes: selected_nodes });
responses.add(OverlaysMessage::Draw);

// AutoPanning
Expand Down
Loading