summaryrefslogtreecommitdiffstats
path: root/default-plugins/tab-bar
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2021-12-20 17:31:07 +0100
committerGitHub <noreply@github.com>2021-12-20 17:31:07 +0100
commitca8438b0aa0e5e9aa1c69f0217c275d20f269a8f (patch)
tree97ee4922eb41415d54d3cb183ad9dbef66bd7186 /default-plugins/tab-bar
parent2c1d3a9817e70ea3d4b55672166f3417d296cc44 (diff)
feat(collaboration): implement multiple users (#957)
* work * feat(collaboration): implement multiple users * style(cleanup): some leftovers
Diffstat (limited to 'default-plugins/tab-bar')
-rw-r--r--default-plugins/tab-bar/src/main.rs1
-rw-r--r--default-plugins/tab-bar/src/tab.rs76
2 files changed, 52 insertions, 25 deletions
diff --git a/default-plugins/tab-bar/src/main.rs b/default-plugins/tab-bar/src/main.rs
index 31b2f2d37..3db531384 100644
--- a/default-plugins/tab-bar/src/main.rs
+++ b/default-plugins/tab-bar/src/main.rs
@@ -85,6 +85,7 @@ impl ZellijPlugin for State {
t.is_sync_panes_active,
self.mode_info.palette,
self.mode_info.capabilities,
+ t.other_focused_clients.as_slice(),
);
all_tabs.push(tab);
}
diff --git a/default-plugins/tab-bar/src/tab.rs b/default-plugins/tab-bar/src/tab.rs
index db960fd52..4ed3b2076 100644
--- a/default-plugins/tab-bar/src/tab.rs
+++ b/default-plugins/tab-bar/src/tab.rs
@@ -1,33 +1,62 @@
use crate::{line::tab_separator, LinePart};
-use ansi_term::ANSIStrings;
+use ansi_term::{ANSIString, ANSIStrings};
use unicode_width::UnicodeWidthStr;
use zellij_tile::prelude::*;
use zellij_tile_utils::style;
-pub fn active_tab(text: String, palette: Palette, separator: &str) -> LinePart {
- let left_separator = style!(palette.gray, palette.green).paint(separator);
- let tab_text_len = text.width() + 2 + separator.width() * 2; // 2 for left and right separators, 2 for the text padding
- let tab_styled_text = style!(palette.black, palette.green)
- .bold()
- .paint(format!(" {} ", text));
- let right_separator = style!(palette.green, palette.gray).paint(separator);
- let tab_styled_text =
- ANSIStrings(&[left_separator, tab_styled_text, right_separator]).to_string();
- LinePart {
- part: tab_styled_text,
- len: tab_text_len,
+fn cursors(focused_clients: &[ClientId], palette: Palette) -> (Vec<ANSIString>, usize) {
+ // cursor section, text length
+ let mut len = 0;
+ let mut cursors = vec![];
+ for client_id in focused_clients.iter() {
+ if let Some(color) = client_id_to_colors(*client_id, palette) {
+ cursors.push(style!(color.1, color.0).paint(" "));
+ len += 1;
+ }
}
+ (cursors, len)
}
-pub fn non_active_tab(text: String, palette: Palette, separator: &str) -> LinePart {
- let left_separator = style!(palette.gray, palette.fg).paint(separator);
- let tab_text_len = text.width() + 2 + separator.width() * 2; // 2 for left and right separators, 2 for the text padding
- let tab_styled_text = style!(palette.black, palette.fg)
+pub fn render_tab(
+ text: String,
+ palette: Palette,
+ separator: &str,
+ focused_clients: &[ClientId],
+ active: bool,
+) -> LinePart {
+ let background_color = if active { palette.green } else { palette.fg };
+ let left_separator = style!(palette.gray, background_color).paint(separator);
+ let mut tab_text_len = text.width() + 2 + separator.width() * 2; // 2 for left and right separators, 2 for the text padding
+
+ let tab_styled_text = style!(palette.black, background_color)
.bold()
.paint(format!(" {} ", text));
- let right_separator = style!(palette.fg, palette.gray).paint(separator);
- let tab_styled_text =
- ANSIStrings(&[left_separator, tab_styled_text, right_separator]).to_string();
+
+ let right_separator = style!(background_color, palette.gray).paint(separator);
+ let tab_styled_text = if !focused_clients.is_empty() {
+ let (cursor_section, extra_length) = cursors(focused_clients, palette);
+ tab_text_len += extra_length;
+ let mut s = String::new();
+ let cursor_beginning = style!(palette.black, background_color)
+ .bold()
+ .paint("[")
+ .to_string();
+ let cursor_section = ANSIStrings(&cursor_section).to_string();
+ let cursor_end = style!(palette.black, background_color)
+ .bold()
+ .paint("]")
+ .to_string();
+ s.push_str(&left_separator.to_string());
+ s.push_str(&tab_styled_text.to_string());
+ s.push_str(&cursor_beginning);
+ s.push_str(&cursor_section);
+ s.push_str(&cursor_end);
+ s.push_str(&right_separator.to_string());
+ s
+ } else {
+ ANSIStrings(&[left_separator, tab_styled_text, right_separator]).to_string()
+ };
+
LinePart {
part: tab_styled_text,
len: tab_text_len,
@@ -40,15 +69,12 @@ pub fn tab_style(
is_sync_panes_active: bool,
palette: Palette,
capabilities: PluginCapabilities,
+ focused_clients: &[ClientId],
) -> LinePart {
let separator = tab_separator(capabilities);
let mut tab_text = text;
if is_sync_panes_active {
tab_text.push_str(" (Sync)");
}
- if is_active_tab {
- active_tab(tab_text, palette, separator)
- } else {
- non_active_tab(tab_text, palette, separator)
- }
+ render_tab(tab_text, palette, separator, focused_clients, is_active_tab)
}