aboutsummaryrefslogtreecommitdiffstats
path: root/default-plugins/session-manager/src
diff options
context:
space:
mode:
authorMark Grey <mark.asperia@gmail.com>2025-02-07 05:59:54 -0500
committerGitHub <noreply@github.com>2025-02-07 11:59:54 +0100
commit26b99eac63869fb1209ecf39c4f9cdb21d0419ba (patch)
tree4a12d05dc3eb55b651ea90888e56932b2fb3bd73 /default-plugins/session-manager/src
parentdocs(issue-template): clarify requirements (diff)
downloadsl0ppij-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.rs5
-rw-r--r--default-plugins/session-manager/src/ui/components.rs177
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)
}
}