Fix deferred layout on resize after drawing

This commit is contained in:
Héctor Ramón Jiménez 2024-10-29 20:53:29 +01:00
parent 4e47450c33
commit c6af79a1d0
No known key found for this signature in database
GPG key ID: 4C07CEC81AFA161F
3 changed files with 49 additions and 73 deletions

View file

@ -17,7 +17,6 @@
//! } //! }
//! ``` //! ```
use crate::core::border::{self, Border}; use crate::core::border::{self, Border};
use crate::core::event::{self, Event};
use crate::core::layout; use crate::core::layout;
use crate::core::mouse; use crate::core::mouse;
use crate::core::overlay; use crate::core::overlay;
@ -28,8 +27,8 @@ use crate::core::widget::tree::{self, Tree};
use crate::core::widget::Operation; use crate::core::widget::Operation;
use crate::core::window; use crate::core::window;
use crate::core::{ use crate::core::{
Background, Clipboard, Color, Element, Layout, Length, Padding, Rectangle, Background, Clipboard, Color, Element, Event, Layout, Length, Padding,
Shadow, Shell, Size, Theme, Vector, Widget, Rectangle, Shadow, Shell, Size, Theme, Vector, Widget,
}; };
/// A generic widget that produces a message when pressed. /// A generic widget that produces a message when pressed.
@ -295,7 +294,7 @@ where
viewport, viewport,
); );
if shell.event_status() == event::Status::Captured { if shell.is_event_captured() {
return; return;
} }

View file

@ -82,18 +82,21 @@ where
new_size: Size, new_size: Size,
view: &dyn Fn(Size) -> Element<'a, Message, Theme, Renderer>, view: &dyn Fn(Size) -> Element<'a, Message, Theme, Renderer>,
) { ) {
let is_tree_empty = if self.size != new_size {
tree.tag == tree::Tag::stateless() && tree.children.is_empty(); self.element = view(new_size);
self.size = new_size;
self.layout = None;
if !is_tree_empty && self.size == new_size { tree.diff(&self.element);
return; } else {
let is_tree_empty =
tree.tag == tree::Tag::stateless() && tree.children.is_empty();
if is_tree_empty {
self.layout = None;
tree.diff(&self.element);
}
} }
self.element = view(new_size);
self.size = new_size;
self.layout = None;
tree.diff(&self.element);
} }
fn resolve<R, T>( fn resolve<R, T>(

View file

@ -818,6 +818,39 @@ async fn run_instance<P, C>(
continue; continue;
}; };
let physical_size = window.state.physical_size();
if physical_size.width == 0 || physical_size.height == 0
{
continue;
}
if window.viewport_version
!= window.state.viewport_version()
{
let logical_size = window.state.logical_size();
debug.layout_started();
let ui = user_interfaces
.remove(&id)
.expect("Remove user interface");
let _ = user_interfaces.insert(
id,
ui.relayout(logical_size, &mut window.renderer),
);
debug.layout_finished();
compositor.configure_surface(
&mut window.surface,
physical_size.width,
physical_size.height,
);
window.viewport_version =
window.state.viewport_version();
}
let redraw_event = core::Event::Window( let redraw_event = core::Event::Window(
window::Event::RedrawRequested(Instant::now()), window::Event::RedrawRequested(Instant::now()),
); );
@ -877,65 +910,6 @@ async fn run_instance<P, C>(
} }
} }
let physical_size = window.state.physical_size();
if physical_size.width == 0 || physical_size.height == 0
{
continue;
}
if window.viewport_version
!= window.state.viewport_version()
{
let logical_size = window.state.logical_size();
debug.layout_started();
let ui = user_interfaces
.remove(&id)
.expect("Remove user interface");
let _ = user_interfaces.insert(
id,
ui.relayout(logical_size, &mut window.renderer),
);
debug.layout_finished();
debug.draw_started();
let new_mouse_interaction = user_interfaces
.get_mut(&id)
.expect("Get user interface")
.draw(
&mut window.renderer,
window.state.theme(),
&renderer::Style {
text_color: window.state.text_color(),
},
window.state.cursor(),
);
debug.draw_finished();
if new_mouse_interaction != window.mouse_interaction
{
window.raw.set_cursor(
conversion::mouse_interaction(
new_mouse_interaction,
),
);
window.mouse_interaction =
new_mouse_interaction;
}
compositor.configure_surface(
&mut window.surface,
physical_size.width,
physical_size.height,
);
window.viewport_version =
window.state.viewport_version();
}
debug.render_started(); debug.render_started();
match compositor.present( match compositor.present(
&mut window.renderer, &mut window.renderer,