diff options
author | 2024-10-25 15:40:05 +0200 | |
---|---|---|
committer | 2024-11-05 23:52:58 +0100 | |
commit | 752403d70c851ece620c4007710062b158e8dec3 (patch) | |
tree | 8d98a4100dec46c123edd3d3fa4966110da6003c | |
parent | 7fbc195b11f9a858bcc8f56f76907af82c966c26 (diff) | |
download | iced-752403d70c851ece620c4007710062b158e8dec3.tar.gz iced-752403d70c851ece620c4007710062b158e8dec3.tar.bz2 iced-752403d70c851ece620c4007710062b158e8dec3.zip |
Split `Shell::request_redraw` into two different methods
-rw-r--r-- | core/src/shell.rs | 24 | ||||
-rw-r--r-- | examples/loading_spinners/src/circular.rs | 4 | ||||
-rw-r--r-- | examples/loading_spinners/src/linear.rs | 4 | ||||
-rw-r--r-- | examples/toast/src/main.rs | 14 | ||||
-rw-r--r-- | widget/src/button.rs | 9 | ||||
-rw-r--r-- | widget/src/checkbox.rs | 12 | ||||
-rw-r--r-- | widget/src/lazy/component.rs | 19 | ||||
-rw-r--r-- | widget/src/overlay/menu.rs | 14 | ||||
-rw-r--r-- | widget/src/pick_list.rs | 12 | ||||
-rw-r--r-- | widget/src/radio.rs | 12 | ||||
-rw-r--r-- | widget/src/scrollable.rs | 2 | ||||
-rw-r--r-- | widget/src/slider.rs | 9 | ||||
-rw-r--r-- | widget/src/text_editor.rs | 6 | ||||
-rw-r--r-- | widget/src/text_input.rs | 50 | ||||
-rw-r--r-- | widget/src/toggler.rs | 12 |
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 |