Implement Editor::single_line

Conrad Irwin created

Change summary

crates/editor2/src/editor.rs  | 25 ++++++++++---------------
crates/editor2/src/element.rs | 17 +++++++++++------
crates/gpui2/src/style.rs     |  4 ++++
3 files changed, 25 insertions(+), 21 deletions(-)

Detailed changes

crates/editor2/src/editor.rs 🔗

@@ -36,10 +36,10 @@ pub use element::{
 use futures::FutureExt;
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
-    actions, div, px, AnyElement, AppContext, BackgroundExecutor, Context, DispatchContext, Div,
-    Element, Entity, EventEmitter, FocusHandle, FontStyle, FontWeight, Hsla, Model, Pixels, Render,
-    Styled, Subscription, Task, TextStyle, View, ViewContext, VisualContext, WeakView,
-    WindowContext,
+    actions, div, px, relative, AnyElement, AppContext, BackgroundExecutor, Context,
+    DispatchContext, Div, Element, Entity, EventEmitter, FocusHandle, FontStyle, FontWeight, Hsla,
+    Model, Pixels, Render, Styled, Subscription, Task, TextStyle, View, ViewContext, VisualContext,
+    WeakView, WindowContext,
 };
 use highlight_matching_bracket::refresh_matching_bracket_highlights;
 use hover_popover::{hide_hover, HoverState};
@@ -593,7 +593,6 @@ pub struct EditorStyle {
     pub background: Hsla,
     pub local_player: PlayerColor,
     pub text: TextStyle,
-    pub line_height_scalar: f32,
     pub scrollbar_width: Pixels,
     pub syntax: Arc<SyntaxTheme>,
     pub diagnostic_style: DiagnosticStyle,
@@ -1795,14 +1794,11 @@ impl InlayHintRefreshReason {
 }
 
 impl Editor {
-    //     pub fn single_line(
-    //         field_editor_style: Option<Arc<GetFieldEditorTheme>>,
-    //         cx: &mut ViewContext<Self>,
-    //     ) -> Self {
-    //         let buffer = cx.build_model(|cx| Buffer::new(0, cx.model_id() as u64, String::new()));
-    //         let buffer = cx.build_model(|cx| MultiBuffer::singleton(buffer, cx));
-    //         Self::new(EditorMode::SingleLine, buffer, None, field_editor_style, cx)
-    //     }
+    pub fn single_line(cx: &mut ViewContext<Self>) -> Self {
+        let buffer = cx.build_model(|cx| Buffer::new(0, cx.entity_id().as_u64(), String::new()));
+        let buffer = cx.build_model(|cx| MultiBuffer::singleton(buffer, cx));
+        Self::new(EditorMode::SingleLine, buffer, None, cx)
+    }
 
     //     pub fn multi_line(
     //         field_editor_style: Option<Arc<GetFieldEditorTheme>>,
@@ -9372,14 +9368,13 @@ impl Render for Editor {
             font_size: settings.buffer_font_size.into(),
             font_weight: FontWeight::NORMAL,
             font_style: FontStyle::Normal,
-            line_height: Default::default(),
+            line_height: relative(settings.buffer_line_height.value()),
             underline: None,
         };
         EditorElement::new(EditorStyle {
             background: cx.theme().colors().editor_background,
             local_player: cx.theme().players().local(),
             text: text_style,
-            line_height_scalar: settings.buffer_line_height.value(),
             scrollbar_width: px(12.),
             syntax: cx.theme().syntax().clone(),
             diagnostic_style: cx.theme().diagnostic_style(),

crates/editor2/src/element.rs 🔗

@@ -8,10 +8,11 @@ use crate::{
 use anyhow::Result;
 use collections::{BTreeMap, HashMap};
 use gpui::{
-    black, hsla, point, px, relative, size, transparent_black, Action, AnyElement, BorrowWindow,
-    Bounds, ContentMask, Corners, DispatchContext, DispatchPhase, Edges, Element, ElementId,
-    Entity, Hsla, KeyDownEvent, KeyListener, KeyMatch, Line, Pixels, ScrollWheelEvent, ShapedGlyph,
-    Size, StatefulInteraction, Style, TextRun, TextStyle, TextSystem, ViewContext, WindowContext,
+    black, hsla, point, px, relative, size, transparent_black, Action, AnyElement,
+    BorrowAppContext, BorrowWindow, Bounds, ContentMask, Corners, DispatchContext, DispatchPhase,
+    Edges, Element, ElementId, Entity, Hsla, KeyDownEvent, KeyListener, KeyMatch, Line, Pixels,
+    ScrollWheelEvent, ShapedGlyph, Size, StatefulInteraction, Style, TextRun, TextStyle,
+    TextSystem, ViewContext, WindowContext,
 };
 use itertools::Itertools;
 use language::language_settings::ShowWhitespaceSetting;
@@ -1605,7 +1606,7 @@ impl EditorElement {
         let style = self.style.clone();
         let font_id = cx.text_system().font_id(&style.text.font()).unwrap();
         let font_size = style.text.font_size.to_pixels(cx.rem_size());
-        let line_height = (font_size * style.line_height_scalar).round();
+        let line_height = style.text.line_height_in_pixels(cx.rem_size());
         let em_width = cx
             .text_system()
             .typographic_bounds(font_id, font_size, 'm')
@@ -2593,7 +2594,11 @@ impl Element<Editor> for EditorElement {
         let rem_size = cx.rem_size();
         let mut style = Style::default();
         style.size.width = relative(1.).into();
-        style.size.height = relative(1.).into();
+        style.size.height = match editor.mode {
+            EditorMode::SingleLine => self.style.text.line_height_in_pixels(cx.rem_size()).into(),
+            EditorMode::AutoHeight { .. } => todo!(),
+            EditorMode::Full => relative(1.).into(),
+        };
         cx.request_layout(&style, None)
     }
 

crates/gpui2/src/style.rs 🔗

@@ -189,6 +189,10 @@ impl TextStyle {
         }
     }
 
+    pub fn line_height_in_pixels(&self, rem_size: Pixels) -> Pixels {
+        self.line_height.to_pixels(self.font_size, rem_size)
+    }
+
     pub fn to_run(&self, len: usize) -> TextRun {
         TextRun {
             len,