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 }
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}