From 3ea23eee8b5f1f311fa4cc9fed1a6bf433708995 Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Sun, 18 May 2025 21:38:11 +0300 Subject: [PATCH] echo popup messages --- fyrox-ui/src/color/mod.rs | 4 ++- fyrox-ui/src/dropdown_list.rs | 4 ++- fyrox-ui/src/popup.rs | 63 +++++++++++++++++++++++------------ 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/fyrox-ui/src/color/mod.rs b/fyrox-ui/src/color/mod.rs index 7e6dcb30b..ef729e71f 100644 --- a/fyrox-ui/src/color/mod.rs +++ b/fyrox-ui/src/color/mod.rs @@ -1303,7 +1303,9 @@ impl Control for ColorField { // handle_routed_message won't trigger because of it. fn preview_message(&self, ui: &UserInterface, message: &mut UiMessage) { if let Some(PopupMessage::Close) = message.data::() { - if message.destination() == self.popup { + if message.destination() == self.popup + && message.direction() == MessageDirection::ToWidget + { let picker = ui .node(self.picker) .cast::() diff --git a/fyrox-ui/src/dropdown_list.rs b/fyrox-ui/src/dropdown_list.rs index 6201708f1..a5acb50b4 100644 --- a/fyrox-ui/src/dropdown_list.rs +++ b/fyrox-ui/src/dropdown_list.rs @@ -359,7 +359,9 @@ impl Control for DropdownList { )); } } else if let Some(msg) = message.data::() { - if message.destination() == *self.popup { + if message.destination() == *self.popup + && message.direction() == MessageDirection::ToWidget + { match msg { PopupMessage::Open => { ui.send_message(DropdownListMessage::open( diff --git a/fyrox-ui/src/popup.rs b/fyrox-ui/src/popup.rs index d84d3bc0a..5c49d0126 100644 --- a/fyrox-ui/src/popup.rs +++ b/fyrox-ui/src/popup.rs @@ -400,7 +400,7 @@ impl Control for Popup { if message.destination() == self.handle() { match msg { PopupMessage::Open => { - if !*self.is_open { + if !*self.is_open && message.direction() == MessageDirection::ToWidget { self.is_open.set_value_and_mark_modified(true); ui.send_message(WidgetMessage::visibility( self.handle(), @@ -448,10 +448,11 @@ impl Control for Popup { MessageDirection::ToWidget, )); } + ui.send_message(message.reverse()); } } PopupMessage::Close => { - if *self.is_open { + if *self.is_open && message.direction() == MessageDirection::ToWidget { self.is_open.set_value_and_mark_modified(false); ui.send_message(WidgetMessage::visibility( self.handle(), @@ -470,41 +471,59 @@ impl Control for Popup { if ui.captured_node() == self.handle() { ui.release_mouse_capture(); } + + ui.send_message(message.reverse()); } } PopupMessage::Content(content) => { - if self.content.is_some() { - ui.send_message(WidgetMessage::remove( + if *self.content != *content + && message.direction() == MessageDirection::ToWidget + { + if self.content.is_some() { + ui.send_message(WidgetMessage::remove( + *self.content, + MessageDirection::ToWidget, + )); + } + self.content.set_value_and_mark_modified(*content); + + ui.send_message(WidgetMessage::link( *self.content, MessageDirection::ToWidget, + *self.body, )); - } - self.content.set_value_and_mark_modified(*content); - ui.send_message(WidgetMessage::link( - *self.content, - MessageDirection::ToWidget, - *self.body, - )); + ui.send_message(message.reverse()); + } } PopupMessage::Placement(placement) => { - self.placement.set_value_and_mark_modified(*placement); - self.invalidate_layout(); + if *self.placement != *placement + && message.direction() == MessageDirection::ToWidget + { + self.placement.set_value_and_mark_modified(*placement); + self.invalidate_layout(); + + ui.send_message(message.reverse()); + } } PopupMessage::AdjustPosition => { - let new_position = - adjust_placement_position(self.screen_bounds(), ui.screen_size()); + if message.direction() == MessageDirection::ToWidget { + let new_position = + adjust_placement_position(self.screen_bounds(), ui.screen_size()); - if new_position != self.screen_position() { - ui.send_message(WidgetMessage::desired_position( - self.handle, - MessageDirection::ToWidget, - ui.screen_to_root_canvas_space(new_position), - )); + if new_position != self.screen_position() { + ui.send_message(WidgetMessage::desired_position( + self.handle, + MessageDirection::ToWidget, + ui.screen_to_root_canvas_space(new_position), + )); + } } } PopupMessage::Owner(owner) => { - self.owner = *owner; + if message.direction() == MessageDirection::ToWidget { + self.owner = *owner; + } } PopupMessage::RelayedMessage(_) => (), }