From 38888696db1ba85964b8f1e058075ac724c98eaa Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Mon, 13 Nov 2023 19:46:15 -0500 Subject: [PATCH] Allow a button to take a color --- crates/ui2/src/components/button.rs | 33 ++++++++++-------- crates/ui2/src/components/icon.rs | 44 ++++++++++++++++++++---- crates/ui2/src/components/icon_button.rs | 6 ++-- crates/ui2/src/components/label.rs | 36 ++++++++++++------- crates/workspace2/src/workspace2.rs | 26 +++++++++++--- 5 files changed, 104 insertions(+), 41 deletions(-) diff --git a/crates/ui2/src/components/button.rs b/crates/ui2/src/components/button.rs index 5787616832e354a501e1f2e10ddf6fec6e480bea..1418a977f1f1d9a0cd0085e3e42d932c4ad4ab4f 100644 --- a/crates/ui2/src/components/button.rs +++ b/crates/ui2/src/components/button.rs @@ -87,6 +87,7 @@ pub struct Button { label: SharedString, variant: ButtonVariant, width: Option, + color: Option, } impl Button { @@ -99,6 +100,7 @@ impl Button { label: label.into(), variant: Default::default(), width: Default::default(), + color: None, } } @@ -139,25 +141,24 @@ impl Button { self } - fn label_color(&self) -> LabelColor { - if self.disabled { - LabelColor::Disabled - } else { - Default::default() - } + pub fn color(mut self, color: Option) -> Self { + self.color = color; + self } - fn icon_color(&self) -> IconColor { + pub fn label_color(&self, color: Option) -> LabelColor { if self.disabled { - IconColor::Disabled + LabelColor::Disabled + } else if let Some(color) = color { + color } else { Default::default() } } - fn render_label(&self) -> Label { + fn render_label(&self, color: LabelColor) -> Label { Label::new(self.label.clone()) - .color(self.label_color()) + .color(color) .line_height_style(LineHeightStyle::UILabel) } @@ -166,7 +167,11 @@ impl Button { } pub fn render(self, _view: &mut V, cx: &mut ViewContext) -> impl Component { - let icon_color = self.icon_color(); + let (icon_color, label_color) = match (self.disabled, self.color) { + (true, _) => (IconColor::Disabled, LabelColor::Disabled), + (_, None) => (IconColor::Default, LabelColor::Default), + (_, Some(color)) => (IconColor::from(color), color), + }; let mut button = h_stack() .id(SharedString::from(format!("{}", self.label))) @@ -182,16 +187,16 @@ impl Button { (Some(_), Some(IconPosition::Left)) => { button = button .gap_1() - .child(self.render_label()) + .child(self.render_label(label_color)) .children(self.render_icon(icon_color)) } (Some(_), Some(IconPosition::Right)) => { button = button .gap_1() .children(self.render_icon(icon_color)) - .child(self.render_label()) + .child(self.render_label(label_color)) } - (_, _) => button = button.child(self.render_label()), + (_, _) => button = button.child(self.render_label(label_color)), } if let Some(width) = self.width { diff --git a/crates/ui2/src/components/icon.rs b/crates/ui2/src/components/icon.rs index 907f3f91871b5c614944e821244d10228d2853bb..75c8129608f8b1fda354461102afc5387806ce20 100644 --- a/crates/ui2/src/components/icon.rs +++ b/crates/ui2/src/components/icon.rs @@ -1,7 +1,7 @@ use gpui::{rems, svg, Hsla}; use strum::EnumIter; -use crate::prelude::*; +use crate::{prelude::*, LabelColor}; #[derive(Default, PartialEq, Copy, Clone)] pub enum IconSize { @@ -14,15 +14,20 @@ pub enum IconSize { pub enum IconColor { #[default] Default, - Muted, - Disabled, - Placeholder, Accent, + Created, + Deleted, + Disabled, Error, - Warning, - Success, + Hidden, Info, + Modified, + Muted, + Placeholder, + Player(u32), Selected, + Success, + Warning, } impl IconColor { @@ -38,6 +43,33 @@ impl IconColor { IconColor::Success => cx.theme().status().success, IconColor::Info => cx.theme().status().info, IconColor::Selected => cx.theme().colors().icon_accent, + IconColor::Player(i) => cx.theme().styles.player.0[i.clone() as usize].cursor, + IconColor::Created => cx.theme().status().created, + IconColor::Modified => cx.theme().status().modified, + IconColor::Deleted => cx.theme().status().deleted, + IconColor::Hidden => cx.theme().status().hidden, + } + } +} + +impl From for IconColor { + fn from(label: LabelColor) -> Self { + match label { + LabelColor::Default => IconColor::Default, + LabelColor::Muted => IconColor::Muted, + LabelColor::Disabled => IconColor::Disabled, + LabelColor::Placeholder => IconColor::Placeholder, + LabelColor::Accent => IconColor::Accent, + LabelColor::Error => IconColor::Error, + LabelColor::Warning => IconColor::Warning, + LabelColor::Success => IconColor::Success, + LabelColor::Info => IconColor::Info, + LabelColor::Selected => IconColor::Selected, + LabelColor::Player(i) => IconColor::Player(i), + LabelColor::Created => IconColor::Created, + LabelColor::Modified => IconColor::Modified, + LabelColor::Deleted => IconColor::Deleted, + LabelColor::Hidden => IconColor::Hidden, } } } diff --git a/crates/ui2/src/components/icon_button.rs b/crates/ui2/src/components/icon_button.rs index 91653ea8cdd0158d88294886b826c680b5cbf9b3..b648683a8b32e6782d9ffb1013bf7e783ca9282d 100644 --- a/crates/ui2/src/components/icon_button.rs +++ b/crates/ui2/src/components/icon_button.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use gpui::{rems, MouseButton}; +use gpui::MouseButton; use crate::{h_stack, prelude::*}; use crate::{ClickHandler, Icon, IconColor, IconElement}; @@ -88,9 +88,7 @@ impl IconButton { .id(self.id.clone()) .justify_center() .rounded_md() - // todo!("Where do these numbers come from?") - .py(rems(0.21875)) - .px(rems(0.375)) + .p_1() .bg(bg_color) .hover(|style| style.bg(bg_hover_color)) .active(|style| style.bg(bg_active_color)) diff --git a/crates/ui2/src/components/label.rs b/crates/ui2/src/components/label.rs index 827ba87918a0cd4dd3f3255c8b7852436ea06a79..d1d2e0cc9deb5cca89036d9e7121e996473dc092 100644 --- a/crates/ui2/src/components/label.rs +++ b/crates/ui2/src/components/label.rs @@ -8,28 +8,40 @@ use crate::styled_ext::StyledExt; pub enum LabelColor { #[default] Default, - Muted, + Accent, Created, - Modified, Deleted, Disabled, + Error, Hidden, + Info, + Modified, + Muted, Placeholder, - Accent, + Player(u32), + Selected, + Success, + Warning, } impl LabelColor { pub fn hsla(&self, cx: &WindowContext) -> Hsla { match self { - Self::Default => cx.theme().colors().text, - Self::Muted => cx.theme().colors().text_muted, - Self::Created => cx.theme().status().created, - Self::Modified => cx.theme().status().modified, - Self::Deleted => cx.theme().status().deleted, - Self::Disabled => cx.theme().colors().text_disabled, - Self::Hidden => cx.theme().status().hidden, - Self::Placeholder => cx.theme().colors().text_placeholder, - Self::Accent => cx.theme().colors().text_accent, + LabelColor::Default => cx.theme().colors().text, + LabelColor::Muted => cx.theme().colors().text_muted, + LabelColor::Created => cx.theme().status().created, + LabelColor::Modified => cx.theme().status().modified, + LabelColor::Deleted => cx.theme().status().deleted, + LabelColor::Disabled => cx.theme().colors().text_disabled, + LabelColor::Hidden => cx.theme().status().hidden, + LabelColor::Info => cx.theme().status().info, + LabelColor::Placeholder => cx.theme().colors().text_placeholder, + LabelColor::Accent => cx.theme().colors().text_accent, + LabelColor::Player(i) => cx.theme().styles.player.0[i.clone() as usize].cursor, + LabelColor::Error => cx.theme().status().error, + LabelColor::Selected => cx.theme().colors().text_accent, + LabelColor::Success => cx.theme().status().success, + LabelColor::Warning => cx.theme().status().warning, } } } diff --git a/crates/workspace2/src/workspace2.rs b/crates/workspace2/src/workspace2.rs index 14a7685a9bff1f91d2171a807bddb83f42cff9b9..d55d38209a77050bbf542380f891974b86d33612 100644 --- a/crates/workspace2/src/workspace2.rs +++ b/crates/workspace2/src/workspace2.rs @@ -69,7 +69,7 @@ use std::{ }; use theme2::ActiveTheme; pub use toolbar::{ToolbarItemLocation, ToolbarItemView}; -use ui::{h_stack, Label}; +use ui::{h_stack, Button, ButtonVariant, Label, LabelColor}; use util::ResultExt; use uuid::Uuid; use workspace_settings::{AutosaveSetting, WorkspaceSettings}; @@ -2641,19 +2641,35 @@ impl Workspace { h_stack() .id("titlebar") .justify_between() - .w_full() - .h(rems(1.75)) - .bg(cx.theme().colors().title_bar_background) .when( !matches!(cx.window_bounds(), WindowBounds::Fullscreen), |s| s.pl_20(), ) + .w_full() + .h(rems(1.75)) + .bg(cx.theme().colors().title_bar_background) .on_click(|_, event, cx| { if event.up.click_count == 2 { cx.zoom_window(); } }) - .child(h_stack().child(Label::new("Left side titlebar item"))) // self.titlebar_item + .child( + h_stack() + // TODO - Add player menu + .child( + Button::new("player") + .variant(ButtonVariant::Ghost) + .color(Some(LabelColor::Player(0))), + ) + // TODO - Add project menu + .child(Button::new("project_name").variant(ButtonVariant::Ghost)) + // TODO - Add git menu + .child( + Button::new("branch_name") + .variant(ButtonVariant::Ghost) + .color(Some(LabelColor::Muted)), + ), + ) // self.titlebar_item .child(h_stack().child(Label::new("Right side titlebar item"))) }