Bring UI crate up to date
This commit is contained in:
parent
66358f2900
commit
f54634aeb2
24 changed files with 1090 additions and 167 deletions
|
@ -1,17 +1,18 @@
|
|||
use gpui2::elements::div;
|
||||
use gpui2::geometry::rems;
|
||||
use crate::prelude::{DisclosureControlVisibility, InteractionState, ToggleState};
|
||||
use crate::theme::theme;
|
||||
use crate::tokens::token;
|
||||
use crate::{icon, IconAsset, Label};
|
||||
use gpui2::style::{StyleHelpers, Styleable};
|
||||
use gpui2::{Element, IntoElement, ParentElement, ViewContext};
|
||||
use gpui2::{elements::div, IntoElement};
|
||||
use gpui2::{Element, ParentElement, ViewContext};
|
||||
|
||||
use crate::prelude::*;
|
||||
use crate::{icon, theme, IconAsset, Label};
|
||||
|
||||
#[derive(Element)]
|
||||
#[derive(Element, Clone)]
|
||||
pub struct ListItem {
|
||||
label: Label,
|
||||
left_icon: Option<IconAsset>,
|
||||
indent_level: u32,
|
||||
state: InteractionState,
|
||||
disclosure_control_style: DisclosureControlVisibility,
|
||||
toggle: Option<ToggleState>,
|
||||
}
|
||||
|
||||
|
@ -20,6 +21,7 @@ pub fn list_item(label: Label) -> ListItem {
|
|||
label,
|
||||
indent_level: 0,
|
||||
left_icon: None,
|
||||
disclosure_control_style: DisclosureControlVisibility::default(),
|
||||
state: InteractionState::default(),
|
||||
toggle: None,
|
||||
}
|
||||
|
@ -46,8 +48,30 @@ impl ListItem {
|
|||
self
|
||||
}
|
||||
|
||||
pub fn disclosure_control_style(
|
||||
mut self,
|
||||
disclosure_control_style: DisclosureControlVisibility,
|
||||
) -> Self {
|
||||
self.disclosure_control_style = disclosure_control_style;
|
||||
self
|
||||
}
|
||||
|
||||
fn render<V: 'static>(&mut self, _: &mut V, cx: &mut ViewContext<V>) -> impl IntoElement<V> {
|
||||
let theme = theme(cx);
|
||||
let token = token();
|
||||
let mut disclosure_control = match self.toggle {
|
||||
Some(ToggleState::NotToggled) => Some(div().child(icon(IconAsset::ChevronRight))),
|
||||
Some(ToggleState::Toggled) => Some(div().child(icon(IconAsset::ChevronDown))),
|
||||
None => Some(div()),
|
||||
};
|
||||
|
||||
match self.disclosure_control_style {
|
||||
DisclosureControlVisibility::OnHover => {
|
||||
disclosure_control =
|
||||
disclosure_control.map(|c| div().absolute().neg_left_5().child(c));
|
||||
}
|
||||
DisclosureControlVisibility::Always => {}
|
||||
}
|
||||
|
||||
div()
|
||||
.fill(theme.middle.base.default.background)
|
||||
|
@ -56,31 +80,31 @@ impl ListItem {
|
|||
.active()
|
||||
.fill(theme.middle.base.pressed.background)
|
||||
.relative()
|
||||
.py_1()
|
||||
.child(
|
||||
div()
|
||||
.h_7()
|
||||
.h_6()
|
||||
.px_2()
|
||||
// .ml(rems(0.75 * self.indent_level as f32))
|
||||
.children((0..self.indent_level).map(|_| {
|
||||
div().w(rems(0.75)).h_full().flex().justify_center().child(
|
||||
div()
|
||||
.w_px()
|
||||
.h_full()
|
||||
.fill(theme.middle.base.default.border)
|
||||
.hover()
|
||||
.fill(theme.middle.warning.default.border)
|
||||
.active()
|
||||
.fill(theme.middle.negative.default.border),
|
||||
)
|
||||
div()
|
||||
.w(token.list_indent_depth)
|
||||
.h_full()
|
||||
.flex()
|
||||
.justify_center()
|
||||
.child(
|
||||
div()
|
||||
.ml_px()
|
||||
.w_px()
|
||||
.h_full()
|
||||
.fill(theme.middle.base.default.border),
|
||||
)
|
||||
}))
|
||||
.flex()
|
||||
.gap_2()
|
||||
.gap_1()
|
||||
.items_center()
|
||||
.children(match self.toggle {
|
||||
Some(ToggleState::NotToggled) => Some(icon(IconAsset::ChevronRight)),
|
||||
Some(ToggleState::Toggled) => Some(icon(IconAsset::ChevronDown)),
|
||||
None => None,
|
||||
})
|
||||
.relative()
|
||||
.children(disclosure_control)
|
||||
.children(self.left_icon.map(|i| icon(i)))
|
||||
.child(self.label.clone()),
|
||||
)
|
||||
|
|
88
crates/ui/src/components/list_section_header.rs
Normal file
88
crates/ui/src/components/list_section_header.rs
Normal file
|
@ -0,0 +1,88 @@
|
|||
use crate::prelude::{InteractionState, ToggleState};
|
||||
use crate::theme::theme;
|
||||
use crate::tokens::token;
|
||||
use crate::{icon, label, IconAsset, LabelColor, LabelSize};
|
||||
use gpui2::style::{StyleHelpers, Styleable};
|
||||
use gpui2::{elements::div, IntoElement};
|
||||
use gpui2::{Element, ParentElement, ViewContext};
|
||||
|
||||
#[derive(Element, Clone, Copy)]
|
||||
pub struct ListSectionHeader {
|
||||
label: &'static str,
|
||||
left_icon: Option<IconAsset>,
|
||||
state: InteractionState,
|
||||
toggle: Option<ToggleState>,
|
||||
}
|
||||
|
||||
pub fn list_section_header(label: &'static str) -> ListSectionHeader {
|
||||
ListSectionHeader {
|
||||
label,
|
||||
left_icon: None,
|
||||
state: InteractionState::default(),
|
||||
toggle: None,
|
||||
}
|
||||
}
|
||||
|
||||
impl ListSectionHeader {
|
||||
pub fn set_toggle(mut self, toggle: ToggleState) -> Self {
|
||||
self.toggle = Some(toggle);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn left_icon(mut self, left_icon: Option<IconAsset>) -> Self {
|
||||
self.left_icon = left_icon;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn state(mut self, state: InteractionState) -> Self {
|
||||
self.state = state;
|
||||
self
|
||||
}
|
||||
|
||||
fn render<V: 'static>(&mut self, _: &mut V, cx: &mut ViewContext<V>) -> impl IntoElement<V> {
|
||||
let theme = theme(cx);
|
||||
let token = token();
|
||||
|
||||
let disclosure_control = match self.toggle {
|
||||
Some(ToggleState::NotToggled) => Some(div().child(icon(IconAsset::ChevronRight))),
|
||||
Some(ToggleState::Toggled) => Some(div().child(icon(IconAsset::ChevronDown))),
|
||||
None => Some(div()),
|
||||
};
|
||||
|
||||
div()
|
||||
.flex()
|
||||
.flex_1()
|
||||
.w_full()
|
||||
.fill(theme.middle.base.default.background)
|
||||
.hover()
|
||||
.fill(theme.middle.base.hovered.background)
|
||||
.active()
|
||||
.fill(theme.middle.base.pressed.background)
|
||||
.relative()
|
||||
.py_1()
|
||||
.child(
|
||||
div()
|
||||
.h_6()
|
||||
.px_2()
|
||||
.flex()
|
||||
.flex_1()
|
||||
.w_full()
|
||||
.gap_1()
|
||||
.items_center()
|
||||
.justify_between()
|
||||
.child(
|
||||
div()
|
||||
.flex()
|
||||
.gap_1()
|
||||
.items_center()
|
||||
.children(self.left_icon.map(|i| icon(i)))
|
||||
.child(
|
||||
label(self.label.clone())
|
||||
.color(LabelColor::Muted)
|
||||
.size(LabelSize::Small),
|
||||
),
|
||||
)
|
||||
.children(disclosure_control),
|
||||
)
|
||||
}
|
||||
}
|
63
crates/ui/src/components/palette_item.rs
Normal file
63
crates/ui/src/components/palette_item.rs
Normal file
|
@ -0,0 +1,63 @@
|
|||
use crate::theme::theme;
|
||||
use crate::{label, LabelColor, LabelSize};
|
||||
use gpui2::elements::div;
|
||||
use gpui2::style::StyleHelpers;
|
||||
use gpui2::{Element, IntoElement};
|
||||
use gpui2::{ParentElement, ViewContext};
|
||||
|
||||
#[derive(Element)]
|
||||
pub struct PaletteItem {
|
||||
pub label: &'static str,
|
||||
pub keybinding: Option<&'static str>,
|
||||
}
|
||||
|
||||
pub fn palette_item(label: &'static str, keybinding: Option<&'static str>) -> PaletteItem {
|
||||
PaletteItem { label, keybinding }
|
||||
}
|
||||
|
||||
impl PaletteItem {
|
||||
pub fn label(mut self, label: &'static str) -> Self {
|
||||
self.label = label;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn keybinding(mut self, keybinding: Option<&'static str>) -> Self {
|
||||
self.keybinding = keybinding;
|
||||
self
|
||||
}
|
||||
|
||||
fn render<V: 'static>(&mut self, _: &mut V, cx: &mut ViewContext<V>) -> impl IntoElement<V> {
|
||||
let theme = theme(cx);
|
||||
|
||||
let keybinding_label = match self.keybinding {
|
||||
Some(keybind) => label(keybind)
|
||||
.color(LabelColor::Muted)
|
||||
.size(LabelSize::Small),
|
||||
None => label(""),
|
||||
};
|
||||
|
||||
div()
|
||||
.flex()
|
||||
.flex_row()
|
||||
.grow()
|
||||
.justify_between()
|
||||
.child(label(self.label))
|
||||
.child(
|
||||
self.keybinding
|
||||
.map(|_| {
|
||||
div()
|
||||
.flex()
|
||||
.items_center()
|
||||
.justify_center()
|
||||
.px_1()
|
||||
.py_0()
|
||||
.my_0p5()
|
||||
.rounded_md()
|
||||
.text_sm()
|
||||
.fill(theme.lowest.on.default.background)
|
||||
.child(keybinding_label)
|
||||
})
|
||||
.unwrap_or_else(|| div()),
|
||||
)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue