tool_ready_pop_up.rs

  1use gpui::{
  2    point, App, Context, EventEmitter, IntoElement, PlatformDisplay, Size, Window,
  3    WindowBackgroundAppearance, WindowBounds, WindowDecorations, WindowKind, WindowOptions,
  4};
  5use release_channel::ReleaseChannel;
  6use std::rc::Rc;
  7use theme;
  8use ui::{prelude::*, Render};
  9
 10pub struct ToolReadyPopUp {
 11    caption: SharedString,
 12    icon: IconName,
 13    icon_color: Color,
 14}
 15
 16impl ToolReadyPopUp {
 17    pub fn new(caption: impl Into<SharedString>, icon: IconName, icon_color: Color) -> Self {
 18        Self {
 19            caption: caption.into(),
 20            icon,
 21            icon_color,
 22        }
 23    }
 24
 25    pub fn window_options(screen: Rc<dyn PlatformDisplay>, cx: &App) -> WindowOptions {
 26        let size = Size {
 27            width: px(450.),
 28            height: px(72.),
 29        };
 30
 31        let notification_margin_width = px(16.);
 32        let notification_margin_height = px(-48.);
 33
 34        let bounds = gpui::Bounds::<Pixels> {
 35            origin: screen.bounds().top_right()
 36                - point(
 37                    size.width + notification_margin_width,
 38                    notification_margin_height,
 39                ),
 40            size,
 41        };
 42
 43        let app_id = ReleaseChannel::global(cx).app_id();
 44
 45        WindowOptions {
 46            window_bounds: Some(WindowBounds::Windowed(bounds)),
 47            titlebar: None,
 48            focus: false,
 49            show: true,
 50            kind: WindowKind::PopUp,
 51            is_movable: false,
 52            display_id: Some(screen.id()),
 53            window_background: WindowBackgroundAppearance::Transparent,
 54            app_id: Some(app_id.to_owned()),
 55            window_min_size: None,
 56            window_decorations: Some(WindowDecorations::Client),
 57        }
 58    }
 59}
 60
 61pub enum ToolReadyPopupEvent {
 62    Accepted,
 63    Dismissed,
 64}
 65
 66impl EventEmitter<ToolReadyPopupEvent> for ToolReadyPopUp {}
 67
 68impl Render for ToolReadyPopUp {
 69    fn render(&mut self, window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
 70        let ui_font = theme::setup_ui_font(window, cx);
 71        let line_height = window.line_height();
 72
 73        h_flex()
 74            .size_full()
 75            .p_3()
 76            .gap_4()
 77            .justify_between()
 78            .elevation_3(cx)
 79            .text_ui(cx)
 80            .font(ui_font)
 81            .border_color(cx.theme().colors().border)
 82            .rounded_xl()
 83            .child(
 84                h_flex()
 85                    .items_start()
 86                    .gap_2()
 87                    .child(
 88                        h_flex().h(line_height).justify_center().child(
 89                            Icon::new(self.icon)
 90                                .color(self.icon_color)
 91                                .size(IconSize::Small),
 92                        ),
 93                    )
 94                    .child(
 95                        v_flex()
 96                            .child(
 97                                div()
 98                                    .text_size(px(16.))
 99                                    .text_color(cx.theme().colors().text)
100                                    .child("Agent Panel"),
101                            )
102                            .child(
103                                div()
104                                    .text_size(px(14.))
105                                    .text_color(cx.theme().colors().text_muted)
106                                    .child(self.caption.clone()),
107                            ),
108                    ),
109            )
110            .child(
111                h_flex()
112                    .gap_0p5()
113                    .child(
114                        Button::new("open", "View Panel")
115                            .style(ButtonStyle::Tinted(ui::TintColor::Accent))
116                            .on_click({
117                                cx.listener(move |_this, _event, _, cx| {
118                                    cx.emit(ToolReadyPopupEvent::Accepted);
119                                })
120                            }),
121                    )
122                    .child(Button::new("dismiss", "Dismiss").on_click({
123                        cx.listener(move |_, _event, _, cx| {
124                            cx.emit(ToolReadyPopupEvent::Dismissed);
125                        })
126                    })),
127            )
128    }
129}