1use crate::{
2 prelude::{InteractionState, ToggleState},
3 theme::theme,
4 ui::{details, input, label, list_item, IconAsset, LabelColor},
5};
6use gpui2::{
7 elements::{div, div::ScrollState},
8 style::StyleHelpers,
9 ParentElement, ViewContext,
10};
11use gpui2::{Element, IntoElement};
12use std::marker::PhantomData;
13
14#[derive(Element)]
15pub struct ProjectPanel<V: 'static> {
16 view_type: PhantomData<V>,
17 scroll_state: ScrollState,
18}
19
20pub fn project_panel<V: 'static>(scroll_state: ScrollState) -> ProjectPanel<V> {
21 ProjectPanel {
22 view_type: PhantomData,
23 scroll_state,
24 }
25}
26
27impl<V: 'static> ProjectPanel<V> {
28 fn render(&mut self, _: &mut V, cx: &mut ViewContext<V>) -> impl IntoElement<V> {
29 let theme = theme(cx);
30
31 div()
32 .w_56()
33 .h_full()
34 .flex()
35 .flex_col()
36 .fill(theme.middle.base.default.background)
37 .child(
38 div()
39 .w_56()
40 .flex()
41 .flex_col()
42 .overflow_y_scroll(self.scroll_state.clone())
43 .child(details("This is a long string that should wrap when it keeps going for a long time.").meta_text("6 h ago)"))
44 .child(
45 div().flex().flex_col().children(
46 std::iter::repeat_with(|| {
47 vec![
48 list_item(label("sqlez").color(LabelColor::Modified))
49 .left_icon(IconAsset::FolderOpen.into())
50 .indent_level(0)
51 .set_toggle(ToggleState::NotToggled),
52 list_item(label("storybook").color(LabelColor::Modified))
53 .left_icon(IconAsset::FolderOpen.into())
54 .indent_level(0)
55 .set_toggle(ToggleState::Toggled),
56 list_item(label("docs").color(LabelColor::Default))
57 .left_icon(IconAsset::Folder.into())
58 .indent_level(1)
59 .set_toggle(ToggleState::Toggled),
60 list_item(label("src").color(LabelColor::Modified))
61 .left_icon(IconAsset::FolderOpen.into())
62 .indent_level(2)
63 .set_toggle(ToggleState::Toggled),
64 list_item(label("ui").color(LabelColor::Modified))
65 .left_icon(IconAsset::FolderOpen.into())
66 .indent_level(3)
67 .set_toggle(ToggleState::Toggled),
68 list_item(label("component").color(LabelColor::Created))
69 .left_icon(IconAsset::FolderOpen.into())
70 .indent_level(4)
71 .set_toggle(ToggleState::Toggled),
72 list_item(label("facepile.rs").color(LabelColor::Default))
73 .left_icon(IconAsset::File.into())
74 .indent_level(5),
75 list_item(label("follow_group.rs").color(LabelColor::Default))
76 .left_icon(IconAsset::File.into())
77 .indent_level(5),
78 list_item(label("list_item.rs").color(LabelColor::Created))
79 .left_icon(IconAsset::File.into())
80 .indent_level(5),
81 list_item(label("tab.rs").color(LabelColor::Default))
82 .left_icon(IconAsset::File.into())
83 .indent_level(5),
84 ]
85 })
86 .take(10)
87 .flatten(),
88 ),
89 ),
90 )
91 .child(
92 input("Find something...")
93 .value("buffe".to_string())
94 .state(InteractionState::Focused),
95 )
96 }
97}