diff options
author | 2020-01-16 18:34:29 +0100 | |
---|---|---|
committer | 2020-01-16 18:34:29 +0100 | |
commit | 6ca5e6184f9f1c12b427bdafcce0b4e9fbc5bb14 (patch) | |
tree | 8ff337ba8503eb1af3f2211c5f969c2db87c96fd | |
parent | 11495b48eec8cdb6e4e3ae450983b26fe6b2eb15 (diff) | |
parent | b3106738eba09a7dec98f28738ab29996654491f (diff) | |
download | iced-6ca5e6184f9f1c12b427bdafcce0b4e9fbc5bb14.tar.gz iced-6ca5e6184f9f1c12b427bdafcce0b4e9fbc5bb14.tar.bz2 iced-6ca5e6184f9f1c12b427bdafcce0b4e9fbc5bb14.zip |
Merge pull request #162 from hecrj/feature/window-file-events
Window file events
-rw-r--r-- | native/src/event.rs | 2 | ||||
-rw-r--r-- | native/src/widget/column.rs | 2 | ||||
-rw-r--r-- | native/src/widget/row.rs | 2 | ||||
-rw-r--r-- | native/src/window/event.rs | 22 | ||||
-rw-r--r-- | winit/src/application.rs | 38 | ||||
-rw-r--r-- | winit/src/subscription.rs | 2 |
6 files changed, 50 insertions, 18 deletions
diff --git a/native/src/event.rs b/native/src/event.rs index 1d28aa7b..b2550ead 100644 --- a/native/src/event.rs +++ b/native/src/event.rs @@ -9,7 +9,7 @@ use crate::{ /// additional events, feel free to [open an issue] and share your use case!_ /// /// [open an issue]: https://github.com/hecrj/iced/issues -#[derive(PartialEq, Clone, Copy, Debug)] +#[derive(PartialEq, Clone, Debug)] pub enum Event { /// A keyboard event Keyboard(keyboard::Event), diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs index 79ec5ab4..104790d4 100644 --- a/native/src/widget/column.rs +++ b/native/src/widget/column.rs @@ -159,7 +159,7 @@ where self.children.iter_mut().zip(layout.children()).for_each( |(child, layout)| { child.widget.on_event( - event, + event.clone(), layout, cursor_position, messages, diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs index b3dc90ba..775b953e 100644 --- a/native/src/widget/row.rs +++ b/native/src/widget/row.rs @@ -160,7 +160,7 @@ where self.children.iter_mut().zip(layout.children()).for_each( |(child, layout)| { child.widget.on_event( - event, + event.clone(), layout, cursor_position, messages, diff --git a/native/src/window/event.rs b/native/src/window/event.rs index 89ec0a0c..b177141a 100644 --- a/native/src/window/event.rs +++ b/native/src/window/event.rs @@ -1,5 +1,7 @@ +use std::path::PathBuf; + /// A window-related event. -#[derive(PartialEq, Clone, Copy, Debug)] +#[derive(PartialEq, Clone, Debug)] pub enum Event { /// A window was resized Resized { @@ -9,4 +11,22 @@ pub enum Event { /// The new height of the window (in units) height: u32, }, + + /// A file is being hovered over the window. + /// + /// When the user hovers multiple files at once, this event will be emitted + /// for each file separately. + FileHovered(PathBuf), + + /// A file has beend dropped into the window. + /// + /// When the user drops multiple files at once, this event will be emitted + /// for each file separately. + FileDropped(PathBuf), + + /// A file was hovered, but has exited the window. + /// + /// There will be a single `FilesHoveredLeft` event triggered even if + /// multiple files were hovered. + FilesHoveredLeft, } diff --git a/winit/src/application.rs b/winit/src/application.rs index 9e8eaebb..a14924ac 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -209,9 +209,10 @@ pub trait Application: Sized { ); debug.event_processing_started(); - events.iter().for_each(|event| { - subscription_pool.broadcast_event(*event) - }); + events + .iter() + .cloned() + .for_each(|event| subscription_pool.broadcast_event(event)); let mut messages = user_interface.update( &renderer, @@ -330,6 +331,18 @@ pub trait Application: Sized { event: window_event, .. } => match window_event { + WindowEvent::Resized(new_size) => { + events.push(Event::Window(window::Event::Resized { + width: new_size.width.round() as u32, + height: new_size.height.round() as u32, + })); + + size = new_size; + resized = true; + } + WindowEvent::CloseRequested => { + *control_flow = ControlFlow::Exit; + } WindowEvent::CursorMoved { position, .. } => { events.push(Event::Mouse(mouse::Event::CursorMoved { x: position.x as f32, @@ -398,17 +411,16 @@ pub trait Application: Sized { modifiers: conversion::modifiers_state(modifiers), })); } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; + WindowEvent::HoveredFile(path) => { + events + .push(Event::Window(window::Event::FileHovered(path))); } - WindowEvent::Resized(new_size) => { - events.push(Event::Window(window::Event::Resized { - width: new_size.width.round() as u32, - height: new_size.height.round() as u32, - })); - - size = new_size; - resized = true; + WindowEvent::DroppedFile(path) => { + events + .push(Event::Window(window::Event::FileDropped(path))); + } + WindowEvent::HoveredFileCancelled => { + events.push(Event::Window(window::Event::FilesHoveredLeft)); } _ => {} }, diff --git a/winit/src/subscription.rs b/winit/src/subscription.rs index f55507af..bad68d55 100644 --- a/winit/src/subscription.rs +++ b/winit/src/subscription.rs @@ -86,7 +86,7 @@ impl Pool { .values_mut() .filter_map(|connection| connection.listener.as_mut()) .for_each(|listener| { - if let Err(error) = listener.try_send(event) { + if let Err(error) = listener.try_send(event.clone()) { log::error!( "Error sending event to subscription: {:?}", error |