@@ -12,7 +12,9 @@ use crate::{
pub use block_map::{BlockMap, BlockPoint};
use collections::{BTreeMap, HashMap, HashSet};
use fold_map::FoldMap;
-use gpui::{Font, FontId, HighlightStyle, Hsla, Line, Model, ModelContext, Pixels, UnderlineStyle};
+use gpui::{
+ Font, FontId, HighlightStyle, Hsla, Line, Model, ModelContext, Pixels, TextRun, UnderlineStyle,
+};
use inlay_map::InlayMap;
use language::{
language_settings::language_settings, OffsetUtf16, Point, Subscription as BufferSubscription,
@@ -21,7 +23,7 @@ use lsp::DiagnosticSeverity;
use std::{any::TypeId, borrow::Cow, fmt::Debug, num::NonZeroU32, ops::Range, sync::Arc};
use sum_tree::{Bias, TreeMap};
use tab_map::TabMap;
-use theme::Theme;
+use theme::{SyntaxTheme, Theme};
use wrap_map::WrapMap;
pub use block_map::{
@@ -505,18 +507,18 @@ impl DisplaySnapshot {
&'a self,
display_rows: Range<u32>,
language_aware: bool,
- theme: &'a Theme,
+ editor_style: &'a EditorStyle,
) -> impl Iterator<Item = HighlightedChunk<'a>> {
self.chunks(
display_rows,
language_aware,
- None, // todo!("add inlay highlight style")
- None, // todo!("add suggestion highlight style")
+ Some(editor_style.syntax.inlay_style),
+ Some(editor_style.syntax.suggestion_style),
)
.map(|chunk| {
let mut highlight_style = chunk
.syntax_highlight_id
- .and_then(|id| id.style(&theme.styles.syntax));
+ .and_then(|id| id.style(&editor_style.syntax));
if let Some(chunk_highlight) = chunk.highlight_style {
if let Some(highlight_style) = highlight_style.as_mut() {
@@ -535,7 +537,8 @@ impl DisplaySnapshot {
if let Some(severity) = chunk.diagnostic_severity {
// Omit underlines for HINT/INFO diagnostics on 'unnecessary' code.
if severity <= DiagnosticSeverity::WARNING || !chunk.is_unnecessary {
- let diagnostic_color = super::diagnostic_style(severity, true, theme);
+ let diagnostic_color =
+ super::diagnostic_style(severity, true, &editor_style.diagnostic_style);
diagnostic_highlight.underline = Some(UnderlineStyle {
color: Some(diagnostic_color),
thickness: 1.0.into(),
@@ -564,53 +567,46 @@ impl DisplaySnapshot {
TextLayoutDetails {
text_system,
editor_style,
+ rem_size,
}: &TextLayoutDetails,
) -> Line {
- todo!()
- // let mut styles = Vec::new();
- // let mut line = String::new();
- // let mut ended_in_newline = false;
-
- // let range = display_row..display_row + 1;
- // for chunk in self.highlighted_chunks(range, false, editor_style) {
- // line.push_str(chunk.chunk);
-
- // let text_style = if let Some(style) = chunk.style {
- // editor_style
- // .text
- // .clone()
- // .highlight(style, text_system)
- // .map(Cow::Owned)
- // .unwrap_or_else(|_| Cow::Borrowed(&editor_style.text))
- // } else {
- // Cow::Borrowed(&editor_style.text)
- // };
- // ended_in_newline = chunk.chunk.ends_with("\n");
-
- // styles.push(
- // todo!(), // len: chunk.chunk.len(),
- // // font_id: text_style.font_id,
- // // color: text_style.color,
- // // underline: text_style.underline,
- // );
- // }
-
- // // our pixel positioning logic assumes each line ends in \n,
- // // this is almost always true except for the last line which
- // // may have no trailing newline.
- // if !ended_in_newline && display_row == self.max_point().row() {
- // line.push_str("\n");
-
- // todo!();
- // // styles.push(RunStyle {
- // // len: "\n".len(),
- // // font_id: editor_style.text.font_id,
- // // color: editor_style.text_color,
- // // underline: editor_style.text.underline,
- // // });
- // }
-
- // text_system.layout_text(&line, editor_style.text.font_size, &styles, None)
+ let mut runs = Vec::new();
+ let mut line = String::new();
+ let mut ended_in_newline = false;
+
+ let range = display_row..display_row + 1;
+ for chunk in self.highlighted_chunks(range, false, &editor_style) {
+ line.push_str(chunk.chunk);
+
+ let text_style = if let Some(style) = chunk.style {
+ editor_style
+ .text
+ .clone()
+ .highlight(style)
+ .map(Cow::Owned)
+ .unwrap_or_else(|_| Cow::Borrowed(&editor_style.text))
+ } else {
+ Cow::Borrowed(&editor_style.text)
+ };
+ ended_in_newline = chunk.chunk.ends_with("\n");
+
+ runs.push(text_style.to_run(chunk.chunk.len()))
+ }
+
+ // our pixel positioning logic assumes each line ends in \n,
+ // this is almost always true except for the last line which
+ // may have no trailing newline.
+ if !ended_in_newline && display_row == self.max_point().row() {
+ line.push_str("\n");
+ runs.push(editor_style.text.to_run("\n".len()));
+ }
+
+ let font_size = editor_style.text.font_size.to_pixels(*rem_size);
+ text_system
+ .layout_text(&line, font_size, &runs, None)
+ .unwrap()
+ .pop()
+ .unwrap()
}
pub fn x_for_point(
@@ -36,9 +36,10 @@ pub use element::{
use futures::FutureExt;
use fuzzy::{StringMatch, StringMatchCandidate};
use gpui::{
- 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, 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};
@@ -82,7 +83,9 @@ use std::{
pub use sum_tree::Bias;
use sum_tree::TreeMap;
use text::Rope;
-use theme::{ActiveTheme, PlayerColor, Theme, ThemeColors, ThemeSettings};
+use theme::{
+ ActiveTheme, DiagnosticStyle, PlayerColor, SyntaxTheme, Theme, ThemeColors, ThemeSettings,
+};
use util::{post_inc, RangeExt, ResultExt, TryFutureExt};
use workspace::{ItemNavHistory, SplitDirection, ViewId, Workspace};
@@ -257,118 +260,115 @@ impl InlayId {
}
}
-// actions!(
-// editor,
-// [
-// Cancel,
-// Backspace,
-// Delete,
-// Newline,
-// NewlineAbove,
-// NewlineBelow,
-// GoToDiagnostic,
-// GoToPrevDiagnostic,
-// GoToHunk,
-// GoToPrevHunk,
-// Indent,
-// Outdent,
-// DeleteLine,
-// DeleteToPreviousWordStart,
-// DeleteToPreviousSubwordStart,
-// DeleteToNextWordEnd,
-// DeleteToNextSubwordEnd,
-// DeleteToBeginningOfLine,
-// DeleteToEndOfLine,
-// CutToEndOfLine,
-// DuplicateLine,
-// MoveLineUp,
-// MoveLineDown,
-// JoinLines,
-// SortLinesCaseSensitive,
-// SortLinesCaseInsensitive,
-// ReverseLines,
-// ShuffleLines,
-// ConvertToUpperCase,
-// ConvertToLowerCase,
-// ConvertToTitleCase,
-// ConvertToSnakeCase,
-// ConvertToKebabCase,
-// ConvertToUpperCamelCase,
-// ConvertToLowerCamelCase,
-// Transpose,
-// Cut,
-// Copy,
-// Paste,
-// Undo,
-// Redo,
-// MoveUp,
-// PageUp,
-// MoveDown,
-// PageDown,
-// MoveLeft,
-// MoveRight,
-// MoveToPreviousWordStart,
-// MoveToPreviousSubwordStart,
-// MoveToNextWordEnd,
-// MoveToNextSubwordEnd,
-// MoveToBeginningOfLine,
-// MoveToEndOfLine,
-// MoveToStartOfParagraph,
-// MoveToEndOfParagraph,
-// MoveToBeginning,
-// MoveToEnd,
-// SelectUp,
-// SelectDown,
-// SelectLeft,
-// SelectRight,
-// SelectToPreviousWordStart,
-// SelectToPreviousSubwordStart,
-// SelectToNextWordEnd,
-// SelectToNextSubwordEnd,
-// SelectToStartOfParagraph,
-// SelectToEndOfParagraph,
-// SelectToBeginning,
-// SelectToEnd,
-// SelectAll,
-// SelectLine,
-// SplitSelectionIntoLines,
-// AddSelectionAbove,
-// AddSelectionBelow,
-// Tab,
-// TabPrev,
-// ShowCharacterPalette,
-// SelectLargerSyntaxNode,
-// SelectSmallerSyntaxNode,
-// GoToDefinition,
-// GoToDefinitionSplit,
-// GoToTypeDefinition,
-// GoToTypeDefinitionSplit,
-// MoveToEnclosingBracket,
-// UndoSelection,
-// RedoSelection,
-// FindAllReferences,
-// Rename,
-// ConfirmRename,
-// Fold,
-// UnfoldLines,
-// FoldSelectedRanges,
-// ShowCompletions,
-// OpenExcerpts,
-// RestartLanguageServer,
-// Hover,
-// Format,
-// ToggleSoftWrap,
-// ToggleInlayHints,
-// RevealInFinder,
-// CopyPath,
-// CopyRelativePath,
-// CopyHighlightJson,
-// ContextMenuFirst,
-// ContextMenuPrev,
-// ContextMenuNext,
-// ContextMenuLast,
-// ]
-// );
+actions!(
+ Cancel,
+ Backspace,
+ Delete,
+ Newline,
+ NewlineAbove,
+ NewlineBelow,
+ GoToDiagnostic,
+ GoToPrevDiagnostic,
+ GoToHunk,
+ GoToPrevHunk,
+ Indent,
+ Outdent,
+ DeleteLine,
+ DeleteToPreviousWordStart,
+ DeleteToPreviousSubwordStart,
+ DeleteToNextWordEnd,
+ DeleteToNextSubwordEnd,
+ DeleteToBeginningOfLine,
+ DeleteToEndOfLine,
+ CutToEndOfLine,
+ DuplicateLine,
+ MoveLineUp,
+ MoveLineDown,
+ JoinLines,
+ SortLinesCaseSensitive,
+ SortLinesCaseInsensitive,
+ ReverseLines,
+ ShuffleLines,
+ ConvertToUpperCase,
+ ConvertToLowerCase,
+ ConvertToTitleCase,
+ ConvertToSnakeCase,
+ ConvertToKebabCase,
+ ConvertToUpperCamelCase,
+ ConvertToLowerCamelCase,
+ Transpose,
+ Cut,
+ Copy,
+ Paste,
+ Undo,
+ Redo,
+ MoveUp,
+ PageUp,
+ MoveDown,
+ PageDown,
+ MoveLeft,
+ MoveRight,
+ MoveToPreviousWordStart,
+ MoveToPreviousSubwordStart,
+ MoveToNextWordEnd,
+ MoveToNextSubwordEnd,
+ MoveToBeginningOfLine,
+ MoveToEndOfLine,
+ MoveToStartOfParagraph,
+ MoveToEndOfParagraph,
+ MoveToBeginning,
+ MoveToEnd,
+ SelectUp,
+ SelectDown,
+ SelectLeft,
+ SelectRight,
+ SelectToPreviousWordStart,
+ SelectToPreviousSubwordStart,
+ SelectToNextWordEnd,
+ SelectToNextSubwordEnd,
+ SelectToStartOfParagraph,
+ SelectToEndOfParagraph,
+ SelectToBeginning,
+ SelectToEnd,
+ SelectAll,
+ SelectLine,
+ SplitSelectionIntoLines,
+ AddSelectionAbove,
+ AddSelectionBelow,
+ Tab,
+ TabPrev,
+ ShowCharacterPalette,
+ SelectLargerSyntaxNode,
+ SelectSmallerSyntaxNode,
+ GoToDefinition,
+ GoToDefinitionSplit,
+ GoToTypeDefinition,
+ GoToTypeDefinitionSplit,
+ MoveToEnclosingBracket,
+ UndoSelection,
+ RedoSelection,
+ FindAllReferences,
+ Rename,
+ ConfirmRename,
+ Fold,
+ UnfoldLines,
+ FoldSelectedRanges,
+ ShowCompletions,
+ OpenExcerpts,
+ RestartLanguageServer,
+ Hover,
+ Format,
+ ToggleSoftWrap,
+ ToggleInlayHints,
+ RevealInFinder,
+ CopyPath,
+ CopyRelativePath,
+ CopyHighlightJson,
+ ContextMenuFirst,
+ ContextMenuPrev,
+ ContextMenuNext,
+ ContextMenuLast,
+);
// impl_actions!(
// editor,
@@ -390,26 +390,6 @@ impl InlayId {
// ]
// );
-// todo!(revisit these actions)
-pub struct ShowCompletions;
-pub struct Rename;
-pub struct GoToDefinition;
-pub struct GoToTypeDefinition;
-pub struct GoToDefinitionSplit;
-pub struct GoToTypeDefinitionSplit;
-
-#[derive(PartialEq, Clone, Default, Deserialize)]
-pub struct MoveLeft;
-
-#[derive(PartialEq, Clone, Default, Deserialize)]
-pub struct MoveRight;
-
-#[derive(PartialEq, Clone, Default, Deserialize)]
-pub struct MoveDown;
-
-#[derive(PartialEq, Clone, Default, Deserialize)]
-pub struct MoveUp;
-
enum DocumentHighlightRead {}
enum DocumentHighlightWrite {}
enum InputComposition {}
@@ -615,6 +595,8 @@ pub struct EditorStyle {
pub text: TextStyle,
pub line_height_scalar: f32,
pub scrollbar_width: Pixels,
+ pub syntax: Arc<SyntaxTheme>,
+ pub diagnostic_style: DiagnosticStyle,
}
type CompletionId = usize;
@@ -3543,6 +3525,7 @@ impl Editor {
TextLayoutDetails {
text_system: cx.text_system().clone(),
editor_style: self.style.clone().unwrap(),
+ rem_size: cx.rem_size(),
}
}
@@ -5862,7 +5845,6 @@ impl Editor {
// }
pub fn move_down(&mut self, _: &MoveDown, cx: &mut ViewContext<Self>) {
- dbg!("move_down");
self.take_rename(true, cx);
if self.mode == EditorMode::SingleLine {
@@ -9399,6 +9381,8 @@ impl Render for Editor {
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(),
})
}
}
@@ -9982,17 +9966,21 @@ pub fn highlight_diagnostic_message(
(message_without_backticks, highlights)
}
-pub fn diagnostic_style(severity: DiagnosticSeverity, valid: bool, theme: &Theme) -> Hsla {
+pub fn diagnostic_style(
+ severity: DiagnosticSeverity,
+ valid: bool,
+ style: &DiagnosticStyle,
+) -> Hsla {
match (severity, valid) {
- (DiagnosticSeverity::ERROR, true) => theme.status().error,
- (DiagnosticSeverity::ERROR, false) => theme.status().error,
- (DiagnosticSeverity::WARNING, true) => theme.status().warning,
- (DiagnosticSeverity::WARNING, false) => theme.status().warning,
- (DiagnosticSeverity::INFORMATION, true) => theme.status().info,
- (DiagnosticSeverity::INFORMATION, false) => theme.status().info,
- (DiagnosticSeverity::HINT, true) => theme.status().info,
- (DiagnosticSeverity::HINT, false) => theme.status().info,
- _ => theme.status().ignored,
+ (DiagnosticSeverity::ERROR, true) => style.error,
+ (DiagnosticSeverity::ERROR, false) => style.error,
+ (DiagnosticSeverity::WARNING, true) => style.warning,
+ (DiagnosticSeverity::WARNING, false) => style.warning,
+ (DiagnosticSeverity::INFORMATION, true) => style.info,
+ (DiagnosticSeverity::INFORMATION, false) => style.info,
+ (DiagnosticSeverity::HINT, true) => style.info,
+ (DiagnosticSeverity::HINT, false) => style.info,
+ _ => style.ignored,
}
}