Box the optional exact State menu target to bound message size

This commit is contained in:
2026-09-23 03:37:02 -07:00
parent 2a3b9ba822
commit 3480b54201
3 changed files with 10 additions and 9 deletions
+1 -1
View File
@@ -165,7 +165,7 @@ impl App {
let mut request = crate::model_menu::Request::object(object, anchor);
request.canvas = Some(context);
request.placement = placement;
request.selection_target = selection_target;
request.selection_target = selection_target.map(Box::new);
request.bend = bend;
request.route_segment = route_segment;
return self.handle(Message::Menu(crate::model_menu::Event::Open(request)));
@@ -1016,7 +1016,7 @@ async fn state_actions_trigger_captures_exact_row_without_owner_placement_and_st
};
assert_eq!(request.object, relation);
assert_eq!(request.placement, None);
assert_eq!(request.selection_target, Some(row.clone()));
assert_eq!(request.selection_target.as_deref(), Some(&row));
assert_eq!(request.canvas, f.app.state_context());
let mut wrong = request.clone();
wrong.placement = Some(f.a);
@@ -1028,7 +1028,7 @@ async fn state_actions_trigger_captures_exact_row_without_owner_placement_and_st
.app
.update(Message::Menu(MenuEvent::Open(request.clone())));
let opened = f.app.model_menu.as_ref().unwrap();
assert_eq!(opened.request.selection_target, Some(row.clone()));
assert_eq!(opened.request.selection_target.as_deref(), Some(&row));
assert_eq!(opened.request.placement, None);
assert_eq!(
f.app.multiselect_snapshot().unwrap().targets(),
@@ -1080,10 +1080,10 @@ async fn state_actions_trigger_captures_exact_row_without_owner_placement_and_st
model_menu::Opened::new(&f.app, stale_row.clone(), 2).is_none(),
"a fresh envelope cannot rebind the old row occurrence"
);
stale_row.selection_target = Some(Target::StateRow {
stale_row.selection_target = Some(Box::new(Target::StateRow {
placement: f.b,
relation,
});
}));
assert!(
model_menu::Opened::new(&f.app, stale_row, 2).is_some(),
"the replacement occurrence is independently visible"
+5 -4
View File
@@ -12,7 +12,7 @@ pub struct Request {
pub anchor: Point,
pub object: Id,
pub placement: Option<Id>,
pub selection_target: Option<crate::diagram_usage::Target>,
pub selection_target: Option<Box<crate::diagram_usage::Target>>,
pub bend: Option<usize>,
pub route_point: Option<Position>,
pub route_segment: Option<(usize, Position)>,
@@ -98,7 +98,7 @@ impl Opened {
fn target_matches(app: &App, request: &Request) -> bool {
use crate::diagram_usage::Target;
let Some(target) = &request.selection_target else {
let Some(target) = request.selection_target.as_deref() else {
return true;
};
if request.canvas.is_none() || !app.multiselect_target_visible(target) {
@@ -157,7 +157,7 @@ pub fn trigger(app: &App) -> iced::Element<'_, Message> {
} else if app.page == Page::Behavior {
request.canvas = app.state_context();
if let Some(target) = app.diagram_selection.as_ref().and_then(|s| s.primary()) {
request.selection_target = Some(target.clone());
request.selection_target = Some(Box::new(target.clone()));
request.placement = match target {
crate::diagram_usage::Target::Placement(id) => {
if let Some(node) = request
@@ -244,7 +244,8 @@ pub fn popup(app: &App) -> Option<Menu<Message>> {
.map(|d| projection::project_view_with_index(p, d, app.document.view_index()));
let target = request
.selection_target
.clone()
.as_deref()
.cloned()
.or_else(|| request.placement.map(Target::Placement))
.or_else(|| {
view.as_ref()?