Skip to content

Make the Select tool re-select initially selected layers upon pressing Shift during box selection #2171

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
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