summaryrefslogtreecommitdiffstats
path: root/native/src
diff options
context:
space:
mode:
Diffstat (limited to 'native/src')
-rw-r--r--native/src/widget/pane_grid.rs37
-rw-r--r--native/src/widget/pane_grid/content.rs21
-rw-r--r--native/src/widget/pick_list.rs15
-rw-r--r--native/src/window/event.rs8
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)