diff options
Diffstat (limited to 'native/src')
-rw-r--r-- | native/src/widget/pane_grid.rs | 37 | ||||
-rw-r--r-- | native/src/widget/pane_grid/content.rs | 21 | ||||
-rw-r--r-- | native/src/widget/pick_list.rs | 15 | ||||
-rw-r--r-- | native/src/window/event.rs | 8 |
4 files changed, 53 insertions, 28 deletions
diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index b72172cc..26a72409 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -452,24 +452,25 @@ where _ => {} } - if self.state.picked_pane().is_none() { - self.elements - .iter_mut() - .zip(layout.children()) - .map(|((_, pane), layout)| { - pane.on_event( - event.clone(), - layout, - cursor_position, - renderer, - clipboard, - messages, - ) - }) - .fold(event_status, event::Status::merge) - } else { - event::Status::Captured - } + let picked_pane = self.state.picked_pane().map(|(pane, _)| pane); + + self.elements + .iter_mut() + .zip(layout.children()) + .map(|((pane, content), layout)| { + let is_picked = picked_pane == Some(*pane); + + content.on_event( + event.clone(), + layout, + cursor_position, + renderer, + clipboard, + messages, + is_picked, + ) + }) + .fold(event_status, event::Status::merge) } fn draw( diff --git a/native/src/widget/pane_grid/content.rs b/native/src/widget/pane_grid/content.rs index b0110393..bac9fdd4 100644 --- a/native/src/widget/pane_grid/content.rs +++ b/native/src/widget/pane_grid/content.rs @@ -149,6 +149,7 @@ where renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec<Message>, + is_picked: bool, ) -> event::Status { let mut event_status = event::Status::Ignored; @@ -169,14 +170,18 @@ where layout }; - let body_status = self.body.on_event( - event, - body_layout, - cursor_position, - renderer, - clipboard, - messages, - ); + let body_status = if is_picked { + event::Status::Ignored + } else { + self.body.on_event( + event, + body_layout, + cursor_position, + renderer, + clipboard, + messages, + ) + }; event_status.merge(body_status) } diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index f4b60fc4..d7792000 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -1,5 +1,6 @@ //! Display a dropdown list of selectable values. use crate::event::{self, Event}; +use crate::keyboard; use crate::layout; use crate::mouse; use crate::overlay; @@ -20,6 +21,7 @@ where [T]: ToOwned<Owned = Vec<T>>, { menu: &'a mut menu::State, + keyboard_modifiers: &'a mut keyboard::Modifiers, is_open: &'a mut bool, hovered_option: &'a mut Option<usize>, last_selection: &'a mut Option<T>, @@ -38,6 +40,7 @@ where #[derive(Debug, Clone)] pub struct State<T> { menu: menu::State, + keyboard_modifiers: keyboard::Modifiers, is_open: bool, hovered_option: Option<usize>, last_selection: Option<T>, @@ -47,6 +50,7 @@ impl<T> Default for State<T> { fn default() -> Self { Self { menu: menu::State::default(), + keyboard_modifiers: keyboard::Modifiers::default(), is_open: bool::default(), hovered_option: Option::default(), last_selection: Option::default(), @@ -71,6 +75,7 @@ where ) -> Self { let State { menu, + keyboard_modifiers, is_open, hovered_option, last_selection, @@ -78,6 +83,7 @@ where Self { menu, + keyboard_modifiers, is_open, hovered_option, last_selection, @@ -270,7 +276,8 @@ where } Event::Mouse(mouse::Event::WheelScrolled { delta: mouse::ScrollDelta::Lines { y, .. }, - }) if layout.bounds().contains(cursor_position) + }) if self.keyboard_modifiers.command() + && layout.bounds().contains(cursor_position) && !*self.is_open => { fn find_next<'a, T: PartialEq>( @@ -302,9 +309,13 @@ where messages.push((self.on_selected)(next_option.clone())); } - return event::Status::Captured; + event::Status::Captured } + Event::Keyboard(keyboard::Event::ModifiersChanged(modifiers)) => { + *self.keyboard_modifiers = modifiers; + event::Status::Ignored + } _ => event::Status::Ignored, } } diff --git a/native/src/window/event.rs b/native/src/window/event.rs index 3aa1ab0b..64f2b8d8 100644 --- a/native/src/window/event.rs +++ b/native/src/window/event.rs @@ -3,6 +3,14 @@ use std::path::PathBuf; /// A window-related event. #[derive(PartialEq, Clone, Debug)] pub enum Event { + /// A window was moved. + Moved { + /// The new logical x location of the window + x: i32, + /// The new logical y location of the window + y: i32, + }, + /// A window was resized. Resized { /// The new width of the window (in units) |