diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 355d1f44337c9c855625ecc0255e51b57ee5db4b..319ed212528d7d9a73ada985702441ad093f54c5 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -18,8 +18,9 @@ use gpui::{ json::{self, ToJson}, platform::CursorStyle, text_layout::{self, Line, RunStyle, TextLayoutCache}, - AppContext, Axis, Border, Element, ElementBox, Event, EventContext, LayoutContext, - MutableAppContext, PaintContext, Quad, Scene, SizeConstraint, ViewContext, WeakViewHandle, + AppContext, Axis, Border, CursorRegion, Element, ElementBox, Event, EventContext, + LayoutContext, MutableAppContext, PaintContext, Quad, Scene, SizeConstraint, ViewContext, + WeakViewHandle, }; use json::json; use language::{Bias, DiagnosticSeverity}; @@ -330,7 +331,10 @@ impl EditorElement { let content_origin = bounds.origin() + vec2f(layout.gutter_margin, 0.); cx.scene.push_layer(Some(bounds)); - cx.scene.push_cursor_style(bounds, CursorStyle::IBeam); + cx.scene.push_cursor_region(CursorRegion { + bounds, + style: CursorStyle::IBeam, + }); for (range, color) in &layout.highlighted_ranges { self.paint_highlighted_range( diff --git a/crates/gpui/src/elements/container.rs b/crates/gpui/src/elements/container.rs index 62f19636b7c5dd95a02d7a6f4d200b4343ddec9c..004052b9baec4e310dcfd879f6950d264a2749e2 100644 --- a/crates/gpui/src/elements/container.rs +++ b/crates/gpui/src/elements/container.rs @@ -7,7 +7,7 @@ use crate::{ }, json::ToJson, platform::CursorStyle, - scene::{self, Border, Quad}, + scene::{self, Border, CursorRegion, Quad}, Element, ElementBox, Event, EventContext, LayoutContext, PaintContext, SizeConstraint, }; use serde::Deserialize; @@ -213,7 +213,10 @@ impl Element for Container { } if let Some(style) = self.style.cursor { - cx.scene.push_cursor_style(quad_bounds, style); + cx.scene.push_cursor_region(CursorRegion { + bounds: quad_bounds, + style, + }); } let child_origin = diff --git a/crates/gpui/src/elements/mouse_event_handler.rs b/crates/gpui/src/elements/mouse_event_handler.rs index 1ee7c6cbb5e57bf2108d36f48424fd3c9db7e058..975a47a1efe44708da7d5a562ac77c4e9d6cc697 100644 --- a/crates/gpui/src/elements/mouse_event_handler.rs +++ b/crates/gpui/src/elements/mouse_event_handler.rs @@ -5,6 +5,7 @@ use crate::{ vector::{vec2f, Vector2F}, }, platform::CursorStyle, + scene::CursorRegion, DebugContext, Element, ElementBox, ElementStateContext, ElementStateHandle, Event, EventContext, LayoutContext, PaintContext, SizeConstraint, }; @@ -100,9 +101,11 @@ impl Element for MouseEventHandler { _: &mut Self::LayoutState, cx: &mut PaintContext, ) -> Self::PaintState { - if let Some(cursor_style) = self.cursor_style { - cx.scene - .push_cursor_style(self.hit_bounds(bounds), cursor_style); + if let Some(style) = self.cursor_style { + cx.scene.push_cursor_region(CursorRegion { + bounds: self.hit_bounds(bounds), + style, + }); } self.child.paint(bounds.origin(), visible_bounds, cx); } diff --git a/crates/gpui/src/gpui.rs b/crates/gpui/src/gpui.rs index e58bbec1c60f485ae5a24986de99841f00d2a705..085ec867918692dea99c65cc4db1c1936a81d1fe 100644 --- a/crates/gpui/src/gpui.rs +++ b/crates/gpui/src/gpui.rs @@ -16,7 +16,7 @@ pub mod fonts; pub mod geometry; mod presenter; mod scene; -pub use scene::{Border, Quad, Scene}; +pub use scene::{Border, CursorRegion, Quad, Scene}; pub mod text_layout; pub use text_layout::TextLayoutCache; mod util; diff --git a/crates/gpui/src/presenter.rs b/crates/gpui/src/presenter.rs index fbdd6963e372f711d193c9bde16b34156d6118d5..2bc241daee2dae65b862d594bd5899487886e1f9 100644 --- a/crates/gpui/src/presenter.rs +++ b/crates/gpui/src/presenter.rs @@ -5,6 +5,7 @@ use crate::{ geometry::rect::RectF, json::{self, ToJson}, platform::{CursorStyle, Event}, + scene::CursorRegion, text_layout::TextLayoutCache, Action, AnyModelHandle, AnyViewHandle, AnyWeakModelHandle, AssetCache, ElementBox, ElementStateContext, Entity, FontSystem, ModelHandle, ReadModel, ReadView, Scene, @@ -22,7 +23,7 @@ pub struct Presenter { window_id: usize, pub(crate) rendered_views: HashMap, parents: HashMap, - cursor_styles: Vec<(RectF, CursorStyle)>, + cursor_regions: Vec, font_cache: Arc, text_layout_cache: TextLayoutCache, asset_cache: Arc, @@ -43,7 +44,7 @@ impl Presenter { window_id, rendered_views: cx.render_views(window_id, titlebar_height), parents: HashMap::new(), - cursor_styles: Default::default(), + cursor_regions: Default::default(), font_cache, text_layout_cache, asset_cache, @@ -120,7 +121,7 @@ impl Presenter { RectF::new(Vector2F::zero(), window_size), ); self.text_layout_cache.finish_frame(); - self.cursor_styles = scene.cursor_styles(); + self.cursor_regions = scene.cursor_regions(); if cx.window_is_active(self.window_id) { if let Some(event) = self.last_mouse_moved_event.clone() { @@ -184,9 +185,9 @@ impl Presenter { if !left_mouse_down { let mut style_to_assign = CursorStyle::Arrow; - for (bounds, style) in self.cursor_styles.iter().rev() { - if bounds.contains_point(position) { - style_to_assign = *style; + for region in self.cursor_regions.iter().rev() { + if region.bounds.contains_point(position) { + style_to_assign = region.style; break; } } diff --git a/crates/gpui/src/scene.rs b/crates/gpui/src/scene.rs index 7c358b85a04991272b05a4fb4ececeec07b51ef0..0f10256cb0dfcf3d14ee8aa5e6c2174551a24b76 100644 --- a/crates/gpui/src/scene.rs +++ b/crates/gpui/src/scene.rs @@ -33,7 +33,13 @@ pub struct Layer { image_glyphs: Vec, icons: Vec, paths: Vec, - cursor_styles: Vec<(RectF, CursorStyle)>, + cursor_regions: Vec, +} + +#[derive(Copy, Clone)] +pub struct CursorRegion { + pub bounds: RectF, + pub style: CursorStyle, } #[derive(Default, Debug)] @@ -175,9 +181,9 @@ impl Scene { self.stacking_contexts.iter().flat_map(|s| &s.layers) } - pub fn cursor_styles(&self) -> Vec<(RectF, CursorStyle)> { + pub fn cursor_regions(&self) -> Vec { self.layers() - .flat_map(|layer| &layer.cursor_styles) + .flat_map(|layer| &layer.cursor_regions) .copied() .collect() } @@ -206,8 +212,8 @@ impl Scene { self.active_layer().push_quad(quad) } - pub fn push_cursor_style(&mut self, bounds: RectF, style: CursorStyle) { - self.active_layer().push_cursor_style(bounds, style); + pub fn push_cursor_region(&mut self, region: CursorRegion) { + self.active_layer().push_cursor_region(region); } pub fn push_image(&mut self, image: Image) { @@ -298,7 +304,7 @@ impl Layer { glyphs: Default::default(), icons: Default::default(), paths: Default::default(), - cursor_styles: Default::default(), + cursor_regions: Default::default(), } } @@ -316,10 +322,13 @@ impl Layer { self.quads.as_slice() } - fn push_cursor_style(&mut self, bounds: RectF, style: CursorStyle) { - if let Some(bounds) = bounds.intersection(self.clip_bounds.unwrap_or(bounds)) { + fn push_cursor_region(&mut self, region: CursorRegion) { + if let Some(bounds) = region + .bounds + .intersection(self.clip_bounds.unwrap_or(region.bounds)) + { if can_draw(bounds) { - self.cursor_styles.push((bounds, style)); + self.cursor_regions.push(region); } } }