Split Shell::request_redraw into two different methods

This commit is contained in:
Héctor Ramón Jiménez 2024-10-25 15:40:05 +02:00
parent 7fbc195b11
commit 752403d70c
No known key found for this signature in database
GPG key ID: 4C07CEC81AFA161F
15 changed files with 89 additions and 114 deletions

View file

@ -1,3 +1,4 @@
use crate::time::Instant;
use crate::window; use crate::window;
/// A connection to the state of a shell. /// A connection to the state of a shell.
@ -35,14 +36,19 @@ impl<'a, Message> Shell<'a, Message> {
self.messages.push(message); self.messages.push(message);
} }
/// Requests a new frame to be drawn. /// Requests a new frame to be drawn as soon as possible.
pub fn request_redraw(&mut self, request: window::RedrawRequest) { 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 { match self.redraw_request {
None => { None => {
self.redraw_request = Some(request); self.redraw_request = Some(window::RedrawRequest::At(at));
} }
Some(current) if request < current => { Some(window::RedrawRequest::At(current)) if at < current => {
self.redraw_request = Some(request); 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) { pub fn merge<B>(&mut self, other: Shell<'_, B>, f: impl Fn(B) -> Message) {
self.messages.extend(other.messages.drain(..).map(f)); self.messages.extend(other.messages.drain(..).map(f));
if let Some(at) = other.redraw_request { if let Some(new) = other.redraw_request {
self.request_redraw(at); self.redraw_request = Some(
self.redraw_request
.map(|current| if current < new { current } else { new })
.unwrap_or(new),
);
} }
self.is_layout_invalid = self.is_layout_invalid =

View file

@ -7,7 +7,7 @@ use iced::event;
use iced::mouse; use iced::mouse;
use iced::time::Instant; use iced::time::Instant;
use iced::widget::canvas; use iced::widget::canvas;
use iced::window::{self, RedrawRequest}; use iced::window;
use iced::{ use iced::{
Background, Color, Element, Event, Length, Radians, Rectangle, Renderer, Background, Color, Element, Event, Length, Radians, Rectangle, Renderer,
Size, Vector, Size, Vector,
@ -283,7 +283,7 @@ where
); );
state.cache.clear(); state.cache.clear();
shell.request_redraw(RedrawRequest::NextFrame); shell.request_redraw();
} }
event::Status::Ignored event::Status::Ignored

View file

@ -6,7 +6,7 @@ use iced::advanced::{self, Clipboard, Layout, Shell, Widget};
use iced::event; use iced::event;
use iced::mouse; use iced::mouse;
use iced::time::Instant; use iced::time::Instant;
use iced::window::{self, RedrawRequest}; use iced::window;
use iced::{Background, Color, Element, Event, Length, Rectangle, Size}; use iced::{Background, Color, Element, Event, Length, Rectangle, Size};
use super::easing::{self, Easing}; use super::easing::{self, Easing};
@ -192,7 +192,7 @@ where
if let Event::Window(window::Event::RedrawRequested(now)) = event { if let Event::Window(window::Event::RedrawRequested(now)) = event {
*state = state.timed_transition(self.cycle_duration, now); *state = state.timed_transition(self.cycle_duration, now);
shell.request_redraw(RedrawRequest::NextFrame); shell.request_redraw();
} }
event::Status::Ignored event::Status::Ignored

View file

@ -500,8 +500,6 @@ mod toast {
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
) -> event::Status { ) -> event::Status {
if let Event::Window(window::Event::RedrawRequested(now)) = &event { if let Event::Window(window::Event::RedrawRequested(now)) = &event {
let mut next_redraw: Option<window::RedrawRequest> = None;
self.instants.iter_mut().enumerate().for_each( self.instants.iter_mut().enumerate().for_each(
|(index, maybe_instant)| { |(index, maybe_instant)| {
if let Some(instant) = maybe_instant.as_mut() { if let Some(instant) = maybe_instant.as_mut() {
@ -512,22 +510,12 @@ mod toast {
if remaining == Duration::ZERO { if remaining == Duration::ZERO {
maybe_instant.take(); maybe_instant.take();
shell.publish((self.on_close)(index)); shell.publish((self.on_close)(index));
next_redraw =
Some(window::RedrawRequest::NextFrame);
} else { } else {
let redraw_at = shell.request_redraw_at(*now + remaining);
window::RedrawRequest::At(*now + remaining);
next_redraw = next_redraw
.map(|redraw| redraw.min(redraw_at))
.or(Some(redraw_at));
} }
} }
}, },
); );
if let Some(redraw) = next_redraw {
shell.request_redraw(redraw);
}
} }
let viewport = layout.bounds(); let viewport = layout.bounds();

View file

@ -366,13 +366,8 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event { if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.status = Some(current_status); self.status = Some(current_status);
} else { } else if self.status.is_some_and(|status| status != current_status) {
match self.status { shell.request_redraw();
Some(status) if status != current_status => {
shell.request_redraw(window::RedrawRequest::NextFrame);
}
_ => {}
}
} }
update_status update_status

View file

@ -345,13 +345,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event { if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(current_status); self.last_status = Some(current_status);
} else { } else if self
match self.last_status { .last_status
Some(status) if status != current_status => { .is_some_and(|status| status != current_status)
shell.request_redraw(window::RedrawRequest::NextFrame); {
} shell.request_redraw();
_ => {}
}
} }
event::Status::Ignored event::Status::Ignored

View file

@ -7,6 +7,7 @@ use crate::core::overlay;
use crate::core::renderer; use crate::core::renderer;
use crate::core::widget; use crate::core::widget;
use crate::core::widget::tree::{self, Tree}; use crate::core::widget::tree::{self, Tree};
use crate::core::window;
use crate::core::{ use crate::core::{
self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector, self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector,
Widget, Widget,
@ -342,7 +343,14 @@ where
local_shell.revalidate_layout(|| shell.invalidate_layout()); local_shell.revalidate_layout(|| shell.invalidate_layout());
if let Some(redraw_request) = local_shell.redraw_request() { 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() { if !local_messages.is_empty() {
@ -620,7 +628,14 @@ where
local_shell.revalidate_layout(|| shell.invalidate_layout()); local_shell.revalidate_layout(|| shell.invalidate_layout());
if let Some(redraw_request) = local_shell.redraw_request() { 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() { if !local_messages.is_empty() {

View file

@ -435,9 +435,7 @@ where
.publish(on_option_hovered(option.clone())); .publish(on_option_hovered(option.clone()));
} }
shell.request_redraw( shell.request_redraw();
window::RedrawRequest::NextFrame,
);
} }
} }
@ -472,14 +470,12 @@ where
let state = tree.state.downcast_mut::<ListState>(); 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 { if let Event::Window(window::Event::RedrawRequested(_now)) = event {
state.is_hovered = Some(cursor.is_over(layout.bounds())); 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 event::Status::Ignored

View file

@ -535,13 +535,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event { if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(status); self.last_status = Some(status);
} else { } else if self
match self.last_status { .last_status
Some(last_status) if last_status != status => { .is_some_and(|last_status| last_status != status)
shell.request_redraw(window::RedrawRequest::NextFrame); {
} shell.request_redraw();
_ => {}
}
} }
event_status event_status

View file

@ -360,13 +360,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event { if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(current_status); self.last_status = Some(current_status);
} else { } else if self
match self.last_status { .last_status
Some(status) if status != current_status => { .is_some_and(|last_status| last_status != current_status)
shell.request_redraw(window::RedrawRequest::NextFrame); {
} shell.request_redraw();
_ => {}
}
} }
event::Status::Ignored event::Status::Ignored

View file

@ -931,7 +931,7 @@ where
.last_status .last_status
.is_some_and(|last_status| last_status != status) .is_some_and(|last_status| last_status != status)
{ {
shell.request_redraw(window::RedrawRequest::NextFrame); shell.request_redraw();
} }
event_status event_status

View file

@ -432,13 +432,8 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event { if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.status = Some(current_status); self.status = Some(current_status);
} else { } else if self.status.is_some_and(|status| status != current_status) {
match self.status { shell.request_redraw();
Some(status) if status != current_status => {
shell.request_redraw(window::RedrawRequest::NextFrame);
}
_ => {}
}
} }
update_status update_status

View file

@ -624,7 +624,7 @@ where
focus.is_window_focused = true; focus.is_window_focused = true;
focus.updated_at = Instant::now(); focus.updated_at = Instant::now();
shell.request_redraw(window::RedrawRequest::NextFrame); shell.request_redraw();
} }
} }
Event::Window(window::Event::RedrawRequested(now)) => { Event::Window(window::Event::RedrawRequested(now)) => {
@ -637,11 +637,11 @@ where
- (now - focus.updated_at).as_millis() - (now - focus.updated_at).as_millis()
% Focus::CURSOR_BLINK_INTERVAL_MILLIS; % Focus::CURSOR_BLINK_INTERVAL_MILLIS;
shell.request_redraw(window::RedrawRequest::At( shell.request_redraw_at(
now + Duration::from_millis( now + Duration::from_millis(
millis_until_redraw as u64, millis_until_redraw as u64,
), ),
)); );
} }
} }
} }

