tab indicator: Add corner-radius setting

This commit is contained in:
Ivan Molodetskikh
2025-02-12 07:59:21 +03:00
parent 213eafa203
commit 7e552333a9
3 changed files with 68 additions and 1 deletions
+14
View File
@@ -697,6 +697,8 @@ pub struct TabIndicator {
pub position: TabIndicatorPosition, pub position: TabIndicatorPosition,
#[knuffel(child, unwrap(argument), default = Self::default().gaps_between_tabs)] #[knuffel(child, unwrap(argument), default = Self::default().gaps_between_tabs)]
pub gaps_between_tabs: FloatOrInt<0, 65535>, pub gaps_between_tabs: FloatOrInt<0, 65535>,
#[knuffel(child, unwrap(argument), default = Self::default().corner_radius)]
pub corner_radius: FloatOrInt<0, 65535>,
#[knuffel(child)] #[knuffel(child)]
pub active_color: Option<Color>, pub active_color: Option<Color>,
#[knuffel(child)] #[knuffel(child)]
@@ -720,6 +722,7 @@ impl Default for TabIndicator {
}, },
position: TabIndicatorPosition::Left, position: TabIndicatorPosition::Left,
gaps_between_tabs: FloatOrInt(0.), gaps_between_tabs: FloatOrInt(0.),
corner_radius: FloatOrInt(0.),
active_color: None, active_color: None,
inactive_color: None, inactive_color: None,
active_gradient: None, active_gradient: None,
@@ -1234,6 +1237,17 @@ impl From<CornerRadius> for [f32; 4] {
} }
} }
impl From<f32> for CornerRadius {
fn from(value: f32) -> Self {
Self {
top_left: value,
top_right: value,
bottom_right: value,
bottom_left: value,
}
}
}
#[derive(knuffel::DecodeScalar, Debug, Clone, Copy, PartialEq, Eq)] #[derive(knuffel::DecodeScalar, Debug, Clone, Copy, PartialEq, Eq)]
pub enum BlockOutFrom { pub enum BlockOutFrom {
Screencast, Screencast,
+50 -1
View File
@@ -180,6 +180,11 @@ impl TabIndicator {
self.shaders.resize_with(count, Default::default); self.shaders.resize_with(count, Default::default);
self.shader_locs.resize_with(count, Default::default); self.shader_locs.resize_with(count, Default::default);
let position = self.config.position;
let radius = self.config.corner_radius.0 as f32;
let shared_rounded_corners = self.config.gaps_between_tabs.0 == 0.;
let mut tabs_left = tab_count;
let rects = self.tab_rects(area, count, scale); let rects = self.tab_rects(area, count, scale);
for ((shader, loc), (tab, rect)) in zip( for ((shader, loc), (tab, rect)) in zip(
zip(&mut self.shaders, &mut self.shader_locs), zip(&mut self.shaders, &mut self.shader_locs),
@@ -200,6 +205,50 @@ impl TabIndicator {
color_to *= 0.5; color_to *= 0.5;
} }
let radius = if shared_rounded_corners && tab_count > 1 {
if tabs_left == tab_count {
// First tab.
match position {
TabIndicatorPosition::Left | TabIndicatorPosition::Right => CornerRadius {
top_left: radius,
top_right: radius,
bottom_right: 0.,
bottom_left: 0.,
},
TabIndicatorPosition::Top | TabIndicatorPosition::Bottom => CornerRadius {
top_left: radius,
top_right: 0.,
bottom_right: 0.,
bottom_left: radius,
},
}
} else if tabs_left == 1 {
// Last tab.
match position {
TabIndicatorPosition::Left | TabIndicatorPosition::Right => CornerRadius {
top_left: 0.,
top_right: 0.,
bottom_right: radius,
bottom_left: radius,
},
TabIndicatorPosition::Top | TabIndicatorPosition::Bottom => CornerRadius {
top_left: 0.,
top_right: radius,
bottom_right: radius,
bottom_left: 0.,
},
}
} else {
// Tab in the middle.
CornerRadius::default()
}
} else {
// Separate tabs, or the only tab.
CornerRadius::from(radius)
};
let radius = radius.fit_to(rect.size.w as f32, rect.size.h as f32);
tabs_left -= 1;
shader.update( shader.update(
rect.size, rect.size,
gradient_area, gradient_area,
@@ -209,7 +258,7 @@ impl TabIndicator {
((tab.gradient.angle as f32) - 90.).to_radians(), ((tab.gradient.angle as f32) - 90.).to_radians(),
Rectangle::from_size(rect.size), Rectangle::from_size(rect.size),
0., 0.,
CornerRadius::default(), radius,
scale as f32, scale as f32,
1., 1.,
); );
+4
View File
@@ -63,6 +63,7 @@ layout {
length total-proportion=1.0 length total-proportion=1.0
position "right" position "right"
gaps-between-tabs 2 gaps-between-tabs 2
corner-radius 8
active-color "red" active-color "red"
inactive-color "gray" inactive-color "gray"
// active-gradient from="#80c8ff" to="#bbddff" angle=45 // active-gradient from="#80c8ff" to="#bbddff" angle=45
@@ -439,6 +440,9 @@ It can be `left`, `right`, `top`, or `bottom`.
`gaps-between-tabs` controls the gap between individual tabs in logical pixels. `gaps-between-tabs` controls the gap between individual tabs in logical pixels.
`corner-radius` sets the rounded corner radius for tabs in the indicator in logical pixels.
When `gaps-between-tabs` is zero, only the first and the last tabs have rounded corners, otherwise all tabs do.
`active-color`, `inactive-color`, `active-gradient`, `inactive-gradient` let you override the colors for the tabs. `active-color`, `inactive-color`, `active-gradient`, `inactive-gradient` let you override the colors for the tabs.
They have the same semantics as the border and focus ring colors and gradients. They have the same semantics as the border and focus ring colors and gradients.