Merge pull request #162 from hecrj/feature/window-file-events

Window file events
This commit is contained in:
Héctor Ramón 2020-01-16 18:34:29 +01:00 committed by GitHub
commit 6ca5e6184f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 50 additions and 18 deletions

View File

@ -9,7 +9,7 @@ use crate::{
/// additional events, feel free to [open an issue] and share your use case!_ /// additional events, feel free to [open an issue] and share your use case!_
/// ///
/// [open an issue]: https://github.com/hecrj/iced/issues /// [open an issue]: https://github.com/hecrj/iced/issues
#[derive(PartialEq, Clone, Copy, Debug)] #[derive(PartialEq, Clone, Debug)]
pub enum Event { pub enum Event {
/// A keyboard event /// A keyboard event
Keyboard(keyboard::Event), Keyboard(keyboard::Event),

View File

@ -159,7 +159,7 @@ where
self.children.iter_mut().zip(layout.children()).for_each( self.children.iter_mut().zip(layout.children()).for_each(
|(child, layout)| { |(child, layout)| {
child.widget.on_event( child.widget.on_event(
event, event.clone(),
layout, layout,
cursor_position, cursor_position,
messages, messages,

View File

@ -160,7 +160,7 @@ where
self.children.iter_mut().zip(layout.children()).for_each( self.children.iter_mut().zip(layout.children()).for_each(
|(child, layout)| { |(child, layout)| {
child.widget.on_event( child.widget.on_event(
event, event.clone(),
layout, layout,
cursor_position, cursor_position,
messages, messages,

View File

@ -1,5 +1,7 @@
use std::path::PathBuf;
/// A window-related event. /// A window-related event.
#[derive(PartialEq, Clone, Copy, Debug)] #[derive(PartialEq, Clone, Debug)]
pub enum Event { pub enum Event {
/// A window was resized /// A window was resized
Resized { Resized {
@ -9,4 +11,22 @@ pub enum Event {
/// The new height of the window (in units) /// The new height of the window (in units)
height: u32, 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,
} }

View File

@ -209,9 +209,10 @@ pub trait Application: Sized {
); );
debug.event_processing_started(); debug.event_processing_started();
events.iter().for_each(|event| { events
subscription_pool.broadcast_event(*event) .iter()
}); .cloned()
.for_each(|event| subscription_pool.broadcast_event(event));
let mut messages = user_interface.update( let mut messages = user_interface.update(
&renderer, &renderer,
@ -330,6 +331,18 @@ pub trait Application: Sized {
event: window_event, event: window_event,
.. ..
} => match 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, .. } => { WindowEvent::CursorMoved { position, .. } => {
events.push(Event::Mouse(mouse::Event::CursorMoved { events.push(Event::Mouse(mouse::Event::CursorMoved {
x: position.x as f32, x: position.x as f32,
@ -398,17 +411,16 @@ pub trait Application: Sized {
modifiers: conversion::modifiers_state(modifiers), modifiers: conversion::modifiers_state(modifiers),
})); }));
} }
WindowEvent::CloseRequested => { WindowEvent::HoveredFile(path) => {
*control_flow = ControlFlow::Exit; events
.push(Event::Window(window::Event::FileHovered(path)));
} }
WindowEvent::Resized(new_size) => { WindowEvent::DroppedFile(path) => {
events.push(Event::Window(window::Event::Resized { events
width: new_size.width.round() as u32, .push(Event::Window(window::Event::FileDropped(path)));
height: new_size.height.round() as u32, }
})); WindowEvent::HoveredFileCancelled => {
events.push(Event::Window(window::Event::FilesHoveredLeft));
size = new_size;
resized = true;
} }
_ => {} _ => {}
}, },

View File

@ -86,7 +86,7 @@ impl Pool {
.values_mut() .values_mut()
.filter_map(|connection| connection.listener.as_mut()) .filter_map(|connection| connection.listener.as_mut())
.for_each(|listener| { .for_each(|listener| {
if let Err(error) = listener.try_send(event) { if let Err(error) = listener.try_send(event.clone()) {
log::error!( log::error!(
"Error sending event to subscription: {:?}", "Error sending event to subscription: {:?}",
error error