gpui_router/
nav_link.rs

1use crate::use_navigate;
2use gpui::*;
3use smallvec::SmallVec;
4
5pub fn nav_link() -> impl IntoElement {
6  NavLink::new().active(|style| style)
7}
8
9#[derive(IntoElement)]
10pub struct NavLink {
11  base: Div,
12  children: SmallVec<[AnyElement; 1]>,
13  to: SharedString,
14  // is_active: bool,
15}
16
17impl Default for NavLink {
18  fn default() -> Self {
19    Self {
20      base: div(),
21      children: Default::default(),
22      to: Default::default(),
23    }
24  }
25}
26
27impl Styled for NavLink {
28  fn style(&mut self) -> &mut StyleRefinement {
29    self.base.style()
30  }
31}
32
33impl ParentElement for NavLink {
34  fn extend(&mut self, elements: impl IntoIterator<Item = AnyElement>) {
35    self.children.extend(elements);
36  }
37}
38
39impl InteractiveElement for NavLink {
40  fn interactivity(&mut self) -> &mut gpui::Interactivity {
41    self.base.interactivity()
42  }
43}
44
45impl NavLink {
46  pub fn new() -> Self {
47    Default::default()
48  }
49
50  pub fn to(mut self, to: impl Into<SharedString>) -> Self {
51    self.to = to.into();
52    self
53  }
54
55  pub fn active(self, _f: impl FnOnce(StyleRefinement) -> StyleRefinement) -> Self {
56    unimplemented!()
57  }
58}
59
60impl RenderOnce for NavLink {
61  fn render(self, _window: &mut Window, _cx: &mut App) -> impl IntoElement {
62    self
63      .base
64      .id(ElementId::from(self.to.clone()))
65      .on_click(move |_, window, cx| {
66        let mut navigate = use_navigate(cx);
67        navigate(self.to.clone());
68        window.refresh();
69      })
70      .children(self.children)
71  }
72}