diff --git a/crates/gpui2/src/geometry.rs b/crates/gpui2/src/geometry.rs index 854453101e..a1898bfd6d 100644 --- a/crates/gpui2/src/geometry.rs +++ b/crates/gpui2/src/geometry.rs @@ -335,6 +335,10 @@ where }; Bounds { origin, size } } + + pub fn new(origin: Point, size: Size) -> Self { + Bounds { origin, size } + } } impl Bounds diff --git a/crates/terminal_view2/src/terminal_element.rs b/crates/terminal_view2/src/terminal_element.rs index 30dbccf455..95a76f143f 100644 --- a/crates/terminal_view2/src/terminal_element.rs +++ b/crates/terminal_view2/src/terminal_element.rs @@ -1,17 +1,7 @@ use editor::{Cursor, HighlightedRange, HighlightedRangeLine}; use gpui::{ - color::Color, - elements::{Empty, Overlay}, - fonts::{HighlightStyle, Properties, Style::Italic, TextStyle, Underline, Weight}, - geometry::{ - rect::RectF, - vector::{vec2f, Vector2F}, - }, - platform::{CursorStyle, MouseButton}, - serde_json::json, - text_layout::{Line, RunStyle}, - AnyElement, Element, EventContext, FontCache, ModelContext, MouseRegion, Quad, SizeConstraint, - TextLayoutCache, ViewContext, WeakModelHandle, WindowContext, + serde_json::json, AnyElement, Bounds, HighlightStyle, Hsla, Line, ModelContext, MouseButton, + Pixels, Point, TextStyle, ViewContext, WeakModel, WindowContext, }; use itertools::Itertools; use language::CursorShape; @@ -20,14 +10,17 @@ use terminal::{ alacritty_terminal::{ ansi::{Color as AnsiColor, Color::Named, CursorShape as AlacCursorShape, NamedColor}, grid::Dimensions, - index::Point, + index::Point as AlacPoint, term::{cell::Flags, TermMode}, }, - mappings::colors::convert_color, + // mappings::colors::convert_color, terminal_settings::TerminalSettings, - IndexedCell, Terminal, TerminalContent, TerminalSize, + IndexedCell, + Terminal, + TerminalContent, + TerminalSize, }; -use theme::{TerminalStyle, ThemeSettings}; +use theme::ThemeSettings; use util::ResultExt; use std::{fmt::Debug, ops::RangeInclusive}; @@ -39,9 +32,9 @@ use crate::TerminalView; pub struct LayoutState { cells: Vec, rects: Vec, - relative_highlighted_ranges: Vec<(RangeInclusive, Color)>, + relative_highlighted_ranges: Vec<(RangeInclusive, Hsla)>, cursor: Option, - background_color: Color, + background_color: Hsla, size: TerminalSize, mode: TermMode, display_offset: usize, @@ -56,7 +49,7 @@ struct DisplayCursor { } impl DisplayCursor { - fn from(cursor_point: Point, display_offset: usize) -> Self { + fn from(cursor_point: AlacPoint, display_offset: usize) -> Self { Self { line: cursor_point.line.0 + display_offset as i32, col: cursor_point.column.0, @@ -74,45 +67,45 @@ impl DisplayCursor { #[derive(Clone, Debug, Default)] struct LayoutCell { - point: Point, + point: AlacPoint, text: Line, } impl LayoutCell { - fn new(point: Point, text: Line) -> LayoutCell { + fn new(point: AlacPoint, text: Line) -> LayoutCell { LayoutCell { point, text } } fn paint( &self, - origin: Vector2F, + origin: Point, layout: &LayoutState, - visible_bounds: RectF, + _visible_bounds: Bounds, _view: &mut TerminalView, cx: &mut WindowContext, ) { let pos = { let point = self.point; - vec2f( - (origin.x() + point.column as f32 * layout.size.cell_width).floor(), - origin.y() + point.line as f32 * layout.size.line_height, + + Point::new( + (origin.x + point.column as f32 * layout.size.cell_width).floor(), + origin.y + point.line as f32 * layout.size.line_height, ) }; - self.text - .paint(pos, visible_bounds, layout.size.line_height, cx); + self.text.paint(pos, layout.size.line_height, cx); } } #[derive(Clone, Debug, Default)] struct LayoutRect { - point: Point, + point: AlacPoint, num_of_cells: usize, - color: Color, + color: Hsla, } impl LayoutRect { - fn new(point: Point, num_of_cells: usize, color: Color) -> LayoutRect { + fn new(point: AlacPoint, num_of_cells: usize, color: Hsla) -> LayoutRect { LayoutRect { point, num_of_cells, @@ -130,7 +123,7 @@ impl LayoutRect { fn paint( &self, - origin: Vector2F, + origin: Point, layout: &LayoutState, _view: &mut TerminalView, cx: &mut ViewContext, @@ -147,19 +140,20 @@ impl LayoutRect { layout.size.line_height, ); - cx.scene().push_quad(Quad { - bounds: RectF::new(position, size), - background: Some(self.color), - border: Default::default(), - corner_radii: Default::default(), - }) + cx.paint_quad( + Bounds::new(position, size), + Default::default(), + Some(self.color), + Default::default(), + Default::default(), + ); } } ///The GPUI element that paints the terminal. ///We need to keep a reference to the view for mouse events, do we need it for any other terminal stuff, or can we move that to connection? pub struct TerminalElement { - terminal: WeakModelHandle, + terminal: WeakModel, focused: bool, cursor_visible: bool, can_navigate_to_selected_word: bool, @@ -167,7 +161,7 @@ pub struct TerminalElement { impl TerminalElement { pub fn new( - terminal: WeakModelHandle, + terminal: WeakModel, focused: bool, cursor_visible: bool, can_navigate_to_selected_word: bool, @@ -180,7 +174,7 @@ impl TerminalElement { } } - //Vec> -> Clip out the parts of the ranges + //Vec> -> Clip out the parts of the ranges fn layout_grid( grid: &Vec, @@ -188,7 +182,7 @@ impl TerminalElement { terminal_theme: &TerminalStyle, text_layout_cache: &TextLayoutCache, font_cache: &FontCache, - hyperlink: Option<(HighlightStyle, &RangeInclusive)>, + hyperlink: Option<(HighlightStyle, &RangeInclusive)>, ) -> (Vec, Vec) { let mut cells = vec![]; let mut rects = vec![]; @@ -225,7 +219,10 @@ impl TerminalElement { rects.push(cur_rect.take().unwrap()); } cur_rect = Some(LayoutRect::new( - Point::new(line_index as i32, cell.point.column.0 as i32), + AlacPoint::new( + line_index as i32, + cell.point.column.0 as i32, + ), 1, convert_color(&bg, &terminal_theme), )); @@ -234,7 +231,7 @@ impl TerminalElement { None => { cur_alac_color = Some(bg); cur_rect = Some(LayoutRect::new( - Point::new(line_index as i32, cell.point.column.0 as i32), + AlacPoint::new(line_index as i32, cell.point.column.0 as i32), 1, convert_color(&bg, &terminal_theme), )); @@ -263,7 +260,7 @@ impl TerminalElement { ); cells.push(LayoutCell::new( - Point::new(line_index as i32, cell.point.column.0 as i32), + AlacPoint::new(line_index as i32, cell.point.column.0 as i32), layout_cell, )) }; @@ -312,7 +309,7 @@ impl TerminalElement { style: &TerminalStyle, text_style: &TextStyle, font_cache: &FontCache, - hyperlink: Option<(HighlightStyle, &RangeInclusive)>, + hyperlink: Option<(HighlightStyle, &RangeInclusive)>, ) -> RunStyle { let flags = indexed.cell.flags; let fg = convert_color(&fg, &style); @@ -366,8 +363,8 @@ impl TerminalElement { } fn generic_button_handler( - connection: WeakModelHandle, - origin: Vector2F, + connection: WeakModel, + origin: Point, f: impl Fn(&mut Terminal, Vector2F, E, &mut ModelContext), ) -> impl Fn(E, &mut TerminalView, &mut EventContext) { move |event, _: &mut TerminalView, cx| { @@ -384,8 +381,8 @@ impl TerminalElement { fn attach_mouse_handlers( &self, - origin: Vector2F, - visible_bounds: RectF, + origin: Point, + visible_bounds: Bounds, mode: TermMode, cx: &mut ViewContext, ) { @@ -729,8 +726,8 @@ impl Element for TerminalElement { fn paint( &mut self, - bounds: RectF, - visible_bounds: RectF, + bounds: Bounds, + visible_bounds: Bounds, layout: &mut Self::LayoutState, view: &mut TerminalView, cx: &mut ViewContext, @@ -749,7 +746,7 @@ impl Element for TerminalElement { cx.scene().push_cursor_region(gpui::CursorRegion { bounds, style: if layout.hyperlink_tooltip.is_some() { - CursorStyle::PointingHand + CursorStyle::AlacPointingHand } else { CursorStyle::IBeam }, @@ -817,7 +814,7 @@ impl Element for TerminalElement { fn debug( &self, - _: RectF, + _: Bounds, _: &Self::LayoutState, _: &Self::PaintState, _: &TerminalView, @@ -831,8 +828,8 @@ impl Element for TerminalElement { fn rect_for_text_range( &self, _: Range, - bounds: RectF, - _: RectF, + bounds: Bounds, + _: Bounds, layout: &Self::LayoutState, _: &Self::PaintState, _: &TerminalView, @@ -875,9 +872,9 @@ fn is_blank(cell: &IndexedCell) -> bool { } fn to_highlighted_range_lines( - range: &RangeInclusive, + range: &RangeInclusive, layout: &LayoutState, - origin: Vector2F, + origin: Point, ) -> Option<(f32, Vec)> { // Step 1. Normalize the points to be viewport relative. // When display_offset = 1, here's how the grid is arranged: @@ -897,11 +894,12 @@ fn to_highlighted_range_lines( // of the grid data we should be looking at. But for the rendering step, we don't // want negatives. We want things relative to the 'viewport' (the area of the grid // which is currently shown according to the display offset) - let unclamped_start = Point::new( + let unclamped_start = AlacPoint::new( range.start().line + layout.display_offset, range.start().column, ); - let unclamped_end = Point::new(range.end().line + layout.display_offset, range.end().column); + let unclamped_end = + AlacPoint::new(range.end().line + layout.display_offset, range.end().column); // Step 2. Clamp range to viewport, and return None if it doesn't overlap if unclamped_end.line.0 < 0 || unclamped_start.line.0 > layout.size.num_lines() as i32 { @@ -911,7 +909,7 @@ fn to_highlighted_range_lines( let clamped_start_line = unclamped_start.line.0.max(0) as usize; let clamped_end_line = unclamped_end.line.0.min(layout.size.num_lines() as i32) as usize; //Convert the start of the range to pixels - let start_y = origin.y() + clamped_start_line as f32 * layout.size.line_height; + let start_y = origin.y + clamped_start_line as f32 * layout.size.line_height; // Step 3. Expand ranges that cross lines into a collection of single-line ranges. // (also convert to pixels)