diff options
author | denis <denismaximov98@gmail.com> | 2021-04-22 11:45:29 +0300 |
---|---|---|
committer | denis <denismaximov98@gmail.com> | 2021-04-22 11:45:29 +0300 |
commit | 8d98ca7da0bc278a832e4e7de23ff63a84deb529 (patch) | |
tree | e7fdfaa6c1ae25e7737dbb36bd1dbcb94d62ab47 /default-plugins/tab-bar/src/main.rs | |
parent | b2139f4f3472b0cae18a106479e8a1ef92f7115e (diff) | |
parent | 80e1f2927007347d540107b2aa8de7ffac7751b5 (diff) |
wip: merge main in
Diffstat (limited to 'default-plugins/tab-bar/src/main.rs')
-rw-r--r-- | default-plugins/tab-bar/src/main.rs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/default-plugins/tab-bar/src/main.rs b/default-plugins/tab-bar/src/main.rs new file mode 100644 index 000000000..e4a84d987 --- /dev/null +++ b/default-plugins/tab-bar/src/main.rs @@ -0,0 +1,84 @@ +mod line; +mod tab; + +use zellij_tile::prelude::*; + +use crate::line::tab_line; +use crate::tab::tab_style; + +#[derive(Debug)] +pub struct LinePart { + part: String, + len: usize, +} + +#[derive(Default)] +struct State { + tabs: Vec<TabInfo>, + mode_info: ModeInfo, +} + +static ARROW_SEPARATOR: &str = ""; + +pub mod colors { + use ansi_term::Colour::{self, Fixed}; + pub const WHITE: Colour = Fixed(255); + pub const BLACK: Colour = Fixed(16); + pub const GREEN: Colour = Fixed(154); + pub const ORANGE: Colour = Fixed(166); + pub const GRAY: Colour = Fixed(238); + pub const BRIGHT_GRAY: Colour = Fixed(245); + pub const RED: Colour = Fixed(88); +} + +register_plugin!(State); + +impl ZellijPlugin for State { + fn load(&mut self) { + set_selectable(false); + set_invisible_borders(true); + set_max_height(1); + subscribe(&[EventType::TabUpdate, EventType::ModeUpdate]); + } + + fn update(&mut self, event: Event) { + match event { + Event::ModeUpdate(mode_info) => self.mode_info.mode = mode_info.mode, + Event::TabUpdate(tabs) => self.tabs = tabs, + _ => unimplemented!(), // FIXME: This should be unreachable, but this could be cleaner + } + } + + fn render(&mut self, _rows: usize, cols: usize) { + if self.tabs.is_empty() { + return; + } + let mut all_tabs: Vec<LinePart> = vec![]; + let mut active_tab_index = 0; + for t in self.tabs.iter_mut() { + let mut tabname = t.name.clone(); + if t.active && self.mode_info.mode == InputMode::RenameTab { + if tabname.is_empty() { + tabname = String::from("Enter name..."); + } + active_tab_index = t.position; + } else if t.active { + active_tab_index = t.position; + } + let tab = tab_style(tabname, t.active, t.position, self.mode_info.palette); + all_tabs.push(tab); + } + let tab_line = tab_line(all_tabs, active_tab_index, cols); + let mut s = String::new(); + for bar_part in tab_line { + s = format!("{}{}", s, bar_part.part); + } + println!( + "{}\u{1b}[48;2;{};{};{}m\u{1b}[0K", + s, + self.mode_info.palette.fg.0, + self.mode_info.palette.fg.1, + self.mode_info.palette.fg.2 + ); + } +} |