diff options
| author | Mark Grey <mark.asperia@gmail.com> | 2025-02-07 05:59:54 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-07 11:59:54 +0100 |
| commit | 26b99eac63869fb1209ecf39c4f9cdb21d0419ba (patch) | |
| tree | 4a12d05dc3eb55b651ea90888e56932b2fb3bd73 /default-plugins/session-manager/src | |
| parent | docs(issue-template): clarify requirements (diff) | |
| download | sl0ppij-26b99eac63869fb1209ecf39c4f9cdb21d0419ba.tar.gz sl0ppij-26b99eac63869fb1209ecf39c4f9cdb21d0419ba.tar.xz sl0ppij-26b99eac63869fb1209ecf39c4f9cdb21d0419ba.zip | |
feat(config): new theme definition spec (#3242)
* Implement initial structs from spec
* kdl configuration unmarshalling
* typo text styling
* remove is_selected toggle
* incorporate new status bar ui into theming
* improve test coverage of config behavior
* tab bar correction
* correct also compact bar
* remove spacing between table columns
* refactor table styling
* use text_unselected.emphasis_1 for keygroup sep
* fix tab bar more text
* repair field flattening for theme
* remove extra styling KDL node
* update tests
* updated selected text conversion
* padding for header bar
* minor corrections for existing themes
* background handling
* compact bar corrections
* properly handle opaque method to activate background
* update newer plugins to use styling struct
* correct omission of selected state
* fix: bold typeface for text elements
* fix: fg -> white for list_unselected conversion
* fix: emphasis and opacity handling for nested_list
* correct stylings in the session-manager
* fix emphases translation for table component
* correct emphasis for run instructions
* correct frame_highlight translation for old themes
* provide missing implementation of frame_highlight
* fencepost emphasis color names
* Set a pseudo-None for frame_unselected in old theme conversion
* correct alternating bg for simplified-ui
* update snapshots
* fix inner text padding and errorneous snapshots
* suppress warning about deprecated usage of palette
* remove unused import
* feat(plugins): API to change floating pane coordinates (#3958)
* basic functionality through the cli
* added to plugin api
* add display area and viewport size to TabInfo
* fix tests and add new one
* some cleanups
* refactor: extract pane_id parsing logic
* style(fmt): rustfmt
* docs(changelog): floating pane coordinate chagne API
* fix(tiled-panes): opening panes from the cli (#3963)
* feat(plugins): add `PastedText` Event (#3962)
* working with text paste
* handle utf8 conversion error
* feat(plugins): add PastedText Event
* docs(changelog): plugins pasted text event
* black for table opaque background
* properly apply opacity to table
* correct padding for explicit width ribbons
* feat(plugins): Allow opening panes near plugin (#3966)
* added command + terminal variants
* added editor variant
* style(fmt): rustfmt
* docs(changelog): plugin apis to open panes near plugin
* feat(plugins): send info about $EDITOR and $SHELL (#3971)
* feat(plugins): send info about $EDITOR and $SHELL
* fix(e2e): snapshot update
* docs(changelog): plugin editor and shell info
* fix(floating-panes): when changing coordinates, if a pane is not floating - make it floating (#3972)
* fix(panes): when changing floating pane coordinates, if the pane is not floating, float it
* style(fmt): rustfmt
* docs(changelog): floating pane coordinate fix
* fix(break-pane): strip logical position when inserting pane to new tab (#3973)
* docs(changelog): logical position fix
* Optional frame_unselected theme
* fixture with correct width to account for arrow padding
* update snapshot and rustfmt
---------
Co-authored-by: Aram Drevekenin <aram@poor.dev>
Diffstat (limited to 'default-plugins/session-manager/src')
| -rw-r--r-- | default-plugins/session-manager/src/main.rs | 5 | ||||
| -rw-r--r-- | default-plugins/session-manager/src/ui/components.rs | 177 |
2 files changed, 108 insertions, 74 deletions
diff --git a/default-plugins/session-manager/src/main.rs b/default-plugins/session-manager/src/main.rs index 8dd6da87..ba6ef55d 100644 --- a/default-plugins/session-manager/src/main.rs +++ b/default-plugins/session-manager/src/main.rs @@ -122,10 +122,7 @@ impl ZellijPlugin for State { fn render(&mut self, rows: usize, cols: usize) { let (x, y, width, height) = self.main_menu_size(rows, cols); - let background = match self.colors.palette.theme_hue { - ThemeHue::Dark => self.colors.palette.black, - ThemeHue::Light => self.colors.palette.white, - }; + let background = self.colors.palette.text_unselected.background; if self.is_welcome_screen { render_banner(x, 0, rows.saturating_sub(height), width); diff --git a/default-plugins/session-manager/src/ui/components.rs b/default-plugins/session-manager/src/ui/components.rs index 03c4d328..dede06d9 100644 --- a/default-plugins/session-manager/src/ui/components.rs +++ b/default-plugins/session-manager/src/ui/components.rs @@ -83,9 +83,14 @@ impl ListItem { let mut remaining_cols = max_cols; for span in session_name { span.render( - indices - .clone() - .map(|i| (SpanStyle::ForegroundBold(self.colors.palette.magenta), i)), + indices.clone().map(|i| { + ( + SpanStyle::ForegroundBold( + self.colors.palette.text_unselected.emphasis_3, + ), + i, + ) + }), &mut line_to_render, &mut remaining_cols, ); @@ -102,9 +107,14 @@ impl ListItem { let mut remaining_cols = max_cols; for span in tab_name { span.render( - indices - .clone() - .map(|i| (SpanStyle::ForegroundBold(self.colors.palette.magenta), i)), + indices.clone().map(|i| { + ( + SpanStyle::ForegroundBold( + self.colors.palette.text_unselected.emphasis_3, + ), + i, + ) + }), &mut line_to_render, &mut remaining_cols, ); @@ -116,9 +126,14 @@ impl ListItem { let mut remaining_cols = max_cols; for span in pane_name { span.render( - indices - .clone() - .map(|i| (SpanStyle::ForegroundBold(self.colors.palette.magenta), i)), + indices.clone().map(|i| { + ( + SpanStyle::ForegroundBold( + self.colors.palette.text_unselected.emphasis_3, + ), + i, + ) + }), &mut line_to_render, &mut remaining_cols, ); @@ -297,11 +312,11 @@ impl LineToRender { pub fn make_selected_as_search(&mut self, add_arrows: bool) { self.is_selected = true; let arrows = if add_arrows { - self.colors.magenta(" <↓↑> ") + self.colors.shortcuts(" <↓↑> ") } else { " ".to_owned() }; - match self.colors.palette.bg { + match self.colors.palette.list_selected.background { PaletteColor::EightBit(byte) => { self.line = format!( "\u{1b}[48;5;{byte}m\u{1b}[K\u{1b}[48;5;{byte}m{arrows}{}", @@ -319,11 +334,11 @@ impl LineToRender { pub fn make_selected(&mut self, add_arrows: bool) { self.is_selected = true; let arrows = if add_arrows { - self.colors.magenta("<←↓↑→>") + self.colors.shortcuts("<←↓↑→>") } else { " ".to_owned() }; - match self.colors.palette.bg { + match self.colors.palette.list_selected.background { PaletteColor::EightBit(byte) => { self.line = format!( "\u{1b}[48;5;{byte}m\u{1b}[K\u{1b}[48;5;{byte}m{arrows}{}", @@ -343,7 +358,7 @@ impl LineToRender { let more = if self.truncated_result_count > 0 { self.colors - .red(&format!(" [+{}]", self.truncated_result_count)) + .exit_code_error(&format!(" [+{}]", self.truncated_result_count)) } else { String::new() }; @@ -368,12 +383,12 @@ pub fn build_session_ui_line(session_ui_info: &SessionUiInfo, colors: Colors) -> .iter() .fold(0, |acc, tab| acc + tab.panes.len()); let tab_count = format!("{}", tab_count_text); - let tab_count_styled = colors.cyan(&tab_count); + let tab_count_styled = colors.tab_count(&tab_count); let total_pane_count = format!("{}", total_pane_count_text); - let total_pane_count_styled = colors.green(&total_pane_count); + let total_pane_count_styled = colors.pane_count(&total_pane_count); let session_name = &session_ui_info.name; let connected_users = format!("{}", session_ui_info.connected_users); - let connected_users_styled = colors.orange(&connected_users); + let connected_users_styled = colors.connected_users(&connected_users); let session_bullet_span = UiSpan::UiSpanTelescope(UiSpanTelescope::new(vec![StringAndLength::new( format!(" > "), @@ -381,7 +396,7 @@ pub fn build_session_ui_line(session_ui_info: &SessionUiInfo, colors: Colors) -> )])); let session_name_span = UiSpan::TruncatableUiSpan(TruncatableUiSpan::new( session_name.clone(), - SpanStyle::ForegroundBold(colors.palette.orange), + SpanStyle::ForegroundBold(colors.palette.text_unselected.emphasis_0), )); let tab_and_pane_count = UiSpan::UiSpanTelescope(UiSpanTelescope::new(vec![ StringAndLength::new( @@ -409,9 +424,12 @@ pub fn build_session_ui_line(session_ui_info: &SessionUiInfo, colors: Colors) -> ui_spans.push(connected_users_count); if session_ui_info.is_current_session { let current_session_indication = UiSpan::UiSpanTelescope(UiSpanTelescope::new(vec![ - StringAndLength::new(colors.orange(&format!(" <CURRENT SESSION>")), 18), - StringAndLength::new(colors.orange(&format!(" <CURRENT>")), 10), - StringAndLength::new(colors.orange(&format!(" <C>")), 4), + StringAndLength::new( + colors.current_session_marker(&format!(" <CURRENT SESSION>")), + 18, + ), + StringAndLength::new(colors.current_session_marker(&format!(" <CURRENT>")), 10), + StringAndLength::new(colors.current_session_marker(&format!(" <C>")), 4), ])); ui_spans.push(current_session_indication); } @@ -423,7 +441,7 @@ pub fn build_tab_ui_line(tab_ui_info: &TabUiInfo, colors: Colors) -> Vec<UiSpan> let tab_name = &tab_ui_info.name; let pane_count_text = tab_ui_info.panes.len(); let pane_count = format!("{}", pane_count_text); - let pane_count_styled = colors.green(&pane_count); + let pane_count_styled = colors.pane_count(&pane_count); let tab_bullet_span = UiSpan::UiSpanTelescope(UiSpanTelescope::new(vec![StringAndLength::new( format!(" - "), @@ -431,7 +449,7 @@ pub fn build_tab_ui_line(tab_ui_info: &TabUiInfo, colors: Colors) -> Vec<UiSpan> )])); let tab_name_span = UiSpan::TruncatableUiSpan(TruncatableUiSpan::new( tab_name.clone(), - SpanStyle::ForegroundBold(colors.palette.cyan), + SpanStyle::ForegroundBold(colors.palette.text_unselected.emphasis_1), )); let connected_users_count_span = UiSpan::UiSpanTelescope(UiSpanTelescope::new(vec![ StringAndLength::new( @@ -455,9 +473,9 @@ pub fn build_pane_ui_line(pane_ui_info: &PaneUiInfo, colors: Colors) -> Vec<UiSp let exit_code = pane_ui_info.exit_code.map(|exit_code_number| { let exit_code = format!("{}", exit_code_number); let exit_code = if exit_code_number == 0 { - colors.green(&exit_code) + colors.session_and_folder_entry(&exit_code) } else { - colors.red(&exit_code) + colors.exit_code_error(&exit_code) }; exit_code }); @@ -505,7 +523,7 @@ pub fn minimize_lines( } pub fn render_prompt(search_term: &str, colors: Colors, x: usize, y: usize) { - let prompt = colors.green(&format!("Search:")); + let prompt = colors.session_and_folder_entry(&format!("Search:")); let search_term = colors.bold(&format!("{}_", search_term)); println!( "\u{1b}[{};{}H\u{1b}[0m{} {}\n", @@ -581,10 +599,10 @@ fn render_new_session_folder_prompt( let new_session_path = new_session_folder.clone(); let new_session_folder = new_session_folder.display().to_string(); let change_folder_shortcut_text = "<Ctrl f>"; - let change_folder_shortcut = colors.magenta(&change_folder_shortcut_text); + let change_folder_shortcut = colors.shortcuts(&change_folder_shortcut_text); let to_change = "to change"; let reset_folder_shortcut_text = "<Ctrl c>"; - let reset_folder_shortcut = colors.magenta(reset_folder_shortcut_text); + let reset_folder_shortcut = colors.shortcuts(reset_folder_shortcut_text); let to_reset = "to reset"; if max_cols >= folder_prompt.width() @@ -598,8 +616,8 @@ fn render_new_session_folder_prompt( print!( "\u{1b}[m{}{} {} ({} {}, {} {})", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green(folder_prompt), - colors.orange(&new_session_folder), + colors.session_name_prompt(folder_prompt), + colors.session_and_folder_entry(&new_session_folder), change_folder_shortcut, to_change, reset_folder_shortcut, @@ -617,8 +635,8 @@ fn render_new_session_folder_prompt( print!( "\u{1b}[m{}{} {} ({} {}, {} {})", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green(short_folder_prompt), - colors.orange(&new_session_folder), + colors.session_name_prompt(short_folder_prompt), + colors.session_and_folder_entry(&new_session_folder), change_folder_shortcut, to_change, reset_folder_shortcut, @@ -634,8 +652,8 @@ fn render_new_session_folder_prompt( print!( "\u{1b}[m{}{} {} ({}/{})", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green(short_folder_prompt), - colors.orange(&new_session_folder), + colors.session_name_prompt(short_folder_prompt), + colors.session_and_folder_entry(&new_session_folder), change_folder_shortcut, reset_folder_shortcut, ); @@ -652,8 +670,8 @@ fn render_new_session_folder_prompt( print!( "\u{1b}[m{}{} {} ({}/{})", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green(short_folder_prompt), - colors.orange(&truncated_path), + colors.session_name_prompt(short_folder_prompt), + colors.session_and_folder_entry(&truncated_path), change_folder_shortcut, reset_folder_shortcut, ); @@ -663,7 +681,7 @@ fn render_new_session_folder_prompt( let folder_prompt = "New session folder:"; let short_folder_prompt = "Folder:"; let change_folder_shortcut_text = "<Ctrl f>"; - let change_folder_shortcut = colors.magenta(change_folder_shortcut_text); + let change_folder_shortcut = colors.shortcuts(change_folder_shortcut_text); let to_set = "to set"; if max_cols @@ -672,7 +690,7 @@ fn render_new_session_folder_prompt( print!( "\u{1b}[m{}{} ({} {})", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green(folder_prompt), + colors.session_name_prompt(folder_prompt), change_folder_shortcut, to_set, ); @@ -685,7 +703,7 @@ fn render_new_session_folder_prompt( print!( "\u{1b}[m{}{} ({} {})", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green(short_folder_prompt), + colors.session_name_prompt(short_folder_prompt), change_folder_shortcut, to_set, ); @@ -693,7 +711,7 @@ fn render_new_session_folder_prompt( print!( "\u{1b}[m{}{} {}", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green(short_folder_prompt), + colors.session_name_prompt(short_folder_prompt), change_folder_shortcut, ); } @@ -709,7 +727,7 @@ pub fn render_new_session_block( x: usize, y: usize, ) { - let enter = colors.magenta("<ENTER>"); + let enter = colors.shortcuts("<ENTER>"); if new_session_info.entering_new_session_name() { let prompt = "New session name:"; let long_instruction = "when done, blank for random"; @@ -720,8 +738,8 @@ pub fn render_new_session_block( println!( "\u{1b}[m{}{} {}_ ({} {})", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green(prompt), - colors.orange(&new_session_name), + colors.session_name_prompt(prompt), + colors.session_and_folder_entry(&new_session_name), enter, long_instruction, ); @@ -746,8 +764,8 @@ pub fn render_new_session_block( println!( "\u{1b}[m{}{} {}_ {}", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green(prompt), - colors.orange(&new_session_name), + colors.session_name_prompt(prompt), + colors.session_and_folder_entry(&new_session_name), enter, ); } @@ -759,23 +777,23 @@ pub fn render_new_session_block( }; let prompt = "New session name:"; let long_instruction = "to correct"; - let esc = colors.magenta("<ESC>"); + let esc = colors.shortcuts("<ESC>"); if max_cols_of_new_session_block > prompt.width() + long_instruction.width() + new_session_name.width() + 15 { println!( "\u{1b}[m{}{}: {} ({} to correct)", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green("New session name"), - colors.orange(new_session_name), + colors.session_name_prompt(prompt), + colors.session_and_folder_entry(new_session_name), esc, ); } else { println!( "\u{1b}[m{}{}: {} {}", format!("\u{1b}[{};{}H", y + 1, x + 1), - colors.green("New session name"), - colors.orange(new_session_name), + colors.session_name_prompt("New session name"), + colors.session_and_folder_entry(new_session_name), esc, ); } @@ -919,13 +937,13 @@ pub fn render_controls_line( } }, ActiveScreen::AttachToSession => { - let rename = colors.magenta("<Ctrl r>"); + let rename = colors.shortcuts("<Ctrl r>"); let rename_text = colors.bold("Rename"); - let disconnect = colors.magenta("<Ctrl x>"); + let disconnect = colors.shortcuts("<Ctrl x>"); let disconnect_text = colors.bold("Disconnect others"); - let kill = colors.magenta("<Del>"); + let kill = colors.shortcuts("<Del>"); let kill_text = colors.bold("Kill"); - let kill_all = colors.magenta("<Ctrl d>"); + let kill_all = colors.shortcuts("<Ctrl d>"); let kill_all_text = colors.bold("Kill all"); if max_cols > 90 { @@ -937,13 +955,13 @@ pub fn render_controls_line( } }, ActiveScreen::ResurrectSession => { - let arrows = colors.magenta("<↓↑>"); + let arrows = colors.shortcuts("<↓↑>"); let navigate = colors.bold("Navigate"); - let enter = colors.magenta("<ENTER>"); + let enter = colors.shortcuts("<ENTER>"); let select = colors.bold("Resurrect"); - let del = colors.magenta("<DEL>"); + let del = colors.shortcuts("<DEL>"); let del_text = colors.bold("Delete"); - let del_all = colors.magenta("<Ctrl d>"); + let del_all = colors.shortcuts("<Ctrl d>"); let del_all_text = colors.bold("Delete all"); if max_cols > 83 { @@ -957,12 +975,18 @@ pub fn render_controls_line( } } +// Maps the various prompts and UI elements to the colors to present them with +// +// Since this plugin predates the UI components, this is a developer +// convenience to keep the coloration of dialogs organized by descriptive names +// +// It will be obviated once everything is migrated to UI components from zellij-tile #[derive(Debug, Default, Clone, Copy)] pub struct Colors { - pub palette: Palette, + pub palette: Styling, } impl Colors { - pub fn new(palette: Palette) -> Self { + pub fn new(palette: Styling) -> Self { Colors { palette } } pub fn bold(&self, text: &str) -> String { @@ -979,24 +1003,37 @@ impl Colors { }, } } - pub fn orange(&self, text: &str) -> String { - self.color(&self.palette.orange, text) + + pub fn session_name_prompt(&self, text: &str) -> String { + self.color(&self.palette.exit_code_success.base, text) + } + + pub fn connected_users(&self, text: &str) -> String { + self.color(&self.palette.text_unselected.emphasis_2, text) + } + + pub fn session_and_folder_entry(&self, text: &str) -> String { + self.color(&self.palette.text_unselected.emphasis_0, text) + } + + pub fn current_session_marker(&self, text: &str) -> String { + self.color(&self.palette.text_unselected.emphasis_0, text) } - pub fn green(&self, text: &str) -> String { - self.color(&self.palette.green, text) + pub fn pane_count(&self, text: &str) -> String { + self.color(&self.palette.text_unselected.emphasis_2, text) } - pub fn red(&self, text: &str) -> String { - self.color(&self.palette.red, text) + pub fn exit_code_error(&self, text: &str) -> String { + self.color(&self.palette.exit_code_error.base, text) } - pub fn cyan(&self, text: &str) -> String { - self.color(&self.palette.cyan, text) + pub fn tab_count(&self, text: &str) -> String { + self.color(&self.palette.text_unselected.emphasis_1, text) } - pub fn magenta(&self, text: &str) -> String { - self.color(&self.palette.magenta, text) + pub fn shortcuts(&self, text: &str) -> String { + self.color(&self.palette.text_unselected.emphasis_3, text) } } |
