Merge pull request #1414 from zed-industries/fix-theme-issues

Fix tab bar themes
This commit is contained in:
Keith Simmons 2022-07-26 11:55:17 -07:00 committed by GitHub
commit 4ff007eaab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 123 additions and 91 deletions

View file

@ -1028,11 +1028,11 @@ impl ProjectPanel {
.with_child( .with_child(
ConstrainedBox::new(if kind == EntryKind::Dir { ConstrainedBox::new(if kind == EntryKind::Dir {
if details.is_expanded { if details.is_expanded {
Svg::new("icons/chevron_right_8.svg") Svg::new("icons/chevron_down_8.svg")
.with_color(style.icon_color) .with_color(style.icon_color)
.boxed() .boxed()
} else { } else {
Svg::new("icons/chevron_down_8.svg") Svg::new("icons/chevron_right_8.svg")
.with_color(style.icon_color) .with_color(style.icon_color)
.boxed() .boxed()
} }

View file

@ -38,11 +38,7 @@ pub struct Theme {
pub struct Workspace { pub struct Workspace {
pub background: Color, pub background: Color,
pub titlebar: Titlebar, pub titlebar: Titlebar,
pub active_pane_active_tab: Tab, pub tab_bar: TabBar,
pub active_pane_inactive_tab: Tab,
pub inactive_pane_active_tab: Tab,
pub inactive_pane_inactive_tab: Tab,
pub pane_button: Interactive<IconButton>,
pub pane_divider: Border, pub pane_divider: Border,
pub leader_border_opacity: f32, pub leader_border_opacity: f32,
pub leader_border_width: f32, pub leader_border_width: f32,
@ -72,6 +68,22 @@ pub struct Titlebar {
pub outdated_warning: ContainedText, pub outdated_warning: ContainedText,
} }
#[derive(Clone, Deserialize, Default)]
pub struct TabBar {
#[serde(flatten)]
pub container: ContainerStyle,
pub pane_button: Interactive<IconButton>,
pub active_pane: TabStyles,
pub inactive_pane: TabStyles,
pub height: f32,
}
#[derive(Clone, Deserialize, Default)]
pub struct TabStyles {
pub active_tab: Tab,
pub inactive_tab: Tab,
}
#[derive(Clone, Deserialize, Default)] #[derive(Clone, Deserialize, Default)]
pub struct AvatarRibbon { pub struct AvatarRibbon {
#[serde(flatten)] #[serde(flatten)]

View file

@ -873,6 +873,13 @@ impl Pane {
}; };
let is_pane_active = self.is_active; let is_pane_active = self.is_active;
let tab_styles = match is_pane_active {
true => theme.workspace.tab_bar.active_pane.clone(),
false => theme.workspace.tab_bar.inactive_pane.clone(),
};
let filler_style = tab_styles.inactive_tab.clone();
let mut row = Flex::row().scrollable::<Tabs, _>(1, autoscroll, cx); let mut row = Flex::row().scrollable::<Tabs, _>(1, autoscroll, cx);
for (ix, (item, detail)) in self.items.iter().zip(self.tab_details(cx)).enumerate() { for (ix, (item, detail)) in self.items.iter().zip(self.tab_details(cx)).enumerate() {
let item_id = item.id(); let item_id = item.id();
@ -890,12 +897,11 @@ impl Pane {
}; };
row.add_child({ row.add_child({
let mut tab_style = match (is_pane_active, is_tab_active) { let mut tab_style = match is_tab_active {
(true, true) => theme.workspace.active_pane_active_tab.clone(), true => tab_styles.active_tab.clone(),
(true, false) => theme.workspace.active_pane_inactive_tab.clone(), false => tab_styles.inactive_tab.clone(),
(false, true) => theme.workspace.inactive_pane_active_tab.clone(),
(false, false) => theme.workspace.inactive_pane_inactive_tab.clone(),
}; };
let title = item.tab_content(detail, &tab_style, cx); let title = item.tab_content(detail, &tab_style, cx);
if ix == 0 { if ix == 0 {
@ -1003,17 +1009,11 @@ impl Pane {
}) })
} }
let filler_style = if is_pane_active {
&theme.workspace.active_pane_inactive_tab
} else {
&theme.workspace.inactive_pane_inactive_tab
};
row.add_child( row.add_child(
Empty::new() Empty::new()
.contained() .contained()
.with_style(filler_style.container) .with_style(filler_style.container)
.with_border(theme.workspace.active_pane_active_tab.container.border) .with_border(filler_style.container.border)
.flex(0., true) .flex(0., true)
.named("filler"), .named("filler"),
); );
@ -1088,7 +1088,8 @@ impl View for Pane {
0, 0,
cx, cx,
|mouse_state, cx| { |mouse_state, cx| {
let theme = &cx.global::<Settings>().theme.workspace; let theme =
&cx.global::<Settings>().theme.workspace.tab_bar;
let style = let style =
theme.pane_button.style_for(mouse_state, false); theme.pane_button.style_for(mouse_state, false);
Svg::new("icons/split_12.svg") Svg::new("icons/split_12.svg")
@ -1118,13 +1119,7 @@ impl View for Pane {
tab_row tab_row
.constrained() .constrained()
.with_height( .with_height(cx.global::<Settings>().theme.workspace.tab_bar.height)
cx.global::<Settings>()
.theme
.workspace
.active_pane_active_tab
.height,
)
.boxed() .boxed()
}) })
.with_child(ChildView::new(&self.toolbar).boxed()) .with_child(ChildView::new(&self.toolbar).boxed())

View file

@ -0,0 +1,85 @@
import Theme from "../themes/common/theme";
import { iconColor, text, border, backgroundColor } from "./components";
export default function tabBar(theme: Theme) {
const height = 32;
const tab = {
height,
background: backgroundColor(theme, 300),
border: border(theme, "primary", {
left: true,
bottom: true,
overlay: true,
}),
iconClose: iconColor(theme, "muted"),
iconCloseActive: iconColor(theme, "active"),
iconConflict: iconColor(theme, "warning"),
iconDirty: iconColor(theme, "info"),
iconWidth: 8,
spacing: 8,
text: text(theme, "sans", "secondary", { size: "sm" }),
padding: {
left: 8,
right: 8,
},
description: {
margin: { left: 6, top: 1 },
...text(theme, "sans", "muted", { size: "2xs" })
}
};
const activePaneActiveTab = {
...tab,
background: backgroundColor(theme, 500),
text: text(theme, "sans", "active", { size: "sm" }),
border: {
...tab.border,
},
};
const inactivePaneInactiveTab = {
...tab,
background: backgroundColor(theme, 300),
text: text(theme, "sans", "muted", { size: "sm" }),
};
const inactivePaneActiveTab = {
...tab,
background: backgroundColor(theme, 500),
text: text(theme, "sans", "secondary", { size: "sm" }),
border: {
...tab.border,
},
}
return {
height,
background: backgroundColor(theme, 300),
border: border(theme, "primary", {
left: true,
bottom: true,
overlay: true,
}),
activePane: {
activeTab: activePaneActiveTab,
inactiveTab: tab,
},
inactivePane: {
activeTab: inactivePaneActiveTab,
inactiveTab: inactivePaneInactiveTab,
},
paneButton: {
color: iconColor(theme, "secondary"),
border: {
...activePaneActiveTab.border,
},
iconWidth: 12,
buttonWidth: activePaneActiveTab.height,
hover: {
color: iconColor(theme, "active"),
background: backgroundColor(theme, 300),
},
},
}
}

View file

@ -8,58 +8,13 @@ import {
text, text,
} from "./components"; } from "./components";
import statusBar from "./statusBar"; import statusBar from "./statusBar";
import tabBar from "./tabBar";
export function workspaceBackground(theme: Theme) { export function workspaceBackground(theme: Theme) {
return backgroundColor(theme, 300); return backgroundColor(theme, 300);
} }
export default function workspace(theme: Theme) { export default function workspace(theme: Theme) {
const activePaneInactiveTab = {
height: 32,
background: workspaceBackground(theme),
iconClose: iconColor(theme, "muted"),
iconCloseActive: iconColor(theme, "active"),
iconConflict: iconColor(theme, "warning"),
iconDirty: iconColor(theme, "info"),
iconWidth: 8,
spacing: 8,
text: text(theme, "sans", "secondary", { size: "sm" }),
border: border(theme, "primary", {
left: true,
bottom: true,
overlay: true,
}),
padding: {
left: 8,
right: 8,
},
description: {
margin: { left: 6, top: 1 },
...text(theme, "sans", "muted", { size: "2xs" })
}
};
const activePaneActiveTab = {
...activePaneInactiveTab,
background: backgroundColor(theme, 500),
text: text(theme, "sans", "active", { size: "sm" }),
border: {
...activePaneInactiveTab.border,
bottom: false,
},
};
const inactivePaneInactiveTab = {
...activePaneInactiveTab,
background: backgroundColor(theme, 100),
text: text(theme, "sans", "placeholder", { size: "sm" }),
};
const inactivePaneActiveTab = {
...activePaneInactiveTab,
text: text(theme, "sans", "placeholder", { size: "sm" }),
}
const titlebarPadding = 6; const titlebarPadding = 6;
return { return {
@ -74,22 +29,7 @@ export default function workspace(theme: Theme) {
}, },
leaderBorderOpacity: 0.7, leaderBorderOpacity: 0.7,
leaderBorderWidth: 2.0, leaderBorderWidth: 2.0,
activePaneActiveTab, tabBar: tabBar(theme),
activePaneInactiveTab,
inactivePaneActiveTab,
inactivePaneInactiveTab,
paneButton: {
color: iconColor(theme, "secondary"),
border: {
...activePaneActiveTab.border,
},
iconWidth: 12,
buttonWidth: activePaneActiveTab.height,
hover: {
color: iconColor(theme, "active"),
background: backgroundColor(theme, 300),
},
},
modal: { modal: {
margin: { margin: {
bottom: 52, bottom: 52,

View file

@ -130,8 +130,8 @@ export function createTheme(
const textColor = { const textColor = {
primary: sample(ramps.neutral, 6), primary: sample(ramps.neutral, 6),
secondary: sample(ramps.neutral, 5), secondary: sample(ramps.neutral, 5),
muted: sample(ramps.neutral, 5), muted: sample(ramps.neutral, 4),
placeholder: sample(ramps.neutral, 4), placeholder: sample(ramps.neutral, 3),
active: sample(ramps.neutral, 7), active: sample(ramps.neutral, 7),
feature: sample(ramps.blue, 0.5), feature: sample(ramps.blue, 0.5),
ok: sample(ramps.green, 0.5), ok: sample(ramps.green, 0.5),