feat: show live battery charge by default

This commit is contained in:
Valdemar Lorenzen
2026-10-12 12:02:10 +02:00
parent 0d3fbc01f8
commit 8c6a050171
11 changed files with 746 additions and 41 deletions
+69 -24
View File
@@ -1173,6 +1173,7 @@ fn chrome_items<'a>(
} else {
String::new()
}),
"battery" if editor.label(name).is_empty() => Cow::Borrowed(editor.battery_label()),
_ => Cow::Borrowed(editor.label(name)),
};
// Empty values remain hidden even when a title or decoration is configured.
@@ -5463,22 +5464,6 @@ mod tests {
.unwrap();
}
fn battery_chrome(editor: &mut Editor) {
configure_chrome(editor, |top, _| {
top.right = vec!["battery".into()];
top.segments.insert(
"battery".into(),
SegmentConfig {
title: String::new(),
padding: 1,
leading_edge: "░▒▓".into(),
trailing_edge: String::new(),
first_leading_edge: None,
},
);
});
}
#[test]
fn tab_titles_update_templates_without_reinterpreting_file_names() {
let directory = Directory::new();
@@ -6126,8 +6111,7 @@ mod tests {
"edit {}",
directory.file("active.txt", "ACTIVE").display()
));
battery_chrome(&mut editor);
editor.set_label("battery".into(), "status".into()).unwrap();
editor.set_battery_charge(Some(27));
let mut views = BufferViewports::default();
for (width, height) in [(12, 9), (7, 9), (1, 9), (0, 9), (12, 1), (12, 0)] {
let mut terminal =
@@ -6138,7 +6122,7 @@ mod tests {
if width > 0 && height >= 3 {
let title = pane_screen(&terminal, Rect::new(0, 0, width, 1));
assert!(title.trim_start().starts_with('3'), "{title}");
assert!(!title.contains("status"), "{title}");
assert!(!title.contains("bat 27%"), "{title}");
}
if width > 0 && height == 1 {
let (_, viewport) = views.document.geometry.unwrap();
@@ -6159,11 +6143,10 @@ mod tests {
}
#[test]
fn singleton_custom_value_sanitizes_unicode_and_redraws_through_clear() {
fn default_native_battery_and_custom_override_redraw_through_clear() {
let directory = Directory::new();
let mut editor =
Editor::open(Some(directory.file("source.txt", "DOCUMENT")), vec![]).unwrap();
battery_chrome(&mut editor);
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(80, 12)).unwrap();
let mut views = BufferViewports::default();
terminal
@@ -6171,6 +6154,15 @@ mod tests {
.unwrap();
let original = screen_text(&terminal);
assert_eq!(views.document.geometry.unwrap().1.y, 0);
assert_eq!(editor.tab_count(), 1);
assert!(!screen_text(&terminal).contains("bat "));
assert!(editor.set_battery_charge(Some(27)));
terminal
.draw(|frame| views.draw(frame, &mut editor))
.unwrap();
let title = pane_screen(&terminal, Rect::new(0, 0, 80, 1));
assert!(title.ends_with("░▒▓ bat 27% "), "{title}");
assert_eq!(views.document.geometry.unwrap().1.y, 1);
editor
.set_label("battery".into(), "電池 e\u{301}\t90%".into())
@@ -6182,6 +6174,7 @@ mod tests {
assert!(title.contains("1 source.txt"), "{title}");
assert!(title.contains("電") && title.contains("池"), "{title}");
assert!(title.contains("e\u{301}�90%"), "{title}");
assert!(!title.contains("bat 27%"), "{title}");
let start = 80 - (editor.label("battery").width() + 5) as u16;
let buffer = terminal.backend().buffer();
for (offset, glyph) in [(0, "░"), (1, "▒"), (2, "▓"), (3, " ")] {
@@ -6194,12 +6187,21 @@ mod tests {
assert!(terminal.get_cursor_position().unwrap().y >= 1);
editor.set_label("battery".into(), "live".into()).unwrap();
assert!(editor.set_battery_charge(Some(28)));
terminal
.draw(|frame| views.draw(frame, &mut editor))
.unwrap();
assert!(pane_screen(&terminal, Rect::new(0, 0, 80, 1)).ends_with("░▒▓ live "));
assert!(!screen_text(&terminal).contains("90%"));
editor.set_label("battery".into(), String::new()).unwrap();
terminal
.draw(|frame| views.draw(frame, &mut editor))
.unwrap();
let title = pane_screen(&terminal, Rect::new(0, 0, 80, 1));
assert!(title.ends_with("░▒▓ bat 28% "), "{title}");
assert!(!title.contains("live"), "{title}");
assert_eq!(views.document.geometry.unwrap().1.y, 1);
assert!(editor.set_battery_charge(None));
terminal
.draw(|frame| views.draw(frame, &mut editor))
.unwrap();
@@ -6207,6 +6209,52 @@ mod tests {
assert_eq!(screen_text(&terminal), original);
}
#[test]
fn native_battery_renders_at_each_configured_anchor_in_either_bar() {
let mut editor = Editor::open(None, vec![]).unwrap();
editor.set_battery_charge(Some(27));
for at_top in [true, false] {
for anchor in 0..3 {
configure_chrome(&mut editor, |top, bottom| {
for line in [&mut *top, &mut *bottom] {
line.left.clear();
line.center.clear();
line.right.clear();
}
let line = if at_top { top } else { bottom };
[&mut line.left, &mut line.center, &mut line.right][anchor]
.push("battery".into());
});
let mut terminal =
Terminal::new(ratatui::backend::TestBackend::new(48, 6)).unwrap();
terminal
.draw(|frame| {
draw_bars(frame, &editor, frame.area(), &mut SyntaxCache::new());
})
.unwrap();
let y = if at_top { 0 } else { 4 };
let row = pane_screen(&terminal, Rect::new(0, y, 48, 1));
assert_eq!(row.trim(), "░▒▓ bat 27%");
let x = [0, 18, 36][anchor];
assert_eq!(terminal.backend().buffer()[(x, y)].symbol(), "░");
}
}
configure_chrome(&mut editor, |top, bottom| {
top.right.clear();
bottom.right.clear();
});
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(48, 6)).unwrap();
terminal
.draw(|frame| {
let [workspace, _] =
draw_bars(frame, &editor, frame.area(), &mut SyntaxCache::new());
assert_eq!(workspace.y, 0);
assert_eq!(workspace.height, 5);
})
.unwrap();
assert!(!screen_text(&terminal).contains("bat 27%"));
}
#[test]
fn custom_value_keeps_a_gap_and_yields_to_the_full_active_title() {
let directory = Directory::new();
@@ -6221,7 +6269,6 @@ mod tests {
"edit {}",
directory.file("active.txt", "ACTIVE").display()
));
battery_chrome(&mut editor);
editor.set_label("battery".into(), "90%".into()).unwrap();
for width in [28, 29, 80] {
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(width, 2)).unwrap();
@@ -6267,7 +6314,6 @@ mod tests {
let directory = Directory::new();
let mut editor =
Editor::open(Some(directory.file("source.txt", "DOCUMENT")), vec![]).unwrap();
battery_chrome(&mut editor);
editor.execute("pane.split_vertical");
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(120, 30)).unwrap();
let mut views = BufferViewports::default();
@@ -6295,7 +6341,6 @@ mod tests {
assert_eq!(pane_screen(&terminal, Rect::new(0, 0, 120, 1)), title);
let mut editor = readonly_diff_editor(deletion_file());
battery_chrome(&mut editor);
terminal
.draw(|frame| views.draw(frame, &mut editor))
.unwrap();