use gpui::{ actions, elements::{Component, Flex, ParentElement, SafeStylable}, AppContext, Element, Entity, ModelHandle, Task, View, ViewContext, ViewHandle, WeakViewHandle, }; use project::Project; use theme::components::{action_button::Button, label::Label, ComponentExt}; use workspace::{ item::Item, register_deserializable_item, ItemId, Pane, PaneBackdrop, Workspace, WorkspaceId, }; pub fn init(cx: &mut AppContext) { cx.add_action(ComponentTest::toggle_disclosure); cx.add_action(ComponentTest::toggle_toggle); cx.add_action(ComponentTest::deploy); register_deserializable_item::(cx); } actions!( test, [NoAction, ToggleDisclosure, ToggleToggle, NewComponentTest] ); struct ComponentTest { disclosed: bool, toggled: bool, } impl ComponentTest { fn new() -> Self { Self { disclosed: false, toggled: false, } } fn deploy(workspace: &mut Workspace, _: &NewComponentTest, cx: &mut ViewContext) { workspace.add_item(Box::new(cx.add_view(|_| ComponentTest::new())), cx); } fn toggle_disclosure(&mut self, _: &ToggleDisclosure, cx: &mut ViewContext) { self.disclosed = !self.disclosed; cx.notify(); } fn toggle_toggle(&mut self, _: &ToggleToggle, cx: &mut ViewContext) { self.toggled = !self.toggled; cx.notify(); } } impl Entity for ComponentTest { type Event = (); } impl View for ComponentTest { fn ui_name() -> &'static str { "Component Test" } fn render(&mut self, cx: &mut gpui::ViewContext) -> gpui::AnyElement { let theme = theme::current(cx); PaneBackdrop::new( cx.view_id(), Flex::column() .with_spacing(10.) .with_child( Button::action(NoAction) .with_tooltip("Here's what a tooltip looks like", theme.tooltip.clone()) .with_contents(Label::new("Click me!")) .with_style(theme.component_test.button.clone()) .element(), ) .with_child( Button::action(ToggleToggle) .with_tooltip("Here's what a tooltip looks like", theme.tooltip.clone()) .with_contents(Label::new("Toggle me!")) .toggleable(self.toggled) .with_style(theme.component_test.toggle.clone()) .element(), ) .with_child( Label::new("A disclosure") .disclosable(Some(self.disclosed), Box::new(ToggleDisclosure)) .with_style(theme.component_test.disclosure.clone()) .element(), ) .constrained() .with_width(200.) .aligned() .into_any(), ) .into_any() } } impl Item for ComponentTest { fn tab_content( &self, _: Option, style: &theme::Tab, _: &AppContext, ) -> gpui::AnyElement { gpui::elements::Label::new("Component test", style.label.clone()).into_any() } fn serialized_item_kind() -> Option<&'static str> { Some("ComponentTest") } fn deserialize( _project: ModelHandle, _workspace: WeakViewHandle, _workspace_id: WorkspaceId, _item_id: ItemId, cx: &mut ViewContext, ) -> Task>> { Task::ready(Ok(cx.add_view(|_| Self::new()))) } }