View file

@ -751,7 +751,7 @@ where
state.last_click = Some(click); state.last_click = Some(click);
if cursor_before != state.cursor { if cursor_before != state.cursor {
shell.request_redraw(window::RedrawRequest::NextFrame); shell.request_redraw();
} }
return event::Status::Captured; return event::Status::Captured;
@ -806,7 +806,7 @@ where
} }
if selection_before != state.cursor.selection(&value) { if selection_before != state.cursor.selection(&value) {
shell.request_redraw(window::RedrawRequest::NextFrame); shell.request_redraw();
} }
return event::Status::Captured; return event::Status::Captured;
@ -914,9 +914,7 @@ where
if cursor_before != state.cursor { if cursor_before != state.cursor {
focus.updated_at = Instant::now(); focus.updated_at = Instant::now();
shell.request_redraw( shell.request_redraw();
window::RedrawRequest::NextFrame,
);
} }
return event::Status::Captured; return event::Status::Captured;
@ -1037,9 +1035,7 @@ where
if cursor_before != state.cursor { if cursor_before != state.cursor {
focus.updated_at = Instant::now(); focus.updated_at = Instant::now();
shell.request_redraw( shell.request_redraw();
window::RedrawRequest::NextFrame,
);
} }
return event::Status::Captured; return event::Status::Captured;
@ -1059,9 +1055,7 @@ where
if cursor_before != state.cursor { if cursor_before != state.cursor {
focus.updated_at = Instant::now(); focus.updated_at = Instant::now();
shell.request_redraw( shell.request_redraw();
window::RedrawRequest::NextFrame,
);
} }
return event::Status::Captured; return event::Status::Captured;
@ -1083,9 +1077,7 @@ where
if cursor_before != state.cursor { if cursor_before != state.cursor {
focus.updated_at = Instant::now(); focus.updated_at = Instant::now();
shell.request_redraw( shell.request_redraw();
window::RedrawRequest::NextFrame,
);
} }
return event::Status::Captured; return event::Status::Captured;
@ -1107,9 +1099,7 @@ where
if cursor_before != state.cursor { if cursor_before != state.cursor {
focus.updated_at = Instant::now(); focus.updated_at = Instant::now();
shell.request_redraw( shell.request_redraw();
window::RedrawRequest::NextFrame,
);
} }
return event::Status::Captured; return event::Status::Captured;
@ -1136,9 +1126,7 @@ where
if cursor_before != state.cursor { if cursor_before != state.cursor {
focus.updated_at = Instant::now(); focus.updated_at = Instant::now();
shell.request_redraw( shell.request_redraw();
window::RedrawRequest::NextFrame,
);
} }
return event::Status::Captured; return event::Status::Captured;
@ -1165,9 +1153,7 @@ where
if cursor_before != state.cursor { if cursor_before != state.cursor {
focus.updated_at = Instant::now(); focus.updated_at = Instant::now();
shell.request_redraw( shell.request_redraw();
window::RedrawRequest::NextFrame,
);
} }
return event::Status::Captured; return event::Status::Captured;
@ -1218,7 +1204,7 @@ where
focus.is_window_focused = true; focus.is_window_focused = true;
focus.updated_at = Instant::now(); focus.updated_at = Instant::now();
shell.request_redraw(window::RedrawRequest::NextFrame); shell.request_redraw();
} }
} }
Event::Window(window::Event::RedrawRequested(now)) => { Event::Window(window::Event::RedrawRequested(now)) => {
@ -1237,11 +1223,11 @@ where
- (*now - focus.updated_at).as_millis() - (*now - focus.updated_at).as_millis()
% CURSOR_BLINK_INTERVAL_MILLIS; % CURSOR_BLINK_INTERVAL_MILLIS;
shell.request_redraw(window::RedrawRequest::At( shell.request_redraw_at(
*now + Duration::from_millis( *now + Duration::from_millis(
millis_until_redraw as u64, millis_until_redraw as u64,
), ),
)); );
} }
} }
} }
@ -1265,13 +1251,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event { if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(status); self.last_status = Some(status);
} else { } else if self
match self.last_status { .last_status
Some(last_status) if status != last_status => { .is_some_and(|last_status| status != last_status)
shell.request_redraw(window::RedrawRequest::NextFrame); {
} shell.request_redraw();
_ => {}
}
} }
event::Status::Ignored event::Status::Ignored

View file

@ -352,13 +352,11 @@ where
if let Event::Window(window::Event::RedrawRequested(_now)) = event { if let Event::Window(window::Event::RedrawRequested(_now)) = event {
self.last_status = Some(current_status); self.last_status = Some(current_status);
} else { } else if self
match self.last_status { .last_status
Some(status) if status != current_status => { .is_some_and(|status| status != current_status)
shell.request_redraw(window::RedrawRequest::NextFrame); {
} shell.request_redraw();
_ => {}
}
} }
event_status event_status