Reuse cursor style when reusing a view tree

This commit is contained in:
Antonio Scandurra 2024-01-11 15:03:34 +01:00
parent 50ccdf5c16
commit 18eaefd0ed

View file

@ -273,7 +273,6 @@ pub struct Window {
default_prevented: bool,
mouse_position: Point<Pixels>,
modifiers: Modifiers,
requested_cursor_style: Option<CursorStyle>,
scale_factor: f32,
bounds: WindowBounds,
bounds_observers: SubscriberSet<(), AnyObserver>,
@ -314,6 +313,8 @@ pub(crate) struct Frame {
content_mask_stack: Vec<ContentMask<Pixels>>,
element_offset_stack: Vec<Point<Pixels>>,
requested_input_handler: Option<RequestedInputHandler>,
cursor_styles: FxHashMap<EntityId, CursorStyle>,
requested_cursor_style: Option<CursorStyle>,
pub(crate) view_stack: Vec<EntityId>,
pub(crate) reused_views: FxHashSet<EntityId>,
}
@ -333,6 +334,8 @@ impl Frame {
content_mask_stack: Vec::new(),
element_offset_stack: Vec::new(),
requested_input_handler: None,
cursor_styles: FxHashMap::default(),
requested_cursor_style: None,
view_stack: Vec::new(),
reused_views: FxHashSet::default(),
}
@ -346,6 +349,9 @@ impl Frame {
self.next_stacking_order_id = 0;
self.reused_views.clear();
self.scene.clear();
self.requested_input_handler.take();
self.cursor_styles.clear();
self.requested_cursor_style.take();
debug_assert_eq!(self.view_stack.len(), 0);
}
@ -469,7 +475,6 @@ impl Window {
default_prevented: true,
mouse_position,
modifiers,
requested_cursor_style: None,
scale_factor,
bounds,
bounds_observers: SubscriberSet::new(),
@ -1037,7 +1042,9 @@ impl<'a> WindowContext<'a> {
/// Update the cursor style at the platform level.
pub fn set_cursor_style(&mut self, style: CursorStyle) {
self.window.requested_cursor_style = Some(style)
let view_id = self.parent_view_id();
self.window.next_frame.cursor_styles.insert(view_id, style);
self.window.next_frame.requested_cursor_style = Some(style);
}
/// Called during painting to track which z-index is on top at each pixel position
@ -1436,6 +1443,11 @@ impl<'a> WindowContext<'a> {
self.window.next_frame.requested_input_handler =
self.window.rendered_frame.requested_input_handler.take();
}
if let Some(style) = self.window.rendered_frame.cursor_styles.remove(&view_id) {
self.window.next_frame.cursor_styles.insert(view_id, style);
self.window.next_frame.requested_cursor_style = Some(style);
}
}
}
@ -1505,6 +1517,17 @@ impl<'a> WindowContext<'a> {
self.window.next_frame.window_active = self.window.active;
self.window.root_view = Some(root_view);
// Set the cursor only if we're the active window.
let cursor_style = self
.window
.next_frame
.requested_cursor_style
.take()
.unwrap_or(CursorStyle::Arrow);
if self.is_window_active() {
self.platform.set_cursor_style(cursor_style);
}
self.window
.next_frame
.reuse_views(&mut self.window.rendered_frame);
@ -1523,16 +1546,6 @@ impl<'a> WindowContext<'a> {
let current_focus_path = self.window.rendered_frame.focus_path();
let current_window_active = self.window.rendered_frame.window_active;
// Set the cursor only if we're the active window.
let cursor_style = self
.window
.requested_cursor_style
.take()
.unwrap_or(CursorStyle::Arrow);
if self.is_window_active() {
self.platform.set_cursor_style(cursor_style);
}
self.window.refreshing = false;
self.window.drawing = false;
ELEMENT_ARENA.with_borrow_mut(|element_arena| element_arena.clear());