Make Command implementations platform-specific

This allows us to introduce a platform-specific `Action` to both `iced_native`
and `iced_web` and remove the `Clipboard` from `Application::update` to maintain
purity.

Additionally, this should let us implement further actions to let users query
and modify the shell environment (e.g. window, clipboard, and more!)
This commit is contained in:
Héctor Ramón Jiménez 2021-09-01 19:21:49 +07:00
parent b7b7741578
commit 76698ff2b5
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
34 changed files with 363 additions and 342 deletions

View file

@ -50,8 +50,8 @@
//! [`wasm-pack`]: https://github.com/rustwasm/wasm-pack
//! [`wasm-bindgen`]: https://github.com/rustwasm/wasm-bindgen
//! [`tour` example]: https://github.com/hecrj/iced/tree/0.3/examples/tour
#![deny(missing_docs)]
#![deny(missing_debug_implementations)]
//#![deny(missing_docs)]
//#![deny(missing_debug_implementations)]
#![deny(unused_results)]
#![forbid(unsafe_code)]
#![forbid(rust_2018_idioms)]
@ -59,7 +59,7 @@ use dodrio::bumpalo;
use std::{cell::RefCell, rc::Rc};
mod bus;
mod clipboard;
mod command;
mod element;
mod hasher;
@ -68,7 +68,7 @@ pub mod subscription;
pub mod widget;
pub use bus::Bus;
pub use clipboard::Clipboard;
pub use command::Command;
pub use css::Css;
pub use dodrio;
pub use element::Element;
@ -77,7 +77,7 @@ pub use iced_core::{
keyboard, menu, mouse, Align, Background, Color, Font, HorizontalAlignment,
Length, Menu, Padding, Point, Rectangle, Size, Vector, VerticalAlignment,
};
pub use iced_futures::{executor, futures, Command};
pub use iced_futures::{executor, futures};
pub use subscription::Subscription;
#[doc(no_inline)]
@ -128,11 +128,7 @@ pub trait Application {
/// this method.
///
/// Any [`Command`] returned will be executed immediately in the background.
fn update(
&mut self,
message: Self::Message,
clipboard: &mut Clipboard,
) -> Command<Self::Message>;
fn update(&mut self, message: Self::Message) -> Command<Self::Message>;
/// Returns the widgets to display in the [`Application`].
///
@ -162,8 +158,6 @@ pub trait Application {
let document = window.document().unwrap();
let body = document.body().unwrap();
let mut clipboard = Clipboard::new();
let (sender, receiver) =
iced_futures::futures::channel::mpsc::unbounded();
@ -177,7 +171,7 @@ pub trait Application {
let mut title = app.title();
document.set_title(&title);
runtime.spawn(command);
run_command(command, &mut runtime);
let application = Rc::new(RefCell::new(app));
@ -190,8 +184,7 @@ pub trait Application {
let event_loop = receiver.for_each(move |message| {
let (command, subscription) = runtime.enter(|| {
let command =
application.borrow_mut().update(message, &mut clipboard);
let command = application.borrow_mut().update(message);
let subscription = application.borrow().subscription();
(command, subscription)
@ -199,7 +192,7 @@ pub trait Application {
let new_title = application.borrow().title();
runtime.spawn(command);
run_command(command, &mut runtime);
runtime.track(subscription);
if title != new_title {
@ -350,8 +343,7 @@ pub trait Embedded {
);
let (app, command) = runtime.enter(|| Self::new(flags));
runtime.spawn(command);
run_command(command, &mut runtime);
let application = Rc::new(RefCell::new(app));
@ -370,7 +362,7 @@ pub trait Embedded {
(command, subscription)
});
runtime.spawn(command);
run_command(command, &mut runtime);
runtime.track(subscription);
vdom.weak().schedule_render();
@ -382,6 +374,25 @@ pub trait Embedded {
}
}
fn run_command<Message: 'static + Send, E: Executor>(
command: Command<Message>,
runtime: &mut iced_futures::Runtime<
Hasher,
(),
E,
iced_futures::futures::channel::mpsc::UnboundedSender<Message>,
Message,
>,
) {
for action in command.actions() {
match action {
command::Action::Future(future) => {
runtime.spawn(future);
}
}
}
}
struct EmbeddedInstance<A: Embedded> {
application: Rc<RefCell<A>>,
bus: Bus<A::Message>,