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}