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,
|
default_prevented: bool,
|
||||||
mouse_position: Point<Pixels>,
|
mouse_position: Point<Pixels>,
|
||||||
modifiers: Modifiers,
|
modifiers: Modifiers,
|
||||||
requested_cursor_style: Option<CursorStyle>,
|
|
||||||
scale_factor: f32,
|
scale_factor: f32,
|
||||||
bounds: WindowBounds,
|
bounds: WindowBounds,
|
||||||
bounds_observers: SubscriberSet<(), AnyObserver>,
|
bounds_observers: SubscriberSet<(), AnyObserver>,
|
||||||
|
@ -314,6 +313,8 @@ pub(crate) struct Frame {
|
||||||
content_mask_stack: Vec<ContentMask<Pixels>>,
|
content_mask_stack: Vec<ContentMask<Pixels>>,
|
||||||
element_offset_stack: Vec<Point<Pixels>>,
|
element_offset_stack: Vec<Point<Pixels>>,
|
||||||
requested_input_handler: Option<RequestedInputHandler>,
|
requested_input_handler: Option<RequestedInputHandler>,
|
||||||
|
cursor_styles: FxHashMap<EntityId, CursorStyle>,
|
||||||
|
requested_cursor_style: Option<CursorStyle>,
|
||||||
pub(crate) view_stack: Vec<EntityId>,
|
pub(crate) view_stack: Vec<EntityId>,
|
||||||
pub(crate) reused_views: FxHashSet<EntityId>,
|
pub(crate) reused_views: FxHashSet<EntityId>,
|
||||||
}
|
}
|
||||||
|
@ -333,6 +334,8 @@ impl Frame {
|
||||||
content_mask_stack: Vec::new(),
|
content_mask_stack: Vec::new(),
|
||||||
element_offset_stack: Vec::new(),
|
element_offset_stack: Vec::new(),
|
||||||
requested_input_handler: None,
|
requested_input_handler: None,
|
||||||
|
cursor_styles: FxHashMap::default(),
|
||||||
|
requested_cursor_style: None,
|
||||||
view_stack: Vec::new(),
|
view_stack: Vec::new(),
|
||||||
reused_views: FxHashSet::default(),
|
reused_views: FxHashSet::default(),
|
||||||
}
|
}
|
||||||
|
@ -346,6 +349,9 @@ impl Frame {
|
||||||
self.next_stacking_order_id = 0;
|
self.next_stacking_order_id = 0;
|
||||||
self.reused_views.clear();
|
self.reused_views.clear();
|
||||||
self.scene.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);
|
debug_assert_eq!(self.view_stack.len(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,7 +475,6 @@ impl Window {
|
||||||
default_prevented: true,
|
default_prevented: true,
|
||||||
mouse_position,
|
mouse_position,
|
||||||
modifiers,
|
modifiers,
|
||||||
requested_cursor_style: None,
|
|
||||||
scale_factor,
|
scale_factor,
|
||||||
bounds,
|
bounds,
|
||||||
bounds_observers: SubscriberSet::new(),
|
bounds_observers: SubscriberSet::new(),
|
||||||
|
@ -1037,7 +1042,9 @@ impl<'a> WindowContext<'a> {
|
||||||
|
|
||||||
/// Update the cursor style at the platform level.
|
/// Update the cursor style at the platform level.
|
||||||
pub fn set_cursor_style(&mut self, style: CursorStyle) {
|
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
|
/// 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.next_frame.requested_input_handler =
|
||||||
self.window.rendered_frame.requested_input_handler.take();
|
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.next_frame.window_active = self.window.active;
|
||||||
self.window.root_view = Some(root_view);
|
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
|
self.window
|
||||||
.next_frame
|
.next_frame
|
||||||
.reuse_views(&mut self.window.rendered_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_focus_path = self.window.rendered_frame.focus_path();
|
||||||
let current_window_active = self.window.rendered_frame.window_active;
|
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.refreshing = false;
|
||||||
self.window.drawing = false;
|
self.window.drawing = false;
|
||||||
ELEMENT_ARENA.with_borrow_mut(|element_arena| element_arena.clear());
|
ELEMENT_ARENA.with_borrow_mut(|element_arena| element_arena.clear());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue