summaryrefslogtreecommitdiffstats
path: root/native/src/user_interface.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-01-12 02:59:08 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-01-12 02:59:08 +0100
commit7354f68b3ca345767de3f09dccddf168493977bf (patch)
treea09626c11a25ab4260c576733f1700e9ad12894b /native/src/user_interface.rs
parent7ccd87c36b54e0d53f65f5774f140a0528ae4504 (diff)
downloadiced-7354f68b3ca345767de3f09dccddf168493977bf.tar.gz
iced-7354f68b3ca345767de3f09dccddf168493977bf.tar.bz2
iced-7354f68b3ca345767de3f09dccddf168493977bf.zip
Draft `Shell:request_redraw` API
... and implement `TextInput` cursor blink :tada:
Diffstat (limited to 'native/src/user_interface.rs')
-rw-r--r--native/src/user_interface.rs46
1 files changed, 41 insertions, 5 deletions
diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs
index 2b43829d..49a6b00e 100644
--- a/native/src/user_interface.rs
+++ b/native/src/user_interface.rs
@@ -7,6 +7,8 @@ use crate::renderer;
use crate::widget;
use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size};
+use std::time::Instant;
+
/// A set of interactive graphical elements with a specific [`Layout`].
///
/// It can be updated and drawn.
@@ -188,7 +190,9 @@ where
) -> (State, Vec<event::Status>) {
use std::mem::ManuallyDrop;
- let mut state = State::Updated;
+ let mut outdated = false;
+ let mut redraw_requested_at = None;
+
let mut manual_overlay =
ManuallyDrop::new(self.root.as_widget_mut().overlay(
&mut self.state,
@@ -217,6 +221,16 @@ where
event_statuses.push(event_status);
+ match (redraw_requested_at, shell.redraw_requested_at()) {
+ (None, Some(at)) => {
+ redraw_requested_at = Some(at);
+ }
+ (Some(current), Some(new)) if new < current => {
+ redraw_requested_at = Some(new);
+ }
+ _ => {}
+ }
+
if shell.is_layout_invalid() {
let _ = ManuallyDrop::into_inner(manual_overlay);
@@ -244,7 +258,7 @@ where
}
if shell.are_widgets_invalid() {
- state = State::Outdated;
+ outdated = true;
}
}
@@ -289,6 +303,16 @@ where
self.overlay = None;
}
+ match (redraw_requested_at, shell.redraw_requested_at()) {
+ (None, Some(at)) => {
+ redraw_requested_at = Some(at);
+ }
+ (Some(current), Some(new)) if new < current => {
+ redraw_requested_at = Some(new);
+ }
+ _ => {}
+ }
+
shell.revalidate_layout(|| {
self.base = renderer.layout(
&self.root,
@@ -299,14 +323,23 @@ where
});
if shell.are_widgets_invalid() {
- state = State::Outdated;
+ outdated = true;
}
event_status.merge(overlay_status)
})
.collect();
- (state, event_statuses)
+ (
+ if outdated {
+ State::Outdated
+ } else {
+ State::Updated {
+ redraw_requested_at,
+ }
+ },
+ event_statuses,
+ )
}
/// Draws the [`UserInterface`] with the provided [`Renderer`].
@@ -559,5 +592,8 @@ pub enum State {
/// The [`UserInterface`] is up-to-date and can be reused without
/// rebuilding.
- Updated,
+ Updated {
+ /// The [`Instant`] when a redraw should be performed.
+ redraw_requested_at: Option<Instant>,
+ },
}