From 088bcf3dd8aab4e522cface84c0a260b5b37a87c Mon Sep 17 00:00:00 2001 From: a-kenji Date: Sun, 9 May 2021 16:44:05 +0200 Subject: Add Option for Simplified Layout * the simplified layout omits the Nerdfonts characters that are not found in every Fontset * add an optional config option to opt into the simplified ui `simplified_ui: bool` * add a config flag that allows opting into the simplified ui `zellij options --simplified-ui` * move the `clean` flag to the `setup` subcommand --- default-plugins/status-bar/src/first_line.rs | 138 ++++++++++++++++++--------- default-plugins/status-bar/src/main.rs | 10 +- default-plugins/tab-bar/src/line.rs | 37 +++++-- default-plugins/tab-bar/src/main.rs | 9 +- default-plugins/tab-bar/src/tab.rs | 20 ++-- 5 files changed, 148 insertions(+), 66 deletions(-) (limited to 'default-plugins') diff --git a/default-plugins/status-bar/src/first_line.rs b/default-plugins/status-bar/src/first_line.rs index f679e8637..37175e3fa 100644 --- a/default-plugins/status-bar/src/first_line.rs +++ b/default-plugins/status-bar/src/first_line.rs @@ -2,7 +2,7 @@ use ansi_term::ANSIStrings; use zellij_tile::prelude::*; use crate::color_elements; -use crate::{ColoredElements, LinePart, ARROW_SEPARATOR}; +use crate::{ColoredElements, LinePart}; struct CtrlKeyShortcut { mode: CtrlKeyMode, @@ -63,13 +63,18 @@ impl CtrlKeyShortcut { } } -fn unselected_mode_shortcut(letter: char, text: &str, palette: ColoredElements) -> LinePart { - let prefix_separator = palette.unselected_prefix_separator.paint(ARROW_SEPARATOR); +fn unselected_mode_shortcut( + letter: char, + text: &str, + palette: ColoredElements, + separator: &str, +) -> LinePart { + let prefix_separator = palette.unselected_prefix_separator.paint(separator); let char_left_separator = palette.unselected_char_left_separator.paint(" <"); let char_shortcut = palette.unselected_char_shortcut.paint(letter.to_string()); let char_right_separator = palette.unselected_char_right_separator.paint(">"); let styled_text = palette.unselected_styled_text.paint(format!("{} ", text)); - let suffix_separator = palette.unselected_suffix_separator.paint(ARROW_SEPARATOR); + let suffix_separator = palette.unselected_suffix_separator.paint(separator); LinePart { part: ANSIStrings(&[ prefix_separator, @@ -84,13 +89,18 @@ fn unselected_mode_shortcut(letter: char, text: &str, palette: ColoredElements) } } -fn selected_mode_shortcut(letter: char, text: &str, palette: ColoredElements) -> LinePart { - let prefix_separator = palette.selected_prefix_separator.paint(ARROW_SEPARATOR); +fn selected_mode_shortcut( + letter: char, + text: &str, + palette: ColoredElements, + separator: &str, +) -> LinePart { + let prefix_separator = palette.selected_prefix_separator.paint(separator); let char_left_separator = palette.selected_char_left_separator.paint(" <".to_string()); let char_shortcut = palette.selected_char_shortcut.paint(format!("{}", letter)); let char_right_separator = palette.selected_char_right_separator.paint(">".to_string()); let styled_text = palette.selected_styled_text.paint(format!("{} ", text)); - let suffix_separator = palette.selected_suffix_separator.paint(ARROW_SEPARATOR); + let suffix_separator = palette.selected_suffix_separator.paint(separator); LinePart { part: ANSIStrings(&[ prefix_separator, @@ -105,69 +115,89 @@ fn selected_mode_shortcut(letter: char, text: &str, palette: ColoredElements) -> } } -fn disabled_mode_shortcut(text: &str, palette: ColoredElements) -> LinePart { - let prefix_separator = palette.disabled_prefix_separator.paint(ARROW_SEPARATOR); +fn disabled_mode_shortcut(text: &str, palette: ColoredElements, separator: &str) -> LinePart { + let prefix_separator = palette.disabled_prefix_separator.paint(separator); let styled_text = palette.disabled_styled_text.paint(format!("{} ", text)); - let suffix_separator = palette.disabled_suffix_separator.paint(ARROW_SEPARATOR); + let suffix_separator = palette.disabled_suffix_separator.paint(separator); LinePart { part: format!("{}{}{}", prefix_separator, styled_text, suffix_separator), len: text.chars().count() + 2 + 1, // 2 for the arrows, 1 for the padding in the end } } -fn selected_mode_shortcut_single_letter(letter: char, palette: ColoredElements) -> LinePart { +fn selected_mode_shortcut_single_letter( + letter: char, + palette: ColoredElements, + separator: &str, +) -> LinePart { let char_shortcut_text = format!(" {} ", letter); let len = char_shortcut_text.chars().count() + 4; // 2 for the arrows, 2 for the padding let prefix_separator = palette .selected_single_letter_prefix_separator - .paint(ARROW_SEPARATOR); + .paint(separator); let char_shortcut = palette .selected_single_letter_char_shortcut .paint(char_shortcut_text); let suffix_separator = palette .selected_single_letter_suffix_separator - .paint(ARROW_SEPARATOR); + .paint(separator); LinePart { part: ANSIStrings(&[prefix_separator, char_shortcut, suffix_separator]).to_string(), len, } } -fn unselected_mode_shortcut_single_letter(letter: char, palette: ColoredElements) -> LinePart { +fn unselected_mode_shortcut_single_letter( + letter: char, + palette: ColoredElements, + separator: &str, +) -> LinePart { let char_shortcut_text = format!(" {} ", letter); let len = char_shortcut_text.chars().count() + 4; // 2 for the arrows, 2 for the padding let prefix_separator = palette .unselected_single_letter_prefix_separator - .paint(ARROW_SEPARATOR); + .paint(separator); let char_shortcut = palette .unselected_single_letter_char_shortcut .paint(char_shortcut_text); let suffix_separator = palette .unselected_single_letter_suffix_separator - .paint(ARROW_SEPARATOR); + .paint(separator); LinePart { part: ANSIStrings(&[prefix_separator, char_shortcut, suffix_separator]).to_string(), len, } } -fn full_ctrl_key(key: &CtrlKeyShortcut, palette: ColoredElements) -> LinePart { +fn full_ctrl_key(key: &CtrlKeyShortcut, palette: ColoredElements, separator: &str) -> LinePart { let full_text = key.full_text(); let letter_shortcut = key.letter_shortcut(); match key.mode { - CtrlKeyMode::Unselected => { - unselected_mode_shortcut(letter_shortcut, &format!(" {}", full_text), palette) - } - CtrlKeyMode::Selected => { - selected_mode_shortcut(letter_shortcut, &format!(" {}", full_text), palette) - } - CtrlKeyMode::Disabled => { - disabled_mode_shortcut(&format!(" <{}> {}", letter_shortcut, full_text), palette) - } + CtrlKeyMode::Unselected => unselected_mode_shortcut( + letter_shortcut, + &format!(" {}", full_text), + palette, + separator, + ), + CtrlKeyMode::Selected => selected_mode_shortcut( + letter_shortcut, + &format!(" {}", full_text), + palette, + separator, + ), + CtrlKeyMode::Disabled => disabled_mode_shortcut( + &format!(" <{}> {}", letter_shortcut, full_text), + palette, + separator, + ), } } -fn shortened_ctrl_key(key: &CtrlKeyShortcut, palette: ColoredElements) -> LinePart { +fn shortened_ctrl_key( + key: &CtrlKeyShortcut, + palette: ColoredElements, + separator: &str, +) -> LinePart { let shortened_text = key.shortened_text(); let letter_shortcut = key.letter_shortcut(); let shortened_text = match key.action { @@ -176,33 +206,47 @@ fn shortened_ctrl_key(key: &CtrlKeyShortcut, palette: ColoredElements) -> LinePa }; match key.mode { CtrlKeyMode::Unselected => { - unselected_mode_shortcut(letter_shortcut, &shortened_text, palette) + unselected_mode_shortcut(letter_shortcut, &shortened_text, palette, separator) + } + CtrlKeyMode::Selected => { + selected_mode_shortcut(letter_shortcut, &shortened_text, palette, separator) } - CtrlKeyMode::Selected => selected_mode_shortcut(letter_shortcut, &shortened_text, palette), - CtrlKeyMode::Disabled => disabled_mode_shortcut( - &format!(" <{}>{}", letter_shortcut, shortened_text), - palette, - ), CtrlKeyMode::Disabled => disabled_mode_shortcut( &format!(" <{}>{}", letter_shortcut, shortened_text), palette, + separator, ), } } -fn single_letter_ctrl_key(key: &CtrlKeyShortcut, palette: ColoredElements) -> LinePart { +fn single_letter_ctrl_key( + key: &CtrlKeyShortcut, + palette: ColoredElements, + separator: &str, +) -> LinePart { let letter_shortcut = key.letter_shortcut(); match key.mode { - CtrlKeyMode::Unselected => unselected_mode_shortcut_single_letter(letter_shortcut, palette), - CtrlKeyMode::Selected => selected_mode_shortcut_single_letter(letter_shortcut, palette), - CtrlKeyMode::Disabled => disabled_mode_shortcut(&format!(" {}", letter_shortcut), palette), + CtrlKeyMode::Unselected => { + unselected_mode_shortcut_single_letter(letter_shortcut, palette, separator) + } + CtrlKeyMode::Selected => { + selected_mode_shortcut_single_letter(letter_shortcut, palette, separator) + } + CtrlKeyMode::Disabled => { + disabled_mode_shortcut(&format!(" {}", letter_shortcut), palette, separator) + } } } -fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut], palette: ColoredElements) -> LinePart { +fn key_indicators( + max_len: usize, + keys: &[CtrlKeyShortcut], + palette: ColoredElements, + separator: &str, +) -> LinePart { let mut line_part = LinePart::default(); for ctrl_key in keys { - let key = full_ctrl_key(ctrl_key, palette); + let key = full_ctrl_key(ctrl_key, palette, separator); line_part.part = format!("{}{}", line_part.part, key.part); line_part.len += key.len; } @@ -211,7 +255,7 @@ fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut], palette: ColoredElem } line_part = LinePart::default(); for ctrl_key in keys { - let key = shortened_ctrl_key(ctrl_key, palette); + let key = shortened_ctrl_key(ctrl_key, palette, separator); line_part.part = format!("{}{}", line_part.part, key.part); line_part.len += key.len; } @@ -220,7 +264,7 @@ fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut], palette: ColoredElem } line_part = LinePart::default(); for ctrl_key in keys { - let key = single_letter_ctrl_key(ctrl_key, palette); + let key = single_letter_ctrl_key(ctrl_key, palette, separator); line_part.part = format!("{}{}", line_part.part, key.part); line_part.len += key.len; } @@ -231,17 +275,17 @@ fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut], palette: ColoredElem line_part } -pub fn superkey(palette: ColoredElements) -> LinePart { +pub fn superkey(palette: ColoredElements, separator: &str) -> LinePart { let prefix_text = " Ctrl +"; let prefix = palette.superkey_prefix.paint(prefix_text); - let suffix_separator = palette.superkey_suffix_separator.paint(ARROW_SEPARATOR); + let suffix_separator = palette.superkey_suffix_separator.paint(separator); LinePart { part: ANSIStrings(&[prefix, suffix_separator]).to_string(), len: prefix_text.chars().count(), } } -pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { +pub fn ctrl_keys(help: &ModeInfo, max_len: usize, separator: &str) -> LinePart { let colored_elements = color_elements(help.palette); match &help.mode { InputMode::Locked => key_indicators( @@ -255,6 +299,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Disabled, CtrlKeyAction::Quit), ], colored_elements, + separator, ), InputMode::Resize => key_indicators( max_len, @@ -267,6 +312,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], colored_elements, + separator, ), InputMode::Pane => key_indicators( max_len, @@ -279,6 +325,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], colored_elements, + separator, ), InputMode::Tab | InputMode::RenameTab => key_indicators( max_len, @@ -291,6 +338,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], colored_elements, + separator, ), InputMode::Scroll => key_indicators( max_len, @@ -303,6 +351,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], colored_elements, + separator, ), InputMode::Normal => key_indicators( max_len, @@ -315,6 +364,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], colored_elements, + separator, ), } } diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index e1a79d49a..bb56c279a 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -140,9 +140,15 @@ impl ZellijPlugin for State { } fn render(&mut self, _rows: usize, cols: usize) { + let separator = if !self.mode_info.capabilities.arrow_fonts { + ARROW_SEPARATOR + } else { + &"" + }; + let colored_elements = color_elements(self.mode_info.palette); - let superkey = superkey(colored_elements); - let ctrl_keys = ctrl_keys(&self.mode_info, cols - superkey.len); + let superkey = superkey(colored_elements, separator); + let ctrl_keys = ctrl_keys(&self.mode_info, cols - superkey.len, separator); let first_line = format!("{}{}", superkey, ctrl_keys); let second_line = keybinds(&self.mode_info, cols); diff --git a/default-plugins/tab-bar/src/line.rs b/default-plugins/tab-bar/src/line.rs index 89a7aa1b3..574edb78d 100644 --- a/default-plugins/tab-bar/src/line.rs +++ b/default-plugins/tab-bar/src/line.rs @@ -48,7 +48,7 @@ fn populate_tabs_in_tab_line( } } -fn left_more_message(tab_count_to_the_left: usize, palette: Palette) -> LinePart { +fn left_more_message(tab_count_to_the_left: usize, palette: Palette, separator: &str) -> LinePart { if tab_count_to_the_left == 0 { return LinePart { part: String::new(), @@ -62,11 +62,11 @@ fn left_more_message(tab_count_to_the_left: usize, palette: Palette) -> LinePart }; // 238 let more_text_len = more_text.chars().count() + 2; // 2 for the arrows - let left_separator = style!(palette.bg, palette.orange).paint(ARROW_SEPARATOR); + let left_separator = style!(palette.bg, palette.orange).paint(separator); let more_styled_text = style!(palette.black, palette.orange) .bold() .paint(more_text); - let right_separator = style!(palette.orange, palette.bg).paint(ARROW_SEPARATOR); + let right_separator = style!(palette.orange, palette.bg).paint(separator); let more_styled_text = format!( "{}", ANSIStrings(&[left_separator, more_styled_text, right_separator,]) @@ -77,7 +77,11 @@ fn left_more_message(tab_count_to_the_left: usize, palette: Palette) -> LinePart } } -fn right_more_message(tab_count_to_the_right: usize, palette: Palette) -> LinePart { +fn right_more_message( + tab_count_to_the_right: usize, + palette: Palette, + separator: &str, +) -> LinePart { if tab_count_to_the_right == 0 { return LinePart { part: String::new(), @@ -90,11 +94,11 @@ fn right_more_message(tab_count_to_the_right: usize, palette: Palette) -> LinePa " +many → ".to_string() }; let more_text_len = more_text.chars().count() + 1; // 2 for the arrow - let left_separator = style!(palette.bg, palette.orange).paint(ARROW_SEPARATOR); + let left_separator = style!(palette.bg, palette.orange).paint(separator); let more_styled_text = style!(palette.black, palette.orange) .bold() .paint(more_text); - let right_separator = style!(palette.orange, palette.bg).paint(ARROW_SEPARATOR); + let right_separator = style!(palette.orange, palette.bg).paint(separator); let more_styled_text = format!( "{}", ANSIStrings(&[left_separator, more_styled_text, right_separator,]) @@ -111,14 +115,15 @@ fn add_previous_tabs_msg( title_bar: &mut Vec, cols: usize, palette: Palette, + separator: &str, ) { while get_current_title_len(&tabs_to_render) - + left_more_message(tabs_before_active.len(), palette).len + + left_more_message(tabs_before_active.len(), palette, separator).len >= cols { tabs_before_active.push(tabs_to_render.remove(0)); } - let left_more_message = left_more_message(tabs_before_active.len(), palette); + let left_more_message = left_more_message(tabs_before_active.len(), palette, separator); title_bar.push(left_more_message); } @@ -127,14 +132,15 @@ fn add_next_tabs_msg( title_bar: &mut Vec, cols: usize, palette: Palette, + separator: &str, ) { while get_current_title_len(&title_bar) - + right_more_message(tabs_after_active.len(), palette).len + + right_more_message(tabs_after_active.len(), palette, separator).len >= cols { tabs_after_active.insert(0, title_bar.pop().unwrap()); } - let right_more_message = right_more_message(tabs_after_active.len(), palette); + let right_more_message = right_more_message(tabs_after_active.len(), palette, separator); title_bar.push(right_more_message); } @@ -148,11 +154,20 @@ fn tab_line_prefix(palette: Palette) -> LinePart { } } +pub fn tab_separator(capabilities: PluginCapabilities) -> &'static str { + if !capabilities.arrow_fonts { + ARROW_SEPARATOR + } else { + &"" + } +} + pub fn tab_line( mut all_tabs: Vec, active_tab_index: usize, cols: usize, palette: Palette, + capabilities: PluginCapabilities, ) -> Vec { let mut tabs_to_render: Vec = vec![]; let mut tabs_after_active = all_tabs.split_off(active_tab_index); @@ -180,6 +195,7 @@ pub fn tab_line( &mut tab_line, cols - prefix.len, palette, + tab_separator(capabilities), ); } tab_line.append(&mut tabs_to_render); @@ -189,6 +205,7 @@ pub fn tab_line( &mut tab_line, cols - prefix.len, palette, + tab_separator(capabilities), ); } tab_line.insert(0, prefix); diff --git a/default-plugins/tab-bar/src/main.rs b/default-plugins/tab-bar/src/main.rs index c62770137..00ff4bd96 100644 --- a/default-plugins/tab-bar/src/main.rs +++ b/default-plugins/tab-bar/src/main.rs @@ -60,10 +60,17 @@ impl ZellijPlugin for State { t.position, t.is_sync_panes_active, self.mode_info.palette, + self.mode_info.capabilities, ); all_tabs.push(tab); } - let tab_line = tab_line(all_tabs, active_tab_index, cols, self.mode_info.palette); + let tab_line = tab_line( + all_tabs, + active_tab_index, + cols, + self.mode_info.palette, + self.mode_info.capabilities, + ); let mut s = String::new(); for bar_part in tab_line { s = format!("{}{}", s, bar_part.part); diff --git a/default-plugins/tab-bar/src/tab.rs b/default-plugins/tab-bar/src/tab.rs index 7c1fe6b32..85e2c378d 100644 --- a/default-plugins/tab-bar/src/tab.rs +++ b/default-plugins/tab-bar/src/tab.rs @@ -1,15 +1,15 @@ -use crate::{LinePart, ARROW_SEPARATOR}; +use crate::{line::tab_separator, LinePart}; use ansi_term::ANSIStrings; use zellij_tile::prelude::*; use zellij_tile_utils::style; -pub fn active_tab(text: String, palette: Palette) -> LinePart { - let left_separator = style!(palette.bg, palette.green).paint(ARROW_SEPARATOR); +pub fn active_tab(text: String, palette: Palette, separator: &str) -> LinePart { + let left_separator = style!(palette.bg, palette.green).paint(separator); let tab_text_len = text.chars().count() + 4; // 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.bg).paint(ARROW_SEPARATOR); + let right_separator = style!(palette.green, palette.bg).paint(separator); let tab_styled_text = format!( "{}", ANSIStrings(&[left_separator, tab_styled_text, right_separator,]) @@ -20,13 +20,13 @@ pub fn active_tab(text: String, palette: Palette) -> LinePart { } } -pub fn non_active_tab(text: String, palette: Palette) -> LinePart { - let left_separator = style!(palette.bg, palette.fg).paint(ARROW_SEPARATOR); +pub fn non_active_tab(text: String, palette: Palette, separator: &str) -> LinePart { + let left_separator = style!(palette.bg, palette.fg).paint(separator); let tab_text_len = text.chars().count() + 4; // 2 for left and right separators, 2 for the padding let tab_styled_text = style!(palette.black, palette.fg) .bold() .paint(format!(" {} ", text)); - let right_separator = style!(palette.fg, palette.bg).paint(ARROW_SEPARATOR); + let right_separator = style!(palette.fg, palette.bg).paint(separator); let tab_styled_text = format!( "{}", ANSIStrings(&[left_separator, tab_styled_text, right_separator,]) @@ -43,7 +43,9 @@ pub fn tab_style( position: usize, is_sync_panes_active: bool, palette: Palette, + capabilities: PluginCapabilities, ) -> LinePart { + let separator = tab_separator(capabilities); let mut tab_text = if text.is_empty() { format!("Tab #{}", position + 1) } else { @@ -53,8 +55,8 @@ pub fn tab_style( tab_text.push_str(" (Sync)"); } if is_active_tab { - active_tab(tab_text, palette) + active_tab(tab_text, palette, separator) } else { - non_active_tab(tab_text, palette) + non_active_tab(tab_text, palette, separator) } } -- cgit v1.2.3