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}