project_panel.rs

 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}