feat: statusline element style

pull/13666/head
Erasin 2025-05-31 19:03:50 +08:00
parent 2baff46b25
commit 2773bb0fa7
2 changed files with 51 additions and 6 deletions

View File

@ -68,6 +68,7 @@ pub fn render(context: &mut RenderContext, viewport: Rect, surface: &mut Surface
for element_id in &config.statusline.left { for element_id in &config.statusline.left {
let render = get_render_function(*element_id); let render = get_render_function(*element_id);
(render)(context, |context, span| { (render)(context, |context, span| {
let base_style = statusline_style(context, &element_id.to_string());
append(&mut context.parts.left, span, base_style) append(&mut context.parts.left, span, base_style)
}); });
} }
@ -84,6 +85,7 @@ pub fn render(context: &mut RenderContext, viewport: Rect, surface: &mut Surface
for element_id in &config.statusline.right { for element_id in &config.statusline.right {
let render = get_render_function(*element_id); let render = get_render_function(*element_id);
(render)(context, |context, span| { (render)(context, |context, span| {
let base_style = statusline_style(context, &element_id.to_string());
append(&mut context.parts.right, span, base_style) append(&mut context.parts.right, span, base_style)
}) })
} }
@ -103,6 +105,7 @@ pub fn render(context: &mut RenderContext, viewport: Rect, surface: &mut Surface
for element_id in &config.statusline.center { for element_id in &config.statusline.center {
let render = get_render_function(*element_id); let render = get_render_function(*element_id);
(render)(context, |context, span| { (render)(context, |context, span| {
let base_style = statusline_style(context, &element_id.to_string());
append(&mut context.parts.center, span, base_style) append(&mut context.parts.center, span, base_style)
}) })
} }
@ -161,6 +164,18 @@ where
} }
} }
fn statusline_style(context: &RenderContext, scope: &str) -> Style {
let scope = format!("ui.statusline.{scope}");
let visible = context.focused;
let config = context.editor.config();
if visible && config.color_modes {
context.editor.theme.get(&scope)
} else {
Style::default()
}
}
fn render_mode<'a, F>(context: &mut RenderContext<'a>, write: F) fn render_mode<'a, F>(context: &mut RenderContext<'a>, write: F)
where where
F: Fn(&mut RenderContext<'a>, Span<'a>) + Copy, F: Fn(&mut RenderContext<'a>, Span<'a>) + Copy,
@ -522,10 +537,9 @@ fn render_separator<'a, F>(context: &mut RenderContext<'a>, write: F)
where where
F: Fn(&mut RenderContext<'a>, Span<'a>) + Copy, F: Fn(&mut RenderContext<'a>, Span<'a>) + Copy,
{ {
let sep = &context.editor.config().statusline.separator; let sep = context.editor.config().statusline.separator.clone();
let style = context.editor.theme.get("ui.statusline.separator");
write(context, Span::styled(sep.to_string(), style)); write(context, sep.into());
} }
fn render_spacer<'a, F>(context: &mut RenderContext<'a>, write: F) fn render_spacer<'a, F>(context: &mut RenderContext<'a>, write: F)
@ -561,11 +575,10 @@ fn render_file_indent_style<'a, F>(context: &mut RenderContext<'a>, write: F)
where where
F: Fn(&mut RenderContext<'a>, Span<'a>) + Copy, F: Fn(&mut RenderContext<'a>, Span<'a>) + Copy,
{ {
let style = context.doc.indent_style; let indent_style = context.doc.indent_style;
write( write(
context, context,
match style { match indent_style {
IndentStyle::Tabs => " tabs ".into(), IndentStyle::Tabs => " tabs ".into(),
IndentStyle::Spaces(indent) => { IndentStyle::Spaces(indent) => {
format!(" {} space{} ", indent, if indent == 1 { "" } else { "s" }).into() format!(" {} space{} ", indent, if indent == 1 { "" } else { "s" }).into()

View File

@ -27,6 +27,7 @@ use std::{
borrow::Cow, borrow::Cow,
cell::Cell, cell::Cell,
collections::{BTreeMap, HashMap, HashSet}, collections::{BTreeMap, HashMap, HashSet},
fmt::Display,
fs, fs,
io::{self, stdin}, io::{self, stdin},
num::NonZeroUsize, num::NonZeroUsize,
@ -620,6 +621,37 @@ pub enum StatusLineElement {
Register, Register,
} }
impl Display for StatusLineElement {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use StatusLineElement::*;
let element = match self {
Mode => "mode",
Spinner => "spinner",
FileBaseName => "file-base-name",
FileName => "file-name",
FileAbsolutePath => "file-absolute-path",
FileModificationIndicator => "file-modification-indicator",
ReadOnlyIndicator => "read-only-indicator",
FileEncoding => "file-encoding",
FileLineEnding => "file-line-ending",
FileIndentStyle => "file-indent-style",
FileType => "file-type",
Diagnostics => "diagnostics",
WorkspaceDiagnostics => "workspace-diagnostics",
Selections => "selections",
PrimarySelectionLength => "primary-selection-length",
Position => "position",
Separator => "separator",
PositionPercentage => "position-percentage",
TotalLineNumbers => "total-line-numbers",
Spacer => "spacer",
VersionControl => "version-control",
Register => "register",
};
write!(f, "{element}")
}
}
// Cursor shape is read and used on every rendered frame and so needs // Cursor shape is read and used on every rendered frame and so needs
// to be fast. Therefore we avoid a hashmap and use an enum indexed array. // to be fast. Therefore we avoid a hashmap and use an enum indexed array.
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]