feedback_info_text.rs

 1use gpui::{
 2    elements::{Flex, Label, MouseEventHandler, ParentElement, Text},
 3    platform::{CursorStyle, MouseButton},
 4    AnyElement, Element, Entity, View, ViewContext, ViewHandle,
 5};
 6use workspace::{item::ItemHandle, ToolbarItemLocation, ToolbarItemView};
 7
 8use crate::{feedback_editor::FeedbackEditor, open_zed_community_repo, OpenZedCommunityRepo};
 9
10pub struct FeedbackInfoText {
11    active_item: Option<ViewHandle<FeedbackEditor>>,
12}
13
14impl FeedbackInfoText {
15    pub fn new() -> Self {
16        Self {
17            active_item: Default::default(),
18        }
19    }
20}
21
22impl Entity for FeedbackInfoText {
23    type Event = ();
24}
25
26impl View for FeedbackInfoText {
27    fn ui_name() -> &'static str {
28        "FeedbackInfoText"
29    }
30
31    fn render(&mut self, cx: &mut ViewContext<Self>) -> AnyElement<Self> {
32        let theme = theme::current(cx).clone();
33
34        Flex::row()
35            .with_child(
36                Text::new(
37                    "Share your feedback. Include your email for replies. For issues and discussions, visit the ",
38                    theme.feedback.info_text_default.text.clone(),
39                )
40                .with_soft_wrap(false)
41                .aligned(),
42            )
43            .with_child(
44                MouseEventHandler::new::<OpenZedCommunityRepo, _>(0, cx, |state, _| {
45                    let style = if state.hovered() {
46                        &theme.feedback.link_text_hover
47                    } else {
48                        &theme.feedback.link_text_default
49                    };
50                    Label::new("community repo", style.text.clone())
51                        .contained()
52                        .with_style(style.container)
53                        .aligned()
54                        .left()
55                        .clipped()
56                })
57                .with_cursor_style(CursorStyle::PointingHand)
58                .on_click(MouseButton::Left, |_, _, cx| {
59                    open_zed_community_repo(&Default::default(), cx)
60                }),
61            )
62            .with_child(
63                Text::new(".", theme.feedback.info_text_default.text.clone())
64                    .with_soft_wrap(false)
65                    .aligned(),
66            )
67            .contained()
68            .with_style(theme.feedback.info_text_default.container)
69            .aligned()
70            .left()
71            .clipped()
72            .into_any()
73    }
74}
75
76impl ToolbarItemView for FeedbackInfoText {
77    fn set_active_pane_item(
78        &mut self,
79        active_pane_item: Option<&dyn ItemHandle>,
80        cx: &mut ViewContext<Self>,
81    ) -> workspace::ToolbarItemLocation {
82        cx.notify();
83        if let Some(feedback_editor) = active_pane_item.and_then(|i| i.downcast::<FeedbackEditor>())
84        {
85            self.active_item = Some(feedback_editor);
86            ToolbarItemLocation::PrimaryLeft {
87                flex: Some((1., false)),
88            }
89        } else {
90            self.active_item = None;
91            ToolbarItemLocation::Hidden
92        }
93    }
94}