diff --git a/crates/terminal_view2/src/terminal_element.rs b/crates/terminal_view2/src/terminal_element.rs index e93d82047d6782f518db309ac3c132d642dd2d46..363dd90287ad890bf873f60a400568da8ce786e8 100644 --- a/crates/terminal_view2/src/terminal_element.rs +++ b/crates/terminal_view2/src/terminal_element.rs @@ -1,8 +1,11 @@ +// #![allow(unused)] // todo!() + // use editor::{Cursor, HighlightedRange, HighlightedRangeLine}; // use gpui::{ // point, transparent_black, AnyElement, AppContext, Bounds, Component, CursorStyle, Element, -// FontStyle, FontWeight, HighlightStyle, Hsla, LayoutId, Line, ModelContext, MouseButton, -// Overlay, Pixels, Point, Quad, TextStyle, Underline, ViewContext, WeakModel, WindowContext, +// ElementId, FontStyle, FontWeight, HighlightStyle, Hsla, IntoElement, IsZero, LayoutId, +// ModelContext, Overlay, Pixels, Point, Quad, TextRun, TextStyle, TextSystem, Underline, +// ViewContext, WeakModel, WindowContext, // }; // use itertools::Itertools; // use language::CursorShape; @@ -15,15 +18,10 @@ // index::Point as AlacPoint, // term::{cell::Flags, TermMode}, // }, -// // mappings::colors::convert_color, // terminal_settings::TerminalSettings, -// IndexedCell, -// Terminal, -// TerminalContent, -// TerminalSize, +// IndexedCell, Terminal, TerminalContent, TerminalSize, // }; // use theme::ThemeSettings; -// use workspace::ElementId; // use std::mem; // use std::{fmt::Debug, ops::RangeInclusive}; @@ -40,7 +38,7 @@ // size: TerminalSize, // mode: TermMode, // display_offset: usize, -// hyperlink_tooltip: Option>, +// hyperlink_tooltip: Option, // gutter: f32, // } @@ -183,9 +181,9 @@ // grid: &Vec, // text_style: &TextStyle, // terminal_theme: &TerminalStyle, -// text_layout_cache: &TextLayoutCache, -// font_cache: &FontCache, +// text_system: &TextSystem, // hyperlink: Option<(HighlightStyle, &RangeInclusive)>, +// cx: &mut WindowContext<'_>, // ) -> (Vec, Vec) { // let mut cells = vec![]; // let mut rects = vec![]; @@ -252,15 +250,15 @@ // fg, // terminal_theme, // text_style, -// font_cache, +// text_system, // hyperlink, // ); -// let layout_cell = text_layout_cache.layout_str( +// let layout_cell = text_system.layout_line( // cell_text, -// text_style.font_size, +// text_style.font_size.to_pixels(cx.rem_size()), // &[(cell_text.len(), cell_style)], -// ); +// )?; // cells.push(LayoutCell::new( // AlacPoint::new(line_index as i32, cell.point.column.0 as i32), @@ -311,24 +309,27 @@ // fg: terminal::alacritty_terminal::ansi::Color, // style: &TerminalStyle, // text_style: &TextStyle, -// font_cache: &FontCache, +// text_system: &TextSystem, // hyperlink: Option<(HighlightStyle, &RangeInclusive)>, -// ) -> RunStyle { +// ) -> TextRun { // let flags = indexed.cell.flags; // let fg = convert_color(&fg, &style); // let mut underline = flags // .intersects(Flags::ALL_UNDERLINES) // .then(|| Underline { -// color: Some(fg), -// squiggly: flags.contains(Flags::UNDERCURL), -// thickness: OrderedFloat(1.), +// color: fg, +// thickness: Pixels::from(1.0).scale(1.0), +// order: todo!(), +// bounds: todo!(), +// content_mask: todo!(), +// wavy: flags.contains(Flags::UNDERCURL), // }) // .unwrap_or_default(); // if indexed.cell.hyperlink().is_some() { -// if underline.thickness == OrderedFloat(0.) { -// underline.thickness = OrderedFloat(1.); +// if underline.thickness.is_zero() { +// underline.thickness = Pixels::from(1.0).scale(1.0); // } // } @@ -340,11 +341,11 @@ // properties = *properties.style(FontStyle::Italic); // } -// let font_id = font_cache +// let font_id = text_system // .select_font(text_style.font_family, &properties) // .unwrap_or(text_style.font_id); -// let mut result = RunStyle { +// let mut result = TextRun { // color: fg, // font_id, // underline, @@ -353,7 +354,7 @@ // if let Some((style, range)) = hyperlink { // if range.contains(&indexed.point) { // if let Some(underline) = style.underline { -// result.underline = underline; +// result.underline = Some(underline); // } // if let Some(color) = style.color { @@ -365,22 +366,23 @@ // result // } -// fn generic_button_handler( -// connection: WeakModel, -// origin: Point, -// f: impl Fn(&mut Terminal, Point, E, &mut ModelContext), -// ) -> impl Fn(E, &mut TerminalView, &mut EventContext) { -// move |event, _: &mut TerminalView, cx| { -// cx.focus_parent(); -// if let Some(conn_handle) = connection.upgrade() { -// conn_handle.update(cx, |terminal, cx| { -// f(terminal, origin, event, cx); - -// cx.notify(); -// }) -// } -// } -// } +// // todo!() +// // fn generic_button_handler( +// // connection: WeakModel, +// // origin: Point, +// // f: impl Fn(&mut Terminal, Point, E, &mut ModelContext), +// // ) -> impl Fn(E, &mut TerminalView, &mut EventContext) { +// // move |event, _: &mut TerminalView, cx| { +// // cx.focus_parent(); +// // if let Some(conn_handle) = connection.upgrade() { +// // conn_handle.update(cx, |terminal, cx| { +// // f(terminal, origin, event, cx); + +// // cx.notify(); +// // }) +// // } +// // } +// // } // fn attach_mouse_handlers( // &self, @@ -389,144 +391,144 @@ // mode: TermMode, // cx: &mut ViewContext, // ) { -// let connection = self.terminal; - -// let mut region = MouseRegion::new::(cx.view_id(), 0, visible_bounds); - -// // Terminal Emulator controlled behavior: -// region = region -// // Start selections -// .on_down(MouseButton::Left, move |event, v: &mut TerminalView, cx| { -// let terminal_view = cx.handle(); -// cx.focus(&terminal_view); -// v.context_menu.update(cx, |menu, _cx| menu.delay_cancel()); -// if let Some(conn_handle) = connection.upgrade() { -// conn_handle.update(cx, |terminal, cx| { -// terminal.mouse_down(&event, origin); - -// cx.notify(); -// }) -// } -// }) -// // Update drag selections -// .on_drag(MouseButton::Left, move |event, _: &mut TerminalView, cx| { -// if event.end { -// return; -// } - -// if cx.is_self_focused() { -// if let Some(conn_handle) = connection.upgrade() { -// conn_handle.update(cx, |terminal, cx| { -// terminal.mouse_drag(event, origin); -// cx.notify(); -// }) -// } -// } -// }) -// // Copy on up behavior -// .on_up( -// MouseButton::Left, -// TerminalElement::generic_button_handler( -// connection, -// origin, -// move |terminal, origin, e, cx| { -// terminal.mouse_up(&e, origin, cx); -// }, -// ), -// ) -// // Context menu -// .on_click( -// MouseButton::Right, -// move |event, view: &mut TerminalView, cx| { -// let mouse_mode = if let Some(conn_handle) = connection.upgrade() { -// conn_handle.update(cx, |terminal, _cx| terminal.mouse_mode(event.shift)) -// } else { -// // If we can't get the model handle, probably can't deploy the context menu -// true -// }; -// if !mouse_mode { -// view.deploy_context_menu(event.position, cx); -// } -// }, -// ) -// .on_move(move |event, _: &mut TerminalView, cx| { -// if cx.is_self_focused() { -// if let Some(conn_handle) = connection.upgrade() { -// conn_handle.update(cx, |terminal, cx| { -// terminal.mouse_move(&event, origin); -// cx.notify(); -// }) -// } -// } -// }) -// .on_scroll(move |event, _: &mut TerminalView, cx| { -// if let Some(conn_handle) = connection.upgrade() { -// conn_handle.update(cx, |terminal, cx| { -// terminal.scroll_wheel(event, origin); -// cx.notify(); -// }) -// } -// }); - -// // Mouse mode handlers: -// // All mouse modes need the extra click handlers -// if mode.intersects(TermMode::MOUSE_MODE) { -// region = region -// .on_down( -// MouseButton::Right, -// TerminalElement::generic_button_handler( -// connection, -// origin, -// move |terminal, origin, e, _cx| { -// terminal.mouse_down(&e, origin); -// }, -// ), -// ) -// .on_down( -// MouseButton::Middle, -// TerminalElement::generic_button_handler( -// connection, -// origin, -// move |terminal, origin, e, _cx| { -// terminal.mouse_down(&e, origin); -// }, -// ), -// ) -// .on_up( -// MouseButton::Right, -// TerminalElement::generic_button_handler( -// connection, -// origin, -// move |terminal, origin, e, cx| { -// terminal.mouse_up(&e, origin, cx); -// }, -// ), -// ) -// .on_up( -// MouseButton::Middle, -// TerminalElement::generic_button_handler( -// connection, -// origin, -// move |terminal, origin, e, cx| { -// terminal.mouse_up(&e, origin, cx); -// }, -// ), -// ) -// } - -// cx.scene().push_mouse_region(region); +// // todo!() +// // let connection = self.terminal; + +// // let mut region = MouseRegion::new::(cx.view_id(), 0, visible_bounds); + +// // // Terminal Emulator controlled behavior: +// // region = region +// // // Start selections +// // .on_down(MouseButton::Left, move |event, v: &mut TerminalView, cx| { +// // let terminal_view = cx.handle(); +// // cx.focus(&terminal_view); +// // v.context_menu.update(cx, |menu, _cx| menu.delay_cancel()); +// // if let Some(conn_handle) = connection.upgrade() { +// // conn_handle.update(cx, |terminal, cx| { +// // terminal.mouse_down(&event, origin); + +// // cx.notify(); +// // }) +// // } +// // }) +// // // Update drag selections +// // .on_drag(MouseButton::Left, move |event, _: &mut TerminalView, cx| { +// // if event.end { +// // return; +// // } + +// // if cx.is_self_focused() { +// // if let Some(conn_handle) = connection.upgrade() { +// // conn_handle.update(cx, |terminal, cx| { +// // terminal.mouse_drag(event, origin); +// // cx.notify(); +// // }) +// // } +// // } +// // }) +// // // Copy on up behavior +// // .on_up( +// // MouseButton::Left, +// // TerminalElement::generic_button_handler( +// // connection, +// // origin, +// // move |terminal, origin, e, cx| { +// // terminal.mouse_up(&e, origin, cx); +// // }, +// // ), +// // ) +// // // Context menu +// // .on_click( +// // MouseButton::Right, +// // move |event, view: &mut TerminalView, cx| { +// // let mouse_mode = if let Some(conn_handle) = connection.upgrade() { +// // conn_handle.update(cx, |terminal, _cx| terminal.mouse_mode(event.shift)) +// // } else { +// // // If we can't get the model handle, probably can't deploy the context menu +// // true +// // }; +// // if !mouse_mode { +// // view.deploy_context_menu(event.position, cx); +// // } +// // }, +// // ) +// // .on_move(move |event, _: &mut TerminalView, cx| { +// // if cx.is_self_focused() { +// // if let Some(conn_handle) = connection.upgrade() { +// // conn_handle.update(cx, |terminal, cx| { +// // terminal.mouse_move(&event, origin); +// // cx.notify(); +// // }) +// // } +// // } +// // }) +// // .on_scroll(move |event, _: &mut TerminalView, cx| { +// // if let Some(conn_handle) = connection.upgrade() { +// // conn_handle.update(cx, |terminal, cx| { +// // terminal.scroll_wheel(event, origin); +// // cx.notify(); +// // }) +// // } +// // }); + +// // // Mouse mode handlers: +// // // All mouse modes need the extra click handlers +// // if mode.intersects(TermMode::MOUSE_MODE) { +// // region = region +// // .on_down( +// // MouseButton::Right, +// // TerminalElement::generic_button_handler( +// // connection, +// // origin, +// // move |terminal, origin, e, _cx| { +// // terminal.mouse_down(&e, origin); +// // }, +// // ), +// // ) +// // .on_down( +// // MouseButton::Middle, +// // TerminalElement::generic_button_handler( +// // connection, +// // origin, +// // move |terminal, origin, e, _cx| { +// // terminal.mouse_down(&e, origin); +// // }, +// // ), +// // ) +// // .on_up( +// // MouseButton::Right, +// // TerminalElement::generic_button_handler( +// // connection, +// // origin, +// // move |terminal, origin, e, cx| { +// // terminal.mouse_up(&e, origin, cx); +// // }, +// // ), +// // ) +// // .on_up( +// // MouseButton::Middle, +// // TerminalElement::generic_button_handler( +// // connection, +// // origin, +// // move |terminal, origin, e, cx| { +// // terminal.mouse_up(&e, origin, cx); +// // }, +// // ), +// // ) +// // } + +// // cx.scene().push_mouse_region(region); // } // } -// impl Element for TerminalElement { -// type ElementState = LayoutState; +// impl Element for TerminalElement { +// type State = LayoutState; // fn layout( // &mut self, -// view_state: &mut TerminalView, -// element_state: Option, -// cx: &mut ViewContext, -// ) -> (LayoutId, Self::ElementState) { +// element_state: Option, +// cx: &mut WindowContext<'_>, +// ) -> (LayoutId, Self::State) { // let settings = ThemeSettings::get_global(cx); // let terminal_settings = TerminalSettings::get_global(cx); @@ -535,7 +537,7 @@ // let link_style = settings.theme.editor.link_definition; // let tooltip_style = settings.theme.tooltip.clone(); -// let font_cache = cx.font_cache(); +// let text_system = cx.text_system(); // let font_size = font_size(&terminal_settings, cx).unwrap_or(settings.buffer_font_size(cx)); // let font_family_name = terminal_settings // .font_family @@ -545,30 +547,37 @@ // .font_features // .as_ref() // .unwrap_or(&settings.buffer_font_features); -// let family_id = font_cache +// let family_id = text_system // .load_family(&[font_family_name], &font_features) // .log_err() // .unwrap_or(settings.buffer_font_family); -// let font_id = font_cache +// let font_id = text_system // .select_font(family_id, &Default::default()) // .unwrap(); // let text_style = TextStyle { // color: settings.theme.editor.text_color, // font_family_id: family_id, -// font_family_name: font_cache.family_name(family_id).unwrap(), +// font_family_name: text_system.family_name(family_id).unwrap(), // font_id, // font_size, // font_properties: Default::default(), // underline: Default::default(), // soft_wrap: false, +// font_family: todo!(), +// font_features: todo!(), +// line_height: todo!(), +// font_weight: todo!(), +// font_style: todo!(), +// background_color: todo!(), +// white_space: todo!(), // }; // let selection_color = settings.theme.editor.selection.selection; // let match_color = settings.theme.search.match_background; // let gutter; // let dimensions = { // let line_height = text_style.font_size * terminal_settings.line_height.value(); -// let cell_width = font_cache.em_advance(text_style.font_id, text_style.font_size); +// let cell_width = text_system.em_advance(text_style.font_id, text_style.font_size); // gutter = cell_width; // let size = constraint.max - point(gutter, 0.); @@ -645,11 +654,11 @@ // cells, // &text_style, // &terminal_theme, -// cx.text_layout_cache(), -// cx.font_cache(), +// &cx.text_system(), // last_hovered_word // .as_ref() // .map(|last_hovered_word| (link_style, &last_hovered_word.word_match)), +// cx, // ); // //Layout cursor. Rectangle is used for IME, so we should lay it out even @@ -667,18 +676,18 @@ // terminal_theme.foreground // }; -// cx.text_layout_cache().layout_str( +// cx.text_system().layout_line( // &str_trxt, // text_style.font_size, // &[( // str_trxt.len(), -// RunStyle { +// TextRun { // font_id: text_style.font_id, // color, // underline: Default::default(), // }, // )], -// ) +// )? // }; // let focused = self.focused; @@ -709,7 +718,7 @@ // //Done! // ( // constraint.max, -// Self::ElementState { +// Self::State { // cells, // cursor, // background_color, @@ -725,93 +734,89 @@ // } // fn paint( -// &mut self, +// self, // bounds: Bounds, -// view_state: &mut TerminalView, -// element_state: &mut Self::ElementState, -// cx: &mut ViewContext, +// element_state: &mut Self::State, +// cx: &mut WindowContext<'_>, // ) { -// let visible_bounds = bounds.intersection(visible_bounds).unwrap_or_default(); - -// //Setup element stuff -// let clip_bounds = Some(visible_bounds); - -// cx.paint_layer(clip_bounds, |cx| { -// let origin = bounds.origin + point(element_state.gutter, 0.); - -// // Elements are ephemeral, only at paint time do we know what could be clicked by a mouse -// self.attach_mouse_handlers(origin, visible_bounds, element_state.mode, cx); - -// cx.scene().push_cursor_region(gpui::CursorRegion { -// bounds, -// style: if element_state.hyperlink_tooltip.is_some() { -// CursorStyle::AlacPointingHand -// } else { -// CursorStyle::IBeam -// }, -// }); - -// cx.paint_layer(clip_bounds, |cx| { -// //Start with a background color -// cx.scene().push_quad(Quad { -// bounds, -// background: Some(element_state.background_color), -// border: Default::default(), -// corner_radii: Default::default(), -// }); - -// for rect in &element_state.rects { -// rect.paint(origin, element_state, view_state, cx); -// } -// }); - -// //Draw Highlighted Backgrounds -// cx.paint_layer(clip_bounds, |cx| { -// for (relative_highlighted_range, color) in -// element_state.relative_highlighted_ranges.iter() -// { -// if let Some((start_y, highlighted_range_lines)) = to_highlighted_range_lines( -// relative_highlighted_range, -// element_state, -// origin, -// ) { -// let hr = HighlightedRange { -// start_y, //Need to change this -// line_height: element_state.size.line_height, -// lines: highlighted_range_lines, -// color: color.clone(), -// //Copied from editor. TODO: move to theme or something -// corner_radius: 0.15 * element_state.size.line_height, -// }; -// hr.paint(bounds, cx); -// } -// } -// }); - -// //Draw the text cells -// cx.paint_layer(clip_bounds, |cx| { -// for cell in &element_state.cells { -// cell.paint(origin, element_state, visible_bounds, view_state, cx); -// } -// }); - -// //Draw cursor -// if self.cursor_visible { -// if let Some(cursor) = &element_state.cursor { -// cx.paint_layer(clip_bounds, |cx| { -// cursor.paint(origin, cx); -// }) -// } -// } - -// if let Some(element) = &mut element_state.hyperlink_tooltip { -// element.paint(origin, visible_bounds, view_state, cx) -// } -// }); -// } - -// fn element_id(&self) -> Option { -// todo!() +// // todo!() +// // let visible_bounds = bounds.intersection(visible_bounds).unwrap_or_default(); + +// // //Setup element stuff +// // let clip_bounds = Some(visible_bounds); + +// // cx.paint_layer(clip_bounds, |cx| { +// // let origin = bounds.origin + point(element_state.gutter, 0.); + +// // // Elements are ephemeral, only at paint time do we know what could be clicked by a mouse +// // self.attach_mouse_handlers(origin, visible_bounds, element_state.mode, cx); + +// // cx.scene().push_cursor_region(gpui::CursorRegion { +// // bounds, +// // style: if element_state.hyperlink_tooltip.is_some() { +// // CursorStyle::AlacPointingHand +// // } else { +// // CursorStyle::IBeam +// // }, +// // }); + +// // cx.paint_layer(clip_bounds, |cx| { +// // //Start with a background color +// // cx.scene().push_quad(Quad { +// // bounds, +// // background: Some(element_state.background_color), +// // border: Default::default(), +// // corner_radii: Default::default(), +// // }); + +// // for rect in &element_state.rects { +// // rect.paint(origin, element_state, view_state, cx); +// // } +// // }); + +// // //Draw Highlighted Backgrounds +// // cx.paint_layer(clip_bounds, |cx| { +// // for (relative_highlighted_range, color) in +// // element_state.relative_highlighted_ranges.iter() +// // { +// // if let Some((start_y, highlighted_range_lines)) = to_highlighted_range_lines( +// // relative_highlighted_range, +// // element_state, +// // origin, +// // ) { +// // let hr = HighlightedRange { +// // start_y, //Need to change this +// // line_height: element_state.size.line_height, +// // lines: highlighted_range_lines, +// // color: color.clone(), +// // //Copied from editor. TODO: move to theme or something +// // corner_radius: 0.15 * element_state.size.line_height, +// // }; +// // hr.paint(bounds, cx); +// // } +// // } +// // }); + +// // //Draw the text cells +// // cx.paint_layer(clip_bounds, |cx| { +// // for cell in &element_state.cells { +// // cell.paint(origin, element_state, visible_bounds, view_state, cx); +// // } +// // }); + +// // //Draw cursor +// // if self.cursor_visible { +// // if let Some(cursor) = &element_state.cursor { +// // cx.paint_layer(clip_bounds, |cx| { +// // cursor.paint(origin, cx); +// // }) +// // } +// // } + +// // if let Some(element) = &mut element_state.hyperlink_tooltip { +// // element.paint(origin, visible_bounds, view_state, cx) +// // } +// // }); // } // // todo!() remove? @@ -822,7 +827,7 @@ // // fn debug( // // &self, // // _: Bounds, -// // _: &Self::ElementState, +// // _: &Self::State, // // _: &Self::PaintState, // // _: &TerminalView, // // _: &gpui::ViewContext, @@ -837,7 +842,7 @@ // // _: Range, // // bounds: Bounds, // // _: Bounds, -// // layout: &Self::ElementState, +// // layout: &Self::State, // // _: &Self::PaintState, // // _: &TerminalView, // // _: &gpui::ViewContext, @@ -855,10 +860,16 @@ // // } // } -// impl Component for TerminalElement { -// fn render(self) -> AnyElement { +// impl IntoElement for TerminalElement { +// type Element = Self; + +// fn element_id(&self) -> Option { // todo!() // } + +// fn into_element(self) -> Self::Element { +// self +// } // } // fn is_blank(cell: &IndexedCell) -> bool { @@ -952,3 +963,8 @@ // .font_size // .map(|size| theme::adjusted_font_size(size, cx)) // } + +// // mappings::colors::convert_color +// fn convert_color(fg: &terminal::alacritty_terminal::ansi::Color, style: &TerminalStyle) -> Hsla { +// todo!() +// }