summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/Cargo.toml3
-rw-r--r--runtime/src/overlay/nested.rs6
-rw-r--r--runtime/src/task.rs20
-rw-r--r--runtime/src/user_interface.rs46
4 files changed, 43 insertions, 32 deletions
diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml
index 703c3ed9..fc212ef8 100644
--- a/runtime/Cargo.toml
+++ b/runtime/Cargo.toml
@@ -23,5 +23,6 @@ iced_core.workspace = true
iced_futures.workspace = true
iced_futures.features = ["thread-pool"]
-thiserror.workspace = true
raw-window-handle.workspace = true
+sipper.workspace = true
+thiserror.workspace = true
diff --git a/runtime/src/overlay/nested.rs b/runtime/src/overlay/nested.rs
index 342ad70c..38054d7b 100644
--- a/runtime/src/overlay/nested.rs
+++ b/runtime/src/overlay/nested.rs
@@ -160,7 +160,7 @@ where
/// Processes a runtime [`Event`].
pub fn update(
&mut self,
- event: Event,
+ event: &Event,
layout: Layout<'_>,
cursor: mouse::Cursor,
renderer: &Renderer,
@@ -170,7 +170,7 @@ where
fn recurse<Message, Theme, Renderer>(
element: &mut overlay::Element<'_, Message, Theme, Renderer>,
layout: Layout<'_>,
- event: Event,
+ event: &Event,
cursor: mouse::Cursor,
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
@@ -188,7 +188,7 @@ where
recurse(
&mut nested,
nested_layout,
- event.clone(),
+ event,
cursor,
renderer,
clipboard,
diff --git a/runtime/src/task.rs b/runtime/src/task.rs
index 22cfb63e..022483f7 100644
--- a/runtime/src/task.rs
+++ b/runtime/src/task.rs
@@ -3,7 +3,6 @@ use crate::core::widget;
use crate::futures::futures::channel::mpsc;
use crate::futures::futures::channel::oneshot;
use crate::futures::futures::future::{self, FutureExt};
-use crate::futures::futures::never::Never;
use crate::futures::futures::stream::{self, Stream, StreamExt};
use crate::futures::{boxed_stream, BoxStream, MaybeSend};
use crate::Action;
@@ -11,6 +10,9 @@ use crate::Action;
use std::future::Future;
use std::sync::Arc;
+#[doc(no_inline)]
+pub use sipper::{sipper, stream, Never, Sender, Sipper, Straw};
+
/// A set of concurrent actions to be performed by the iced runtime.
///
/// A [`Task`] _may_ produce a bunch of values of type `T`.
@@ -57,6 +59,22 @@ impl<T> Task<T> {
Self::stream(stream.map(f))
}
+ /// Creates a [`Task`] that runs the given [`Sipper`] to completion, mapping
+ /// progress with the first closure and the output with the second one.
+ pub fn sip<S>(
+ sipper: S,
+ on_progress: impl FnMut(S::Progress) -> T + MaybeSend + 'static,
+ on_output: impl FnOnce(<S as Future>::Output) -> T + MaybeSend + 'static,
+ ) -> Self
+ where
+ S: sipper::Core + MaybeSend + 'static,
+ T: MaybeSend + 'static,
+ {
+ Self::stream(stream(sipper::sipper(move |sender| async move {
+ on_output(sipper.with(on_progress).run(sender).await)
+ })))
+ }
+
/// Combines the given tasks and produces a single [`Task`] that will run all of them
/// in parallel.
pub fn batch(tasks: impl IntoIterator<Item = Self>) -> Self
diff --git a/runtime/src/user_interface.rs b/runtime/src/user_interface.rs
index b2826f71..9b396c69 100644
--- a/runtime/src/user_interface.rs
+++ b/runtime/src/user_interface.rs
@@ -5,7 +5,9 @@ use crate::core::mouse;
use crate::core::renderer;
use crate::core::widget;
use crate::core::window;
-use crate::core::{Clipboard, Element, Layout, Rectangle, Shell, Size, Vector};
+use crate::core::{
+ Clipboard, Element, InputMethod, Layout, Rectangle, Shell, Size, Vector,
+};
use crate::overlay;
/// A set of interactive graphical elements with a specific [`Layout`].
@@ -186,7 +188,8 @@ where
use std::mem::ManuallyDrop;
let mut outdated = false;
- let mut redraw_request = None;
+ let mut redraw_request = window::RedrawRequest::Wait;
+ let mut input_method = InputMethod::Disabled;
let mut manual_overlay = ManuallyDrop::new(
self.root
@@ -207,7 +210,7 @@ where
let mut layout = overlay.layout(renderer, bounds);
let mut event_statuses = Vec::new();
- for event in events.iter().cloned() {
+ for event in events {
let mut shell = Shell::new(messages);
overlay.update(
@@ -220,16 +223,8 @@ where
);
event_statuses.push(shell.event_status());
-
- match (redraw_request, shell.redraw_request()) {
- (None, Some(at)) => {
- redraw_request = Some(at);
- }
- (Some(current), Some(new)) if new < current => {
- redraw_request = Some(new);
- }
- _ => {}
- }
+ redraw_request = redraw_request.min(shell.redraw_request());
+ input_method.merge(shell.input_method());
if shell.is_layout_invalid() {
let _ = ManuallyDrop::into_inner(manual_overlay);
@@ -299,7 +294,6 @@ where
let event_statuses = events
.iter()
- .cloned()
.zip(overlay_statuses)
.map(|(event, overlay_status)| {
if matches!(overlay_status, event::Status::Captured) {
@@ -323,15 +317,8 @@ where
self.overlay = None;
}
- match (redraw_request, shell.redraw_request()) {
- (None, Some(at)) => {
- redraw_request = Some(at);
- }
- (Some(current), Some(new)) if new < current => {
- redraw_request = Some(new);
- }
- _ => {}
- }
+ redraw_request = redraw_request.min(shell.redraw_request());
+ input_method.merge(shell.input_method());
shell.revalidate_layout(|| {
self.base = self.root.as_widget().layout(
@@ -355,7 +342,10 @@ where
if outdated {
State::Outdated
} else {
- State::Updated { redraw_request }
+ State::Updated {
+ redraw_request,
+ input_method,
+ }
},
event_statuses,
)
@@ -636,7 +626,7 @@ impl Default for Cache {
}
/// The resulting state after updating a [`UserInterface`].
-#[derive(Debug, Clone, Copy)]
+#[derive(Debug, Clone)]
pub enum State {
/// The [`UserInterface`] is outdated and needs to be rebuilt.
Outdated,
@@ -644,7 +634,9 @@ pub enum State {
/// The [`UserInterface`] is up-to-date and can be reused without
/// rebuilding.
Updated {
- /// The [`window::RedrawRequest`] when a redraw should be performed.
- redraw_request: Option<window::RedrawRequest>,
+ /// The [`window::RedrawRequest`] describing when a redraw should be performed.
+ redraw_request: window::RedrawRequest,
+ /// The current [`InputMethod`] strategy of the user interface.
+ input_method: InputMethod,
},
}