Reuse cursor style when reusing a view tree
This commit is contained in:
parent
50ccdf5c16
commit
18eaefd0ed
1 changed files with 26 additions and 13 deletions
|
@ -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());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue