use std::marker::PhantomData; use crate::prelude::*; use crate::{ static_project_panel_project_items, static_project_panel_single_items, Input, List, ListHeader, }; #[derive(Element)] pub struct ProjectPanel { id: ElementId, state_type: PhantomData, } impl ProjectPanel { pub fn new(id: impl Into) -> Self { Self { id: id.into(), state_type: PhantomData, } } fn render(&mut self, _view: &mut S, cx: &mut ViewContext) -> impl Element { let color = ThemeColor::new(cx); let color = ThemeColor::new(cx); div() .id(self.id.clone()) .flex() .flex_col() .w_full() .h_full() .bg(color.surface) .child( div() .id("project-panel-contents") .w_full() .flex() .flex_col() .overflow_y_scroll() .child( List::new(static_project_panel_single_items()) .header(ListHeader::new("FILES").set_toggle(ToggleState::Toggled)) .empty_message("No files in directory") .set_toggle(ToggleState::Toggled), ) .child( List::new(static_project_panel_project_items()) .header(ListHeader::new("PROJECT").set_toggle(ToggleState::Toggled)) .empty_message("No folders in directory") .set_toggle(ToggleState::Toggled), ), ) .child( Input::new("Find something...") .value("buffe".to_string()) .state(InteractionState::Focused), ) } } use gpui3::ElementId; #[cfg(feature = "stories")] pub use stories::*; #[cfg(feature = "stories")] mod stories { use crate::{Panel, Story}; use super::*; #[derive(Element)] pub struct ProjectPanelStory { state_type: PhantomData, } impl ProjectPanelStory { pub fn new() -> Self { Self { state_type: PhantomData, } } fn render( &mut self, _view: &mut S, cx: &mut ViewContext, ) -> impl Element { Story::container(cx) .child(Story::title_for::<_, ProjectPanel>(cx)) .child(Story::label(cx, "Default")) .child( Panel::new("project-panel-outer", cx) .child(ProjectPanel::new("project-panel-inner")), ) } } }