summaryrefslogtreecommitdiffstats
path: root/native/src/user_interface.rs
diff options
context:
space:
mode:
authorLibravatar Bingus <shankern@protonmail.com>2023-01-18 15:01:17 -0800
committerLibravatar Bingus <shankern@protonmail.com>2023-01-18 15:01:17 -0800
commit70d487ba20a50c06c73f0ffcd8198f1a7eac7f37 (patch)
treeafb8e161b18236d4440cba8bb0e0ce896858d653 /native/src/user_interface.rs
parent790fa3e7a01a790aa3f07083fe9abf6b68fa7ba1 (diff)
parent5ef0648bf447aaca8b96782643401e54a2bf7759 (diff)
downloadiced-70d487ba20a50c06c73f0ffcd8198f1a7eac7f37.tar.gz
iced-70d487ba20a50c06c73f0ffcd8198f1a7eac7f37.tar.bz2
iced-70d487ba20a50c06c73f0ffcd8198f1a7eac7f37.zip
Merge remote-tracking branch 'origin/master' into feat/multi-window-support
# Conflicts: # examples/events/src/main.rs # glutin/src/application.rs # native/src/window.rs # winit/src/window.rs
Diffstat (limited to 'native/src/user_interface.rs')
-rw-r--r--native/src/user_interface.rs47
1 files changed, 40 insertions, 7 deletions
diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs
index 2b43829d..29cc3472 100644
--- a/native/src/user_interface.rs
+++ b/native/src/user_interface.rs
@@ -5,6 +5,7 @@ use crate::layout;
use crate::mouse;
use crate::renderer;
use crate::widget;
+use crate::window;
use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size};
/// A set of interactive graphical elements with a specific [`Layout`].
@@ -18,8 +19,8 @@ use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size};
/// The [`integration_opengl`] & [`integration_wgpu`] examples use a
/// [`UserInterface`] to integrate Iced in an existing graphical application.
///
-/// [`integration_opengl`]: https://github.com/iced-rs/iced/tree/0.6/examples/integration_opengl
-/// [`integration_wgpu`]: https://github.com/iced-rs/iced/tree/0.6/examples/integration_wgpu
+/// [`integration_opengl`]: https://github.com/iced-rs/iced/tree/0.7/examples/integration_opengl
+/// [`integration_wgpu`]: https://github.com/iced-rs/iced/tree/0.7/examples/integration_wgpu
#[allow(missing_debug_implementations)]
pub struct UserInterface<'a, Message, Renderer> {
root: Element<'a, Message, Renderer>,
@@ -188,7 +189,9 @@ where
) -> (State, Vec<event::Status>) {
use std::mem::ManuallyDrop;
- let mut state = State::Updated;
+ let mut outdated = false;
+ let mut redraw_request = None;
+
let mut manual_overlay =
ManuallyDrop::new(self.root.as_widget_mut().overlay(
&mut self.state,
@@ -217,6 +220,16 @@ where
event_statuses.push(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);
+ }
+ _ => {}
+ }
+
if shell.is_layout_invalid() {
let _ = ManuallyDrop::into_inner(manual_overlay);
@@ -244,7 +257,7 @@ where
}
if shell.are_widgets_invalid() {
- state = State::Outdated;
+ outdated = true;
}
}
@@ -289,6 +302,16 @@ 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);
+ }
+ _ => {}
+ }
+
shell.revalidate_layout(|| {
self.base = renderer.layout(
&self.root,
@@ -299,14 +322,21 @@ 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_request }
+ },
+ event_statuses,
+ )
}
/// Draws the [`UserInterface`] with the provided [`Renderer`].
@@ -559,5 +589,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_request: Option<window::RedrawRequest>,
+ },
}