summaryrefslogtreecommitdiffstats
path: root/default-plugins/tab-bar/src/main.rs
diff options
context:
space:
mode:
authordenis <denismaximov98@gmail.com>2021-04-22 11:45:29 +0300
committerdenis <denismaximov98@gmail.com>2021-04-22 11:45:29 +0300
commit8d98ca7da0bc278a832e4e7de23ff63a84deb529 (patch)
treee7fdfaa6c1ae25e7737dbb36bd1dbcb94d62ab47 /default-plugins/tab-bar/src/main.rs
parentb2139f4f3472b0cae18a106479e8a1ef92f7115e (diff)
parent80e1f2927007347d540107b2aa8de7ffac7751b5 (diff)
wip: merge main in
Diffstat (limited to 'default-plugins/tab-bar/src/main.rs')
-rw-r--r--default-plugins/tab-bar/src/main.rs84
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
+ );
+ }
+}