This refactor enhances the overall design by promoting reusable and composable UI component structures within the Zed project codebase.
79 lines
2.3 KiB
Rust
79 lines
2.3 KiB
Rust
use crate::prelude::*;
|
|
use crate::{v_stack, ButtonGroup};
|
|
|
|
#[derive(Component)]
|
|
pub struct Details<V: 'static> {
|
|
text: &'static str,
|
|
meta: Option<&'static str>,
|
|
actions: Option<ButtonGroup<V>>,
|
|
}
|
|
|
|
impl<V: 'static> Details<V> {
|
|
pub fn new(text: &'static str) -> Self {
|
|
Self {
|
|
text,
|
|
meta: None,
|
|
actions: None,
|
|
}
|
|
}
|
|
|
|
pub fn meta_text(mut self, meta: &'static str) -> Self {
|
|
self.meta = Some(meta);
|
|
self
|
|
}
|
|
|
|
pub fn actions(mut self, actions: ButtonGroup<V>) -> Self {
|
|
self.actions = Some(actions);
|
|
self
|
|
}
|
|
|
|
fn render(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Element<V> {
|
|
v_stack()
|
|
.p_1()
|
|
.gap_0p5()
|
|
.text_ui_sm()
|
|
.text_color(cx.theme().colors().text)
|
|
.size_full()
|
|
.child(self.text)
|
|
.children(self.meta.map(|m| m))
|
|
.children(self.actions.map(|a| a))
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "stories")]
|
|
pub use stories::*;
|
|
|
|
#[cfg(feature = "stories")]
|
|
mod stories {
|
|
use super::*;
|
|
use crate::{Button, Story};
|
|
use gpui::{Div, Render};
|
|
|
|
pub struct DetailsStory;
|
|
|
|
impl Render for DetailsStory {
|
|
type Element = Div<Self>;
|
|
|
|
fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
|
|
Story::container(cx)
|
|
.child(Story::title_for::<_, Details<Self>>(cx))
|
|
.child(Story::label(cx, "Default"))
|
|
.child(Details::new("The quick brown fox jumps over the lazy dog"))
|
|
.child(Story::label(cx, "With meta"))
|
|
.child(
|
|
Details::new("The quick brown fox jumps over the lazy dog")
|
|
.meta_text("Sphinx of black quartz, judge my vow."),
|
|
)
|
|
.child(Story::label(cx, "With meta and actions"))
|
|
.child(
|
|
Details::new("The quick brown fox jumps over the lazy dog")
|
|
.meta_text("Sphinx of black quartz, judge my vow.")
|
|
.actions(ButtonGroup::new(vec![
|
|
Button::new("Decline"),
|
|
Button::new("Accept").variant(crate::ButtonVariant::Filled),
|
|
])),
|
|
)
|
|
}
|
|
}
|
|
}
|