feat: add exact saved-view multiselection and atomic group movement
This commit is contained in:
@@ -193,6 +193,100 @@ pub fn popup(app: &App) -> Option<Menu<Message>> {
|
||||
return Some(menu);
|
||||
}
|
||||
let mut entries = vec![Entry::title(crate::views::short(p.named(id), 38))];
|
||||
if app.page == Page::Diagram
|
||||
&& request.canvas.is_some()
|
||||
&& let Some(context) = app.multiselect_context()
|
||||
{
|
||||
use crate::app::multiselect::{Choice, Event as SelectionEvent};
|
||||
use crate::diagram_usage::Target;
|
||||
let view = app
|
||||
.active_diagram
|
||||
.map(|d| projection::project_view_with_index(p, d, app.document.view_index()));
|
||||
let target = request
|
||||
.placement
|
||||
.map(Target::Placement)
|
||||
.or_else(|| {
|
||||
view.as_ref()?
|
||||
.ports
|
||||
.iter()
|
||||
.find(|port| port.element == id)
|
||||
.map(|port| Target::Port {
|
||||
port: port.element,
|
||||
placement: port.owner,
|
||||
})
|
||||
})
|
||||
.or_else(|| {
|
||||
view.as_ref()?
|
||||
.edges
|
||||
.iter()
|
||||
.any(|edge| edge.id == id)
|
||||
.then_some(Target::Edge(id))
|
||||
});
|
||||
if let Some(target) = target {
|
||||
let selected = app
|
||||
.diagram_selection
|
||||
.as_ref()
|
||||
.is_some_and(|s| s.contains(&target));
|
||||
entries.push(item(
|
||||
if selected {
|
||||
"Remove from selection"
|
||||
} else {
|
||||
"Add to selection"
|
||||
},
|
||||
Message::DiagramSelection(SelectionEvent::Choose(
|
||||
context,
|
||||
target.clone(),
|
||||
if selected {
|
||||
Choice::Remove
|
||||
} else {
|
||||
Choice::Add
|
||||
},
|
||||
)),
|
||||
true,
|
||||
));
|
||||
if let Some(snapshot) = app.multiselect_snapshot().filter(|s| s.targets().len() > 1)
|
||||
&& selected
|
||||
{
|
||||
entries.push(Entry::title(format!(
|
||||
"{} selected",
|
||||
snapshot.targets().len()
|
||||
)));
|
||||
entries.push(item(
|
||||
"Inspect this element",
|
||||
Message::DiagramSelection(SelectionEvent::Choose(
|
||||
context,
|
||||
target.clone(),
|
||||
Choice::Inspect,
|
||||
)),
|
||||
true,
|
||||
));
|
||||
entries.push(item(
|
||||
"Select only this element",
|
||||
Message::DiagramSelection(SelectionEvent::Choose(
|
||||
context,
|
||||
target,
|
||||
Choice::Replace,
|
||||
)),
|
||||
true,
|
||||
));
|
||||
entries.push(item(
|
||||
"Hide selected placements",
|
||||
Message::DiagramSelection(SelectionEvent::Hide(snapshot.clone())),
|
||||
crate::app::multiselect::placements(&snapshot).is_some(),
|
||||
));
|
||||
entries.push(Entry::disabled(
|
||||
"Delete selected from model (not yet available)",
|
||||
));
|
||||
return Some(Menu {
|
||||
token: opened.token,
|
||||
anchor: request.anchor,
|
||||
entries,
|
||||
on_close: Message::Menu(Event::Close),
|
||||
});
|
||||
}
|
||||
entries.push(Entry::separator());
|
||||
}
|
||||
}
|
||||
if !clean {
|
||||
entries.push(Entry::title("Apply or revert pending edits first"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user