feat(select): invert selection from the right-click menu

Add an Invert Selection entry to the selection context menu (below
Select Similar): it replaces the current selection with every other
selectable object in the active layout. Candidates come from the visible
wire set, so objects on off/frozen layers stay excluded.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-06-20 21:31:05 +03:00
commit fd15dd0aac
4 changed files with 38 additions and 0 deletions

View file

@ -1289,6 +1289,9 @@ pub enum Message {
/// Extend the current selection with every entity in the active
/// layout that matches a selected entity by (type, layer).
SelectSimilar,
/// Replace the current selection with every other selectable object in
/// the active layout (the complement of what's selected now).
InvertSelection,
/// Keyboard modifier state changed — tracks whether Shift is held so the
/// pick path can do subtractive (Shift+click) selection.
SetShiftDown(bool),

View file

@ -4971,6 +4971,16 @@ impl OpenCADStudio {
Task::none()
}
Message::InvertSelection => {
let i = self.active_tab;
self.tabs[i].scene.selection.borrow_mut().context_menu = None;
let count = self.tabs[i].scene.invert_selection();
self.command_line
.push_output(&format!("Invert Selection: {} object(s) selected.", count));
self.refresh_properties();
Task::none()
}
Message::QSelectOpen => {
let i = self.active_tab;
self.tabs[i].scene.selection.borrow_mut().context_menu = None;

View file

@ -2907,6 +2907,10 @@ fn viewport_context_menu_overlay(
));
items.push(sep());
items.push(item("Select Similar".to_string(), Message::SelectSimilar));
items.push(item(
"Invert Selection".to_string(),
Message::InvertSelection,
));
}
if isolation_active {
items.push(item(