diff options
Diffstat (limited to 'helix-view/src/info.rs')
-rw-r--r-- | helix-view/src/info.rs | 65 |
1 files changed, 46 insertions, 19 deletions
diff --git a/helix-view/src/info.rs b/helix-view/src/info.rs index b5a002fa..5ad6a60c 100644 --- a/helix-view/src/info.rs +++ b/helix-view/src/info.rs @@ -1,5 +1,5 @@ use crate::input::KeyEvent; -use helix_core::unicode::width::UnicodeWidthStr; +use helix_core::{register::Registers, unicode::width::UnicodeWidthStr}; use std::{collections::BTreeSet, fmt::Write}; #[derive(Debug)] @@ -16,33 +16,60 @@ pub struct Info { } impl Info { - pub fn new(title: &str, body: Vec<(&str, BTreeSet<KeyEvent>)>) -> Info { - let body = body - .into_iter() - .map(|(desc, events)| { - let events = events.iter().map(ToString::to_string).collect::<Vec<_>>(); - (desc, events.join(", ")) - }) - .collect::<Vec<_>>(); + pub fn new(title: &str, body: Vec<(String, String)>) -> Self { + if body.is_empty() { + return Self { + title: title.to_string(), + height: 1, + width: title.len() as u16, + text: "".to_string(), + }; + } - let keymaps_width = body.iter().map(|r| r.1.len()).max().unwrap(); + let item_width = body.iter().map(|(item, _)| item.width()).max().unwrap(); let mut text = String::new(); - for (desc, keyevents) in &body { - let _ = writeln!( - text, - "{:width$} {}", - keyevents, - desc, - width = keymaps_width - ); + for (item, desc) in &body { + let _ = writeln!(text, "{:width$} {}", item, desc, width = item_width); } - Info { + Self { title: title.to_string(), width: text.lines().map(|l| l.width()).max().unwrap() as u16, height: body.len() as u16, text, } } + + pub fn from_keymap(title: &str, body: Vec<(&str, BTreeSet<KeyEvent>)>) -> Self { + let body = body + .into_iter() + .map(|(desc, events)| { + let events = events.iter().map(ToString::to_string).collect::<Vec<_>>(); + (events.join(", "), desc.to_string()) + }) + .collect(); + + Self::new(title, body) + } + + pub fn from_registers(registers: &Registers) -> Self { + let body = registers + .inner() + .iter() + .map(|(ch, reg)| { + let content = reg + .read() + .get(0) + .and_then(|s| s.lines().next()) + .map(String::from) + .unwrap_or_default(); + (ch.to_string(), content) + }) + .collect(); + + let mut infobox = Self::new("Registers", body); + infobox.width = 30; // copied content could be very long + infobox + } } |