feat: add bar element margins and space LSP indicators
This commit is contained in:
+20
-25
@@ -106,6 +106,7 @@ pub struct ChromeLine {
|
||||
pub struct SegmentConfig {
|
||||
pub title: String,
|
||||
pub padding: usize,
|
||||
pub margin: usize,
|
||||
pub leading_edge: String,
|
||||
pub trailing_edge: String,
|
||||
pub first_leading_edge: Option<String>,
|
||||
@@ -116,6 +117,7 @@ impl Default for SegmentConfig {
|
||||
Self {
|
||||
title: String::new(),
|
||||
padding: 1,
|
||||
margin: 0,
|
||||
leading_edge: String::new(),
|
||||
trailing_edge: String::new(),
|
||||
first_leading_edge: None,
|
||||
@@ -167,10 +169,12 @@ impl ChromeLine {
|
||||
validate_name(name)?;
|
||||
}
|
||||
for (name, segment) in &self.segments {
|
||||
if segment.padding > 64 {
|
||||
return Err(format!(
|
||||
"Chrome segment {name:?} padding must be between 0 and 64"
|
||||
));
|
||||
for (option, value) in [("padding", segment.padding), ("margin", segment.margin)] {
|
||||
if value > 64 {
|
||||
return Err(format!(
|
||||
"Chrome segment {name:?} {option} must be between 0 and 64"
|
||||
));
|
||||
}
|
||||
}
|
||||
for (option, text) in [
|
||||
("title", Some(&segment.title)),
|
||||
@@ -198,6 +202,9 @@ impl ChromeLine {
|
||||
|
||||
fn default_segment(name: &str) -> SegmentConfig {
|
||||
let mut segment = SegmentConfig::default();
|
||||
if name == "lsp" {
|
||||
segment.margin = 1;
|
||||
}
|
||||
if matches!(name, "tabs" | "position" | "battery") {
|
||||
segment.leading_edge = "░▓".into();
|
||||
}
|
||||
@@ -258,6 +265,7 @@ struct LineOptions {
|
||||
struct SegmentOptions {
|
||||
title: Option<String>,
|
||||
padding: Option<usize>,
|
||||
margin: Option<usize>,
|
||||
leading_edge: Option<String>,
|
||||
trailing_edge: Option<String>,
|
||||
first_leading_edge: Option<String>,
|
||||
@@ -304,6 +312,9 @@ fn deserialize_line<'de, D: Deserializer<'de>>(
|
||||
if let Some(padding) = options.padding {
|
||||
segment.padding = padding;
|
||||
}
|
||||
if let Some(margin) = options.margin {
|
||||
segment.margin = margin;
|
||||
}
|
||||
if let Some(edge) = options.leading_edge {
|
||||
segment.leading_edge = edge;
|
||||
}
|
||||
@@ -402,27 +413,6 @@ mod tests {
|
||||
bottom: ChromeLine,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn bottom_keeps_metadata_on_the_right_without_filled_styles() {
|
||||
let line = ChromeLine::bottom();
|
||||
assert_eq!(
|
||||
line.left,
|
||||
[
|
||||
"mode",
|
||||
"pending",
|
||||
"buffer",
|
||||
"diagnostics",
|
||||
"path",
|
||||
"selections",
|
||||
"count"
|
||||
]
|
||||
);
|
||||
assert_eq!(line.right, ["language", "lsp", "position"]);
|
||||
for name in ["language", "lsp"] {
|
||||
assert_eq!(line.segment(name), &SegmentConfig::default());
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn omitted_options_inherit_and_explicit_groups_replace_defaults() {
|
||||
let lines: Lines = serde_json::from_value(serde_json::json!({
|
||||
@@ -521,6 +511,11 @@ mod tests {
|
||||
serde_json::json!({"left": null}),
|
||||
serde_json::json!({"tabs": {"padding": 65}}),
|
||||
serde_json::json!({"tabs": {"padding": null}}),
|
||||
serde_json::json!({"tabs": {"margin": 65}}),
|
||||
serde_json::json!({"tabs": {"margin": -1}}),
|
||||
serde_json::json!({"tabs": {"margin": null}}),
|
||||
serde_json::json!({"tabs": {"margin": "1"}}),
|
||||
serde_json::json!({"tabs": {"margin": 1.5}}),
|
||||
serde_json::json!({"tabs": {"leading_edge": "\n"}}),
|
||||
serde_json::json!({"tabs": {"title": "{unknown}"}}),
|
||||
serde_json::json!({"tabs": {"title": "{name"}}),
|
||||
|
||||
Reference in New Issue
Block a user