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