121 lines
3.7 KiB
Rust
121 lines
3.7 KiB
Rust
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::<ComponentTest>(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>) {
|
|
workspace.add_item(Box::new(cx.add_view(|_| ComponentTest::new())), cx);
|
|
}
|
|
|
|
fn toggle_disclosure(&mut self, _: &ToggleDisclosure, cx: &mut ViewContext<Self>) {
|
|
self.disclosed = !self.disclosed;
|
|
cx.notify();
|
|
}
|
|
|
|
fn toggle_toggle(&mut self, _: &ToggleToggle, cx: &mut ViewContext<Self>) {
|
|
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<Self>) -> gpui::AnyElement<Self> {
|
|
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<V: 'static>(
|
|
&self,
|
|
_: Option<usize>,
|
|
style: &theme::Tab,
|
|
_: &AppContext,
|
|
) -> gpui::AnyElement<V> {
|
|
gpui::elements::Label::new("Component test", style.label.clone()).into_any()
|
|
}
|
|
|
|
fn serialized_item_kind() -> Option<&'static str> {
|
|
Some("ComponentTest")
|
|
}
|
|
|
|
fn deserialize(
|
|
_project: ModelHandle<Project>,
|
|
_workspace: WeakViewHandle<Workspace>,
|
|
_workspace_id: WorkspaceId,
|
|
_item_id: ItemId,
|
|
cx: &mut ViewContext<Pane>,
|
|
) -> Task<anyhow::Result<ViewHandle<Self>>> {
|
|
Task::ready(Ok(cx.add_view(|_| Self::new())))
|
|
}
|
|
}
|