project_panel.rs

 1use std::marker::PhantomData;
 2use std::sync::Arc;
 3
 4use crate::prelude::*;
 5use crate::{
 6    static_project_panel_project_items, static_project_panel_single_items, theme, Input, List,
 7    ListHeader, Panel, PanelSide, Theme,
 8};
 9
10#[derive(Element)]
11pub struct ProjectPanel<V: 'static> {
12    view_type: PhantomData<V>,
13    scroll_state: ScrollState,
14    current_side: PanelSide,
15}
16
17impl<V: 'static> ProjectPanel<V> {
18    pub fn new(scroll_state: ScrollState) -> Self {
19        Self {
20            view_type: PhantomData,
21            scroll_state,
22            current_side: PanelSide::default(),
23        }
24    }
25
26    pub fn side(mut self, side: PanelSide) -> Self {
27        self.current_side = side;
28        self
29    }
30
31    fn render(&mut self, _: &mut V, cx: &mut ViewContext<V>) -> impl IntoElement<V> {
32        struct PanelPayload {
33            pub theme: Arc<Theme>,
34            pub scroll_state: ScrollState,
35        }
36
37        Panel::new(
38            self.scroll_state.clone(),
39            |_, payload| {
40                let payload = payload.downcast_ref::<PanelPayload>().unwrap();
41
42                let theme = payload.theme.clone();
43
44                vec![div()
45                    .flex()
46                    .flex_col()
47                    .w_56()
48                    .h_full()
49                    .px_2()
50                    .fill(theme.middle.base.default.background)
51                    .child(
52                        div()
53                            .w_56()
54                            .flex()
55                            .flex_col()
56                            .overflow_y_scroll(payload.scroll_state.clone())
57                            .child(
58                                List::new(static_project_panel_single_items())
59                                    .header(
60                                        ListHeader::new("FILES").set_toggle(ToggleState::Toggled),
61                                    )
62                                    .empty_message("No files in directory")
63                                    .set_toggle(ToggleState::Toggled),
64                            )
65                            .child(
66                                List::new(static_project_panel_project_items())
67                                    .header(
68                                        ListHeader::new("PROJECT").set_toggle(ToggleState::Toggled),
69                                    )
70                                    .empty_message("No folders in directory")
71                                    .set_toggle(ToggleState::Toggled),
72                            ),
73                    )
74                    .child(
75                        Input::new("Find something...")
76                            .value("buffe".to_string())
77                            .state(InteractionState::Focused),
78                    )
79                    .into_any()]
80            },
81            Box::new(PanelPayload {
82                theme: theme(cx),
83                scroll_state: self.scroll_state.clone(),
84            }),
85        )
86    }
87}