Fix deferred layout on resize after drawing
This commit is contained in:
parent
4e47450c33
commit
c6af79a1d0
3 changed files with 49 additions and 73 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>(
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue