summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-10-25 15:40:05 +0200
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-11-05 23:52:58 +0100
commit752403d70c851ece620c4007710062b158e8dec3 (patch)
tree8d98a4100dec46c123edd3d3fa4966110da6003c
parent7fbc195b11f9a858bcc8f56f76907af82c966c26 (diff)
downloadiced-752403d70c851ece620c4007710062b158e8dec3.tar.gz
iced-752403d70c851ece620c4007710062b158e8dec3.tar.bz2
iced-752403d70c851ece620c4007710062b158e8dec3.zip
Split `Shell::request_redraw` into two different methods
-rw-r--r--core/src/shell.rs24
-rw-r--r--examples/loading_spinners/src/circular.rs4
-rw-r--r--examples/loading_spinners/src/linear.rs4
-rw-r--r--examples/toast/src/main.rs14
-rw-r--r--widget/src/button.rs9
-rw-r--r--widget/src/checkbox.rs12
-rw-r--r--widget/src/lazy/component.rs19
-rw-r--r--widget/src/overlay/menu.rs14
-rw-r--r--widget/src/pick_list.rs12
-rw-r--r--widget/src/radio.rs12
-rw-r--r--widget/src/scrollable.rs2
-rw-r--r--widget/src/slider.rs9
-rw-r--r--widget/src/text_editor.rs6
-rw-r--r--widget/src/text_input.rs50
-rw-r--r--widget/src/toggler.rs12
15 files changed, 89 insertions, 114 deletions
diff --git a/core/src/shell.rs b/core/src/shell.rs
index 2952ceff..7a92a2be 100644
--- a/core/src/shell.rs
+++ b/core/src/shell.rs
@@ -1,3 +1,4 @@
+use crate::time::Instant;
use crate::window;
/// A connection to the state of a shell.
@@ -35,14 +36,19 @@ impl<'a, Message> Shell<'a, Message> {
self.messages.push(message);
}
- /// Requests a new frame to be drawn.
- pub fn request_redraw(&mut self, request: window::RedrawRequest) {
+ /// Requests a new frame to be drawn as soon as possible.
+ pub fn request_redraw(&mut self) {
+ self.redraw_request = Some(window::RedrawRequest::NextFrame);
+ }
+
+ /// Requests a new frame to be drawn at the given [`Instant`].
+ pub fn request_redraw_at(&mut self, at: Instant) {
match self.redraw_request {
None => {
- self.redraw_request = Some(request);
+ self.redraw_request = Some(window::RedrawRequest::At(at));
}
- Some(current) if request < current => {
- self.redraw_request = Some(request);
+ Some(window::RedrawRequest::At(current)) if at < current => {
+ self.redraw_request = Some(window::RedrawRequest::At(at));
}
_ => {}
}
@@ -95,8 +101,12 @@ impl<'a, Message> Shell<'a, Message> {
pub fn merge<B>(&mut self, other: Shell<'_, B>, f: impl Fn(B) -> Message) {
self.messages.extend(other.messages.drain(..).map(f));
- if let Some(at) = other.redraw_request {
- self.request_redraw(at);
+ if let Some(new) = other.redraw_request {
+ self.redraw_request = Some(
+ self.redraw_request
+ .map(|current| if current < new { current } else { new })
+ .unwrap_or(new),
+ );
}
self.is_layout_invalid =
diff --git a/examples/loading_spinners/src/circular.rs b/examples/loading_spinners/src/circular.rs
index 9239f01f..954a777e 100644
--- a/examples/loading_spinners/src/circular.rs
+++ b/examples/loading_spinners/src/circular.rs
@@ -7,7 +7,7 @@ use iced::event;
use iced::mouse;
use iced::time::Instant;
use iced::widget::canvas;
-use iced::window::{self, RedrawRequest};
+use iced::window;
use iced::{
Background, Color, Element, Event, Length, Radians, Rectangle, Renderer,
Size, Vector,
@@ -283,7 +283,7 @@ where
);
state.cache.clear();
- shell.request_redraw(RedrawRequest::NextFrame);
+ shell.request_redraw();
}
event::Status::Ignored
diff --git a/examples/loading_spinners/src/linear.rs b/examples/loading_spinners/src/linear.rs
index 164993c6..81edde75 100644
--- a/examples/loading_spinners/src/linear.rs
+++ b/examples/loading_spinners/src/linear.rs
@@ -6,7 +6,7 @@ use iced::advanced::{self, Clipboard, Layout, Shell, Widget};
use iced::event;
use iced::mouse;
use iced::time::Instant;
-use iced::window::{self, RedrawRequest};
+use iced::window;
use iced::{Background, Color, Element, Event, Length, Rectangle, Size};
use super::easing::{self, Easing};
@@ -192,7 +192,7 @@ where
if let Event::Window(window::Event::RedrawRequested(now)) = event {
*state = state.timed_transition(self.cycle_duration, now);
- shell.request_redraw(RedrawRequest::NextFrame);
+ shell.request_redraw();
}
event::Status::Ignored
diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs
index 8f6a836e..0b46c74e 100644
--- a/examples/toast/src/main.rs
+++ b/examples/toast/src/main.rs
@@ -500,8 +500,6 @@ mod toast {
shell: &mut Shell<'_, Message>,
) -> event::Status {
if let Event::Window(window::Event::RedrawRequested(now)) = &event {
- let mut next_redraw: Option<window::RedrawRequest> = None;
-
self.instants.iter_mut().enumerate().for_each(
|(index, maybe_instant)| {
if let Some(instant) = maybe_instant.as_mut() {
@@ -512,22 +510,12 @@ mod toast {
if remaining == Duration::ZERO {
maybe_instant.take();
shell.publish((self.on_close)(index));
- next_redraw =
- Some(window::RedrawRequest::NextFrame);
} else {
- let redraw_at =
- window::RedrawRequest::At(*now + remaining);
- next_redraw = next_redraw
- .map(|redraw| redraw.min(redraw_at))
- .or(Some(redraw_at));
+ shell.request_redraw_at(*now + remaining);
}
}
},
);
-
- if let Some(redraw) = next_redraw {
- shell.request_redraw(redraw);
- }
}
let viewport = layout.bounds();
diff --git a/widget/src/button.rs b/widget/src/button.rs
index 5850cea0..46fd0e17 100644
--- a/widget/src/button.rs
+++ b/widget/src/button.rs
@@ -366,13 +366,8 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.status = Some(current_status);
- } else {
- match self.status {
- Some(status) if status != current_status => {
- shell.request_redraw(window::RedrawRequest::NextFrame);
- }
- _ => {}
- }
+ } else if self.status.is_some_and(|status| status != current_status) {
+ shell.request_redraw();
}
update_status
diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs
index e5dea3cc..6c5d7d6b 100644
--- a/widget/src/checkbox.rs
+++ b/widget/src/checkbox.rs
@@ -345,13 +345,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(current_status);
- } else {
- match self.last_status {
- Some(status) if status != current_status => {
- shell.request_redraw(window::RedrawRequest::NextFrame);
- }
- _ => {}
- }
+ } else if self
+ .last_status
+ .is_some_and(|status| status != current_status)
+ {
+ shell.request_redraw();
}
event::Status::Ignored
diff --git a/widget/src/lazy/component.rs b/widget/src/lazy/component.rs
index c7bc1264..e45c24ac 100644
--- a/widget/src/lazy/component.rs
+++ b/widget/src/lazy/component.rs
@@ -7,6 +7,7 @@ use crate::core::overlay;
use crate::core::renderer;
use crate::core::widget;
use crate::core::widget::tree::{self, Tree};
+use crate::core::window;
use crate::core::{
self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector,
Widget,
@@ -342,7 +343,14 @@ where
local_shell.revalidate_layout(|| shell.invalidate_layout());
if let Some(redraw_request) = local_shell.redraw_request() {
- shell.request_redraw(redraw_request);
+ match redraw_request {
+ window::RedrawRequest::NextFrame => {
+ shell.request_redraw();
+ }
+ window::RedrawRequest::At(at) => {
+ shell.request_redraw_at(at);
+ }
+ }
}
if !local_messages.is_empty() {
@@ -620,7 +628,14 @@ where
local_shell.revalidate_layout(|| shell.invalidate_layout());
if let Some(redraw_request) = local_shell.redraw_request() {
- shell.request_redraw(redraw_request);
+ match redraw_request {
+ window::RedrawRequest::NextFrame => {
+ shell.request_redraw();
+ }
+ window::RedrawRequest::At(at) => {
+ shell.request_redraw_at(at);
+ }
+ }
}
if !local_messages.is_empty() {
diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs
index e79bd3da..c1a0a5d8 100644
--- a/widget/src/overlay/menu.rs
+++ b/widget/src/overlay/menu.rs
@@ -435,9 +435,7 @@ where
.publish(on_option_hovered(option.clone()));
}
- shell.request_redraw(
- window::RedrawRequest::NextFrame,
- );
+ shell.request_redraw();
}
}
@@ -472,14 +470,12 @@ where
let state = tree.state.downcast_mut::<ListState>();
- if state.is_hovered.is_some_and(|is_hovered| {
- is_hovered != cursor.is_over(layout.bounds())
- }) {
- shell.request_redraw(window::RedrawRequest::NextFrame);
- }
-
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
state.is_hovered = Some(cursor.is_over(layout.bounds()));
+ } else if state.is_hovered.is_some_and(|is_hovered| {
+ is_hovered != cursor.is_over(layout.bounds())
+ }) {
+ shell.request_redraw();
}
event::Status::Ignored
diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs
index ec1c054f..9c9ba9e9 100644
--- a/widget/src/pick_list.rs
+++ b/widget/src/pick_list.rs
@@ -535,13 +535,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(status);
- } else {
- match self.last_status {
- Some(last_status) if last_status != status => {
- shell.request_redraw(window::RedrawRequest::NextFrame);
- }
- _ => {}
- }
+ } else if self
+ .last_status
+ .is_some_and(|last_status| last_status != status)
+ {
+ shell.request_redraw();
}
event_status
diff --git a/widget/src/radio.rs b/widget/src/radio.rs
index 714d4fb5..ed821532 100644
--- a/widget/src/radio.rs
+++ b/widget/src/radio.rs
@@ -360,13 +360,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(current_status);
- } else {
- match self.last_status {
- Some(status) if status != current_status => {
- shell.request_redraw(window::RedrawRequest::NextFrame);
- }
- _ => {}
- }
+ } else if self
+ .last_status
+ .is_some_and(|last_status| last_status != current_status)
+ {
+ shell.request_redraw();
}
event::Status::Ignored
diff --git a/widget/src/scrollable.rs b/widget/src/scrollable.rs
index c4350547..abad6ea6 100644
--- a/widget/src/scrollable.rs
+++ b/widget/src/scrollable.rs
@@ -931,7 +931,7 @@ where
.last_status
.is_some_and(|last_status| last_status != status)
{
- shell.request_redraw(window::RedrawRequest::NextFrame);
+ shell.request_redraw();
}
event_status
diff --git a/widget/src/slider.rs b/widget/src/slider.rs
index 25f0d85f..dbdb5f07 100644
--- a/widget/src/slider.rs
+++ b/widget/src/slider.rs
@@ -432,13 +432,8 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.status = Some(current_status);
- } else {
- match self.status {
- Some(status) if status != current_status => {
- shell.request_redraw(window::RedrawRequest::NextFrame);
- }
- _ => {}
- }
+ } else if self.status.is_some_and(|status| status != current_status) {
+ shell.request_redraw();
}
update_status
diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs
index a298252a..3bb45494 100644
--- a/widget/src/text_editor.rs
+++ b/widget/src/text_editor.rs
@@ -624,7 +624,7 @@ where
focus.is_window_focused = true;
focus.updated_at = Instant::now();
- shell.request_redraw(window::RedrawRequest::NextFrame);
+ shell.request_redraw();
}
}
Event::Window(window::Event::RedrawRequested(now)) => {
@@ -637,11 +637,11 @@ where
- (now - focus.updated_at).as_millis()
% Focus::CURSOR_BLINK_INTERVAL_MILLIS;
- shell.request_redraw(window::RedrawRequest::At(
+ shell.request_redraw_at(
now + Duration::from_millis(
millis_until_redraw as u64,
),
- ));
+ );
}
}
}
diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs
index c18009a2..8fa7889f 100644
--- a/widget/src/text_input.rs
+++ b/widget/src/text_input.rs
@@ -751,7 +751,7 @@ where
state.last_click = Some(click);
if cursor_before != state.cursor {
- shell.request_redraw(window::RedrawRequest::NextFrame);
+ shell.request_redraw();
}
return event::Status::Captured;
@@ -806,7 +806,7 @@ where
}
if selection_before != state.cursor.selection(&value) {
- shell.request_redraw(window::RedrawRequest::NextFrame);
+ shell.request_redraw();
}
return event::Status::Captured;
@@ -914,9 +914,7 @@ where
if cursor_before != state.cursor {
focus.updated_at = Instant::now();
- shell.request_redraw(
- window::RedrawRequest::NextFrame,
- );
+ shell.request_redraw();
}
return event::Status::Captured;
@@ -1037,9 +1035,7 @@ where
if cursor_before != state.cursor {
focus.updated_at = Instant::now();
- shell.request_redraw(
- window::RedrawRequest::NextFrame,
- );
+ shell.request_redraw();
}
return event::Status::Captured;
@@ -1059,9 +1055,7 @@ where
if cursor_before != state.cursor {
focus.updated_at = Instant::now();
- shell.request_redraw(
- window::RedrawRequest::NextFrame,
- );
+ shell.request_redraw();
}
return event::Status::Captured;
@@ -1083,9 +1077,7 @@ where
if cursor_before != state.cursor {
focus.updated_at = Instant::now();
- shell.request_redraw(
- window::RedrawRequest::NextFrame,
- );
+ shell.request_redraw();
}
return event::Status::Captured;
@@ -1107,9 +1099,7 @@ where
if cursor_before != state.cursor {
focus.updated_at = Instant::now();
- shell.request_redraw(
- window::RedrawRequest::NextFrame,
- );
+ shell.request_redraw();
}
return event::Status::Captured;
@@ -1136,9 +1126,7 @@ where
if cursor_before != state.cursor {
focus.updated_at = Instant::now();
- shell.request_redraw(
- window::RedrawRequest::NextFrame,
- );
+ shell.request_redraw();
}
return event::Status::Captured;
@@ -1165,9 +1153,7 @@ where
if cursor_before != state.cursor {
focus.updated_at = Instant::now();
- shell.request_redraw(
- window::RedrawRequest::NextFrame,
- );
+ shell.request_redraw();
}
return event::Status::Captured;
@@ -1218,7 +1204,7 @@ where
focus.is_window_focused = true;
focus.updated_at = Instant::now();
- shell.request_redraw(window::RedrawRequest::NextFrame);
+ shell.request_redraw();
}
}
Event::Window(window::Event::RedrawRequested(now)) => {
@@ -1237,11 +1223,11 @@ where
- (*now - focus.updated_at).as_millis()
% CURSOR_BLINK_INTERVAL_MILLIS;
- shell.request_redraw(window::RedrawRequest::At(
+ shell.request_redraw_at(
*now + Duration::from_millis(
millis_until_redraw as u64,
),
- ));
+ );
}
}
}
@@ -1265,13 +1251,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(status);
- } else {
- match self.last_status {
- Some(last_status) if status != last_status => {
- shell.request_redraw(window::RedrawRequest::NextFrame);
- }
- _ => {}
- }
+ } else if self
+ .last_status
+ .is_some_and(|last_status| status != last_status)
+ {
+ shell.request_redraw();
}
event::Status::Ignored
diff --git a/widget/src/toggler.rs b/widget/src/toggler.rs
index 13244e34..2553a7e4 100644
--- a/widget/src/toggler.rs
+++ b/widget/src/toggler.rs
@@ -352,13 +352,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(current_status);
- } else {
- match self.last_status {
- Some(status) if status != current_status => {
- shell.request_redraw(window::RedrawRequest::NextFrame);
- }
- _ => {}
- }
+ } else if self
+ .last_status
+ .is_some_and(|status| status != current_status)
+ {
+ shell.request_redraw();
}
event_status