Preserve qualified menu navigation and correct literal source trivia oracle

This commit is contained in:
2026-09-24 20:17:07 -07:00
parent fe637dcd27
commit f20497b29b
4 changed files with 71 additions and 29 deletions
+33 -28
View File
@@ -436,6 +436,32 @@ pub fn popup(app: &App) -> Option<Menu<Message>> {
)),
true,
));
// Navigation belongs to the exact clicked preview, even when it
// is outside the current group. Keep it alongside aggregate removal
// without selecting that preview or exposing singleton mutations.
let qualified_definition = request.process.as_deref().copied().and_then(|context| {
let endpoint = match request.selection_target.as_deref() {
Some(Target::ProcessOccurrence(endpoint))
if !endpoint.references.is_empty() =>
{
Some(endpoint.clone())
}
Some(Target::ProcessPreviewLink { source, .. }) => Some(source.clone()),
_ => None,
}?;
Some((context, endpoint))
});
if let Some((context, endpoint)) = &qualified_definition {
entries.push(Entry::title("Reused contents · read-only in this process"));
entries.push(item(
"Open referenced definition",
Message::TopologyCanvas(crate::behavior::topology::CanvasEvent::OpenQualified(
*context,
endpoint.clone(),
)),
true,
));
}
if let Some(snapshot) = app.multiselect_snapshot().filter(|s| s.targets().len() > 1)
&& (selected || request.process.is_some())
{
@@ -494,34 +520,13 @@ pub fn popup(app: &App) -> Option<Menu<Message>> {
});
}
entries.push(Entry::separator());
if let Some(context) = request.process.as_deref().copied() {
let endpoint = match request.selection_target.as_deref() {
Some(Target::ProcessOccurrence(endpoint))
if !endpoint.references.is_empty() =>
{
Some(endpoint.clone())
}
Some(Target::ProcessPreviewLink { source, .. }) => Some(source.clone()),
_ => None,
};
if let Some(endpoint) = endpoint {
entries.push(Entry::title("Reused contents · read-only in this process"));
entries.push(item(
"Open referenced definition",
Message::TopologyCanvas(
crate::behavior::topology::CanvasEvent::OpenQualified(
context, endpoint,
),
),
true,
));
return Some(Menu {
token: opened.token,
anchor: request.anchor,
entries,
on_close: Message::Menu(Event::Close),
});
}
if qualified_definition.is_some() {
return Some(Menu {
token: opened.token,
anchor: request.anchor,
entries,
on_close: Message::Menu(Event::Close),
});
}
}
}