diff options
| author | Daniel Jankowski <daniel.jankowski@rub.de> | 2023-12-25 12:01:22 +0100 |
|---|---|---|
| committer | Daniel Jankowski <daniel.jankowski@rub.de> | 2023-12-25 12:02:04 +0100 |
| commit | 336ace1ec9e4de0b372038dba6158c7dc567c833 (patch) | |
| tree | d52bf36750ab23eb3ee0564a1274315544aad1c1 /src/widgets/command.rs | |
| parent | feat: don't call format_string if the command_xxx_format doesn't contains (#28) (diff) | |
| download | sl0pstatus-336ace1ec9e4de0b372038dba6158c7dc567c833.tar.gz sl0pstatus-336ace1ec9e4de0b372038dba6158c7dc567c833.tar.xz sl0pstatus-336ace1ec9e4de0b372038dba6158c7dc567c833.zip | |
feat: implement render modes for command widget
resolves #25
Diffstat (limited to 'src/widgets/command.rs')
| -rw-r--r-- | src/widgets/command.rs | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/src/widgets/command.rs b/src/widgets/command.rs index e9aebcd..22b2892 100644 --- a/src/widgets/command.rs +++ b/src/widgets/command.rs @@ -21,10 +21,18 @@ lazy_static! { } #[derive(Clone, Debug)] +enum RenderMode { + Static, + Dynamic, + Raw, +} + +#[derive(Clone, Debug)] struct CommandConfig { command: String, format: FormattedPart, interval: i64, + render_mode: RenderMode, } #[derive(Clone, Debug)] @@ -93,21 +101,28 @@ impl Widget for CommandWidget { .unwrap_or(&command_result.stderr), ); } - if command_config.format != FormattedPart::default() { - command_config.format.format_string(&content) - } - else{ - return content; + + match command_config.render_mode { + RenderMode::Static => command_config.format.format_string(&content), + RenderMode::Dynamic => render_dynamic_formatted_content(&content), + RenderMode::Raw => content, } } fn process_click(&self, _state: &ZellijState, _pos: usize) {} } +fn render_dynamic_formatted_content(content: &str) -> String { + FormattedPart::multiple_from_format_string(content) + .iter() + .map(|fp| fp.format_string(&fp.content)) + .collect::<Vec<String>>() + .join("") +} + fn run_command_if_needed(command_config: CommandConfig, name: &str, state: &ZellijState) { let ts = Local::now(); - let last_run = - get_timestamp_from_event_or_default(name, state, command_config.interval); + let last_run = get_timestamp_from_event_or_default(name, state, command_config.interval); if ts.timestamp() - last_run.timestamp() >= command_config.interval { let mut context = BTreeMap::new(); @@ -141,6 +156,7 @@ fn parse_config(zj_conf: &BTreeMap<String, String>) -> BTreeMap<String, CommandC command: "".to_owned(), format: FormattedPart::default(), interval: 1, + render_mode: RenderMode::Static, }; if let Some(existing_conf) = config.get(command_name.as_str()) { @@ -152,14 +168,25 @@ fn parse_config(zj_conf: &BTreeMap<String, String>) -> BTreeMap<String, CommandC } if key.ends_with("format") { - command_conf.format = - FormattedPart::from_format_string(zj_conf.get(&key).unwrap().to_owned().clone()); + command_conf.format = FormattedPart::from_format_string(zj_conf.get(&key).unwrap()); } if key.ends_with("interval") { command_conf.interval = zj_conf.get(&key).unwrap().parse::<i64>().unwrap_or(1); } + if key.ends_with("rendermode") { + command_conf.render_mode = match zj_conf.get(&key) { + Some(mode) => match mode.as_str() { + "static" => RenderMode::Static, + "dynamic" => RenderMode::Dynamic, + "raw" => RenderMode::Raw, + _ => RenderMode::Static, + }, + None => RenderMode::Static, + }; + } + config.insert(command_name, command_conf); } |
