Detailed changes
@@ -3484,8 +3484,7 @@ impl<'a, V: View> RenderContext<'a, V> {
pub fn mouse_state<Tag: 'static>(&self, region_id: usize) -> MouseState {
let region_id = MouseRegionId {
view_id: self.view_id,
- tag: TypeId::of::<Tag>(),
- region_id,
+ discriminant: (TypeId::of::<Tag>(), region_id),
};
MouseState {
hovered: self.hovered_region_ids.contains(®ion_id),
@@ -131,8 +131,7 @@ impl Element for MouseEventHandler {
cx.scene.push_mouse_region(MouseRegion {
view_id: cx.current_view_id(),
- tag: self.tag,
- region_id: self.id,
+ discriminant: Some((self.tag, self.id)),
bounds: self.hit_bounds(bounds),
hover: None,
click: self.click_handler.clone(),
@@ -3,8 +3,8 @@ use serde_json::json;
use crate::{
geometry::{rect::RectF, vector::Vector2F},
json::ToJson,
- DebugContext, Element, ElementBox, Event, EventContext, LayoutContext, PaintContext,
- SizeConstraint,
+ DebugContext, Element, ElementBox, Event, EventContext, LayoutContext, MouseRegion,
+ PaintContext, SizeConstraint,
};
pub struct Overlay {
@@ -54,6 +54,11 @@ impl Element for Overlay {
let origin = self.abs_position.unwrap_or(bounds.origin());
let visible_bounds = RectF::new(origin, *size);
cx.scene.push_stacking_context(None);
+ cx.scene.push_mouse_region(MouseRegion {
+ view_id: cx.current_view_id(),
+ bounds: visible_bounds,
+ ..Default::default()
+ });
self.child.paint(origin, visible_bounds, cx);
cx.scene.pop_stacking_context();
}
@@ -103,11 +103,11 @@ impl Presenter {
view_id: *view_id,
titlebar_height: self.titlebar_height,
hovered_region_ids: self.hovered_region_ids.clone(),
- clicked_region_id: self.clicked_region.as_ref().map(MouseRegion::id),
+ clicked_region_id: self.clicked_region.as_ref().and_then(MouseRegion::id),
right_clicked_region_id: self
.right_clicked_region
.as_ref()
- .map(MouseRegion::id),
+ .and_then(MouseRegion::id),
refreshing: false,
})
.unwrap(),
@@ -125,11 +125,11 @@ impl Presenter {
view_id: *view_id,
titlebar_height: self.titlebar_height,
hovered_region_ids: self.hovered_region_ids.clone(),
- clicked_region_id: self.clicked_region.as_ref().map(MouseRegion::id),
+ clicked_region_id: self.clicked_region.as_ref().and_then(MouseRegion::id),
right_clicked_region_id: self
.right_clicked_region
.as_ref()
- .map(MouseRegion::id),
+ .and_then(MouseRegion::id),
refreshing: true,
})
.unwrap();
@@ -194,8 +194,8 @@ impl Presenter {
view_stack: Vec::new(),
refreshing,
hovered_region_ids: self.hovered_region_ids.clone(),
- clicked_region_id: self.clicked_region.as_ref().map(MouseRegion::id),
- right_clicked_region_id: self.right_clicked_region.as_ref().map(MouseRegion::id),
+ clicked_region_id: self.clicked_region.as_ref().and_then(MouseRegion::id),
+ right_clicked_region_id: self.right_clicked_region.as_ref().and_then(MouseRegion::id),
titlebar_height: self.titlebar_height,
window_size,
app: cx,
@@ -293,21 +293,24 @@ impl Presenter {
let mut hover_depth = None;
for (region, depth) in self.mouse_regions.iter().rev() {
- let region_id = region.id();
if region.bounds.contains_point(position)
&& hover_depth.map_or(true, |hover_depth| hover_depth == *depth)
{
hover_depth = Some(*depth);
- if !self.hovered_region_ids.contains(®ion_id) {
- invalidated_views.push(region.view_id);
- hovered_regions.push(region.clone());
- self.hovered_region_ids.insert(region_id);
+ if let Some(region_id) = region.id() {
+ if !self.hovered_region_ids.contains(®ion_id) {
+ invalidated_views.push(region.view_id);
+ hovered_regions.push(region.clone());
+ self.hovered_region_ids.insert(region_id);
+ }
}
} else {
- if self.hovered_region_ids.contains(®ion_id) {
- invalidated_views.push(region.view_id);
- unhovered_regions.push(region.clone());
- self.hovered_region_ids.remove(®ion_id);
+ if let Some(region_id) = region.id() {
+ if self.hovered_region_ids.contains(®ion_id) {
+ invalidated_views.push(region.view_id);
+ unhovered_regions.push(region.clone());
+ self.hovered_region_ids.remove(®ion_id);
+ }
}
}
}
@@ -43,11 +43,10 @@ pub struct CursorRegion {
pub style: CursorStyle,
}
-#[derive(Clone)]
+#[derive(Clone, Default)]
pub struct MouseRegion {
pub view_id: usize,
- pub tag: TypeId,
- pub region_id: usize,
+ pub discriminant: Option<(TypeId, usize)>,
pub bounds: RectF,
pub hover: Option<Rc<dyn Fn(bool, &mut EventContext)>>,
pub mouse_down: Option<Rc<dyn Fn(Vector2F, &mut EventContext)>>,
@@ -60,8 +59,7 @@ pub struct MouseRegion {
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
pub struct MouseRegionId {
pub view_id: usize,
- pub tag: TypeId,
- pub region_id: usize,
+ pub discriminant: (TypeId, usize),
}
#[derive(Default, Debug)]
@@ -544,12 +542,11 @@ impl ToJson for Border {
}
impl MouseRegion {
- pub fn id(&self) -> MouseRegionId {
- MouseRegionId {
+ pub fn id(&self) -> Option<MouseRegionId> {
+ self.discriminant.map(|discriminant| MouseRegionId {
view_id: self.view_id,
- tag: self.tag,
- region_id: self.region_id,
- }
+ discriminant,
+ })
}
}