diff options
| author | Daniel Jankowski <daniel.jankowski@rub.de> | 2023-08-31 18:23:47 +0200 |
|---|---|---|
| committer | Daniel Jankowski <daniel.jankowski@rub.de> | 2023-08-31 18:23:47 +0200 |
| commit | da4852f427cab335c08662007f7f49f4c559857a (patch) | |
| tree | d600912dbe8293e3ba4e5c10fa008c2e07ff4a63 /src/widgets | |
| parent | chore: move render function to part (diff) | |
| download | sl0pstatus-da4852f427cab335c08662007f7f49f4c559857a.tar.gz sl0pstatus-da4852f427cab335c08662007f7f49f4c559857a.tar.xz sl0pstatus-da4852f427cab335c08662007f7f49f4c559857a.zip | |
feat: implement mode widget
Diffstat (limited to 'src/widgets')
| -rw-r--r-- | src/widgets/mod.rs | 2 | ||||
| -rw-r--r-- | src/widgets/mode.rs | 151 | ||||
| -rw-r--r-- | src/widgets/widget.rs | 5 |
3 files changed, 158 insertions, 0 deletions
diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs new file mode 100644 index 0000000..4abab8e --- /dev/null +++ b/src/widgets/mod.rs @@ -0,0 +1,2 @@ +pub mod mode; +pub mod widget; diff --git a/src/widgets/mode.rs b/src/widgets/mode.rs new file mode 100644 index 0000000..629cd0f --- /dev/null +++ b/src/widgets/mode.rs @@ -0,0 +1,151 @@ +use std::collections::BTreeMap; + +use zellij_tile::prelude::InputMode; + +use crate::{config::FormattedPart, render, ZellijState}; + +use super::widget::Widget; + +#[derive(Debug)] +pub struct ModeWidget { + normal_format: FormattedPart, + locked_format: FormattedPart, + resize_format: FormattedPart, + pane_format: FormattedPart, + tab_format: FormattedPart, + scroll_format: FormattedPart, + enter_search_format: FormattedPart, + search_format: FormattedPart, + rename_tab_format: FormattedPart, + rename_pane_format: FormattedPart, + session_format: FormattedPart, + move_format: FormattedPart, + prompt_format: FormattedPart, + tmux_format: FormattedPart, +} + +impl ModeWidget { + pub fn new(config: BTreeMap<String, String>) -> Self { + let mut normal_format_string = ""; + if let Some(form) = config.get("mode_normal_format") { + normal_format_string = form; + } + + let locked_format = FormattedPart::from_format_string(match config.get("mode_locked_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let resize_format = FormattedPart::from_format_string(match config.get("mode_resize_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let pane_format = FormattedPart::from_format_string(match config.get("mode_pane_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let tab_format = FormattedPart::from_format_string(match config.get("mode_tab_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let scroll_format = FormattedPart::from_format_string(match config.get("mode_scroll_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let enter_search_format = FormattedPart::from_format_string(match config.get("mode_enter_search_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let search_format = FormattedPart::from_format_string(match config.get("mode_search_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let rename_tab_format = FormattedPart::from_format_string(match config.get("mode_rename_tab_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let rename_pane_format = FormattedPart::from_format_string(match config.get("mode_rename_pane_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let session_format = FormattedPart::from_format_string(match config.get("mode_session_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let move_format = FormattedPart::from_format_string(match config.get("mode_move_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let prompt_format = FormattedPart::from_format_string(match config.get("mode_prompt_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + let tmux_format = FormattedPart::from_format_string(match config.get("mode_tmux_format") { + Some(form) => form.to_string(), + None => normal_format_string.to_string(), + }); + + + Self { + normal_format: FormattedPart::from_format_string(normal_format_string.to_string()), + locked_format, + resize_format, + pane_format, + tab_format, + scroll_format, + enter_search_format, + search_format, + rename_tab_format, + rename_pane_format, + session_format, + move_format, + prompt_format, + tmux_format, + } + } +} + +impl Widget for ModeWidget { + fn process(&self, state: ZellijState) -> String { + let format = self.select_format(state.mode.mode); + + let mut content = format.content.clone(); + if content.contains("{name}") { + content = content.replace("{name}", format!("{:?}", state.mode.mode).as_str()); + } + + render::formatting(format.clone(), content) + } +} + +impl ModeWidget { + fn select_format(&self, mode: InputMode) -> FormattedPart { + match mode { + InputMode::Normal => self.normal_format.clone(), + InputMode::Locked => self.locked_format.clone(), + InputMode::Resize => self.resize_format.clone(), + InputMode::Pane => self.pane_format.clone(), + InputMode::Tab => self.tab_format.clone(), + InputMode::Scroll => self.scroll_format.clone(), + InputMode::EnterSearch => self.enter_search_format.clone(), + InputMode::Search => self.search_format.clone(), + InputMode::RenameTab => self.rename_tab_format.clone(), + InputMode::RenamePane => self.rename_pane_format.clone(), + InputMode::Session => self.session_format.clone(), + InputMode::Move => self.move_format.clone(), + InputMode::Prompt => self.prompt_format.clone(), + InputMode::Tmux => self.tmux_format.clone(), + } + } +} diff --git a/src/widgets/widget.rs b/src/widgets/widget.rs new file mode 100644 index 0000000..6a53d2c --- /dev/null +++ b/src/widgets/widget.rs @@ -0,0 +1,5 @@ +use crate::ZellijState; + +pub trait Widget { + fn process(&self, state: ZellijState) -> String; +} |
