Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(compact-bar): mouse-click in simplified-ui #1917

Merged
merged 2 commits into from
Nov 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 29 additions & 3 deletions default-plugins/compact-bar/src/line.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,23 @@ fn populate_tabs_in_tab_line(
loop {
let left_count = tabs_before_active.len();
let right_count = tabs_after_active.len();
let collapsed_left = left_more_message(left_count, palette, tab_separator(capabilities));
let collapsed_right = right_more_message(right_count, palette, tab_separator(capabilities));

// left_more_tab_index is the tab to the left of the leftmost visible tab
let left_more_tab_index = left_count.saturating_sub(1);
let collapsed_left = left_more_message(
left_count,
palette,
tab_separator(capabilities),
left_more_tab_index,
);
// right_more_tab_index is the tab to the right of the rightmost visible tab
let right_more_tab_index = left_count + tabs_to_render.len();
let collapsed_right = right_more_message(
right_count,
palette,
tab_separator(capabilities),
right_more_tab_index,
);

let total_size = collapsed_left.len + middle_size + collapsed_right.len;

Expand Down Expand Up @@ -90,7 +105,12 @@ fn populate_tabs_in_tab_line(
}
}

fn left_more_message(tab_count_to_the_left: usize, palette: Palette, separator: &str) -> LinePart {
fn left_more_message(
tab_count_to_the_left: usize,
palette: Palette,
separator: &str,
tab_index: usize,
) -> LinePart {
if tab_count_to_the_left == 0 {
return LinePart::default();
}
Expand All @@ -114,13 +134,15 @@ fn left_more_message(tab_count_to_the_left: usize, palette: Palette, separator:
LinePart {
part: more_styled_text,
len: more_text_len,
tab_index: Some(tab_index),
}
}

fn right_more_message(
tab_count_to_the_right: usize,
palette: Palette,
separator: &str,
tab_index: usize,
) -> LinePart {
if tab_count_to_the_right == 0 {
return LinePart::default();
Expand All @@ -144,6 +166,7 @@ fn right_more_message(
LinePart {
part: more_styled_text,
len: more_text_len,
tab_index: Some(tab_index),
}
}

Expand Down Expand Up @@ -173,6 +196,7 @@ fn tab_line_prefix(
let mut parts = vec![LinePart {
part: prefix_styled_text.to_string(),
len: prefix_text_len,
tab_index: None,
}];
if let Some(name) = session_name {
let name_part = format!("({}) ", name);
Expand All @@ -186,6 +210,7 @@ fn tab_line_prefix(
parts.push(LinePart {
part: name_part_styled_text.to_string(),
len: name_part_len,
tab_index: None,
})
}
}
Expand All @@ -209,6 +234,7 @@ fn tab_line_prefix(
parts.push(LinePart {
part: format!("{}", mode_part_styled_text),
len: mode_part_len,
tab_index: None,
})
}
parts
Expand Down
19 changes: 9 additions & 10 deletions default-plugins/compact-bar/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use crate::tab::tab_style;
pub struct LinePart {
part: String,
len: usize,
tab_index: Option<usize>,
}

#[derive(Default)]
Expand Down Expand Up @@ -88,12 +89,10 @@ impl ZellijPlugin for State {
}
let tab = tab_style(
tabname,
t.active,
t,
is_alternate_tab,
t.is_sync_panes_active,
self.mode_info.style.colors,
self.mode_info.capabilities,
t.other_focused_clients.as_slice(),
);
is_alternate_tab = !is_alternate_tab;
all_tabs.push(tab);
Expand All @@ -109,17 +108,17 @@ impl ZellijPlugin for State {
);
let mut s = String::new();
let mut len_cnt = 0;
for (idx, bar_part) in tab_line.iter().enumerate() {
for bar_part in tab_line {
s = format!("{}{}", s, &bar_part.part);

if self.should_render
&& self.mouse_click_pos > len_cnt
&& self.mouse_click_pos <= len_cnt + bar_part.len
&& idx > 3
&& self.mouse_click_pos >= len_cnt
&& self.mouse_click_pos < len_cnt + bar_part.len
&& bar_part.tab_index.is_some()
{
// First three elements of tab_line are "Zellij", session name and mode, hence the idx > 3 condition.
// Tabs are indexed starting from 1, therefore we need subtract 3 below.
switch_tab_to(TryInto::<u32>::try_into(idx).unwrap() - 3);
// Tabs are indexed starting from 1, therefore we need add 1 to tab_index.
let tab_index: u32 = bar_part.tab_index.unwrap().try_into().unwrap();
switch_tab_to(tab_index + 1);
}
len_cnt += bar_part.len;
}
Expand Down
43 changes: 16 additions & 27 deletions default-plugins/compact-bar/src/tab.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,19 @@ fn cursors(focused_clients: &[ClientId], palette: Palette) -> (Vec<ANSIString>,

pub fn render_tab(
text: String,
tab: &TabInfo,
is_alternate_tab: bool,
palette: Palette,
separator: &str,
focused_clients: &[ClientId],
active: bool,
is_alternate_tab: bool,
) -> LinePart {
let focused_clients = tab.other_focused_clients.as_slice();
let separator_width = separator.width();
let alternate_tab_color = match palette.theme_hue {
// TODO: only do this if we don't have the arrow capabilities
ThemeHue::Dark => palette.white,
ThemeHue::Light => palette.black,
};
let background_color = if active {
let background_color = if tab.active {
palette.green
} else if is_alternate_tab {
alternate_tab_color
Expand All @@ -43,8 +43,7 @@ pub fn render_tab(
ThemeHue::Light => palette.white,
};
let left_separator = style!(foreground_color, background_color).paint(separator);
let mut tab_text_len =
text.width() + (separator_width * 2) + separator.width() * (separator_width * 2); // 2 for left and right separators, 2 for the text padding
let mut tab_text_len = text.width() + (separator_width * 2) + 2; // + 2 for padding

let tab_styled_text = style!(foreground_color, background_color)
.bold()
Expand Down Expand Up @@ -78,35 +77,25 @@ pub fn render_tab(
LinePart {
part: tab_styled_text,
len: tab_text_len,
tab_index: Some(tab.position),
}
}

pub fn tab_style(
text: String,
is_active_tab: bool,
is_alternate_tab: bool,
is_sync_panes_active: bool,
mut tabname: String,
tab: &TabInfo,
mut is_alternate_tab: 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 tab.is_sync_panes_active {
tabname.push_str(" (Sync)");
}
// we only color alternate tabs differently if we can't use the arrow fonts to separate them
let is_alternate_tab = if !capabilities.arrow_fonts {
false
} else {
is_alternate_tab
};
render_tab(
tab_text,
palette,
separator,
focused_clients,
is_active_tab,
is_alternate_tab,
)
if !capabilities.arrow_fonts {
is_alternate_tab = false;
}

render_tab(tabname, tab, is_alternate_tab, palette, separator)
}