Detailed changes
@@ -44,7 +44,7 @@ use gpui::{
EventEmitter, FocusHandle, FocusableView, FontFeatures, FontStyle, FontWeight, HighlightStyle,
Hsla, InputHandler, KeyContext, Model, MouseButton, ParentElement, Pixels, Render,
SharedString, Styled, Subscription, Task, TextStyle, UniformListScrollHandle, View,
- ViewContext, VisualContext, WeakView, WindowContext,
+ ViewContext, VisualContext, WeakView, WhiteSpace, WindowContext,
};
use highlight_matching_bracket::refresh_matching_bracket_highlights;
use hover_popover::{hide_hover, HoverState};
@@ -1358,9 +1358,11 @@ impl CompletionsMenu {
//
div()
.id(mat.candidate_id)
+ .whitespace_nowrap()
+ .overflow_hidden()
.bg(gpui::green())
.hover(|style| style.bg(gpui::blue()))
- .when(item_ix == selected_item, |div| div.bg(gpui::blue()))
+ .when(item_ix == selected_item, |div| div.bg(gpui::red()))
.child(SharedString::from(completion.label.text.clone()))
.min_w(px(300.))
.max_w(px(700.))
@@ -9396,6 +9398,7 @@ impl Render for Editor {
font_style: FontStyle::Normal,
line_height: relative(1.).into(),
underline: None,
+ white_space: WhiteSpace::Normal,
},
EditorMode::AutoHeight { max_lines } => todo!(),
@@ -9409,6 +9412,7 @@ impl Render for Editor {
font_style: FontStyle::Normal,
line_height: relative(settings.buffer_line_height.value()),
underline: None,
+ white_space: WhiteSpace::Normal,
},
};
@@ -1,6 +1,6 @@
use crate::{
Bounds, Element, ElementId, LayoutId, Pixels, RenderOnce, SharedString, Size, TextRun,
- WindowContext, WrappedLine,
+ WhiteSpace, WindowContext, WrappedLine,
};
use anyhow::anyhow;
use parking_lot::{Mutex, MutexGuard};
@@ -159,10 +159,14 @@ impl TextState {
let element_state = self.clone();
move |known_dimensions, available_space| {
- let wrap_width = known_dimensions.width.or(match available_space.width {
- crate::AvailableSpace::Definite(x) => Some(x),
- _ => None,
- });
+ let wrap_width = if text_style.white_space == WhiteSpace::Normal {
+ known_dimensions.width.or(match available_space.width {
+ crate::AvailableSpace::Definite(x) => Some(x),
+ _ => None,
+ })
+ } else {
+ None
+ };
if let Some(text_state) = element_state.0.lock().as_ref() {
if text_state.size.is_some()
@@ -128,6 +128,13 @@ pub struct BoxShadow {
pub spread_radius: Pixels,
}
+#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
+pub enum WhiteSpace {
+ #[default]
+ Normal,
+ Nowrap,
+}
+
#[derive(Refineable, Clone, Debug)]
#[refineable(Debug)]
pub struct TextStyle {
@@ -139,6 +146,7 @@ pub struct TextStyle {
pub font_weight: FontWeight,
pub font_style: FontStyle,
pub underline: Option<UnderlineStyle>,
+ pub white_space: WhiteSpace,
}
impl Default for TextStyle {
@@ -152,6 +160,7 @@ impl Default for TextStyle {
font_weight: FontWeight::default(),
font_style: FontStyle::default(),
underline: None,
+ white_space: WhiteSpace::Normal,
}
}
}
@@ -1,7 +1,7 @@
use crate::{
self as gpui, hsla, point, px, relative, rems, AbsoluteLength, AlignItems, CursorStyle,
DefiniteLength, Display, Fill, FlexDirection, Hsla, JustifyContent, Length, Position,
- SharedString, StyleRefinement, Visibility,
+ SharedString, StyleRefinement, Visibility, WhiteSpace,
};
use crate::{BoxShadow, TextStyleRefinement};
use smallvec::{smallvec, SmallVec};
@@ -101,6 +101,24 @@ pub trait Styled: Sized {
self
}
+ /// Sets the whitespace of the element to `normal`.
+ /// [Docs](https://tailwindcss.com/docs/whitespace#normal)
+ fn whitespace_normal(mut self) -> Self {
+ self.text_style()
+ .get_or_insert_with(Default::default)
+ .white_space = Some(WhiteSpace::Normal);
+ self
+ }
+
+ /// Sets the whitespace of the element to `nowrap`.
+ /// [Docs](https://tailwindcss.com/docs/whitespace#nowrap)
+ fn whitespace_nowrap(mut self) -> Self {
+ self.text_style()
+ .get_or_insert_with(Default::default)
+ .white_space = Some(WhiteSpace::Nowrap);
+ self
+ }
+
/// Sets the flex direction of the element to `column`.
/// [Docs](https://tailwindcss.com/docs/flex-direction#column)
fn flex_col(mut self) -> Self {