Box the optional exact State menu target to bound message size
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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()?
|
||||
|
||||
Reference in New Issue
Block a user