Update NotificationToast implementation and use in Workspace component

This commit is contained in:
Nate Butler 2023-10-13 10:35:30 -04:00
parent 943c02bf79
commit c6d831a564
3 changed files with 22 additions and 15 deletions

View file

@ -1,7 +1,9 @@
use gpui3::{div, Element, ParentElement, StyleHelpers, ViewContext}; use std::marker::PhantomData;
use gpui3::{Element, ParentElement, StyleHelpers, ViewContext};
use crate::{ use crate::{
h_stack, v_stack, Button, Icon, IconButton, IconElement, Label, ThemeColor, Toast, ToastOrigin, h_stack, v_stack, Icon, IconButton, IconElement, Label, ThemeColor, Toast, ToastOrigin,
}; };
/// Notification toasts are used to display a message /// Notification toasts are used to display a message
@ -9,26 +11,27 @@ use crate::{
/// ///
/// To simply convey information, use a Status. /// To simply convey information, use a Status.
pub struct NotificationToast<S: 'static + Send + Sync + Clone> { pub struct NotificationToast<S: 'static + Send + Sync + Clone> {
state_type: PhantomData<S>,
left_icon: Option<Icon>, left_icon: Option<Icon>,
title: String, title: String,
message: String, message: String,
primary_action: Button<S>, // primary_action: Button<S>,
secondary_action: Option<Button<S>>, // secondary_action: Option<Button<S>>,
} }
impl<S: 'static + Send + Sync + Clone> NotificationToast<S> { impl<S: 'static + Send + Sync + Clone> NotificationToast<S> {
pub fn new( pub fn new(
title: impl Into<String>, title: impl Into<String>,
message: impl Into<String>, message: impl Into<String>,
actions: Vec<Button<S>>, // primary_action: Button<S>,
primary_action: Button<S>,
) -> Self { ) -> Self {
Self { Self {
state_type: PhantomData,
left_icon: None, left_icon: None,
title: title.into(), title: title.into(),
message: message.into(), message: message.into(),
primary_action, // primary_action,
secondary_action: None, // secondary_action: None,
} }
} }
@ -37,10 +40,10 @@ impl<S: 'static + Send + Sync + Clone> NotificationToast<S> {
self self
} }
pub fn set_secondary_action(mut self, action: Button<S>) -> Self { // pub fn set_secondary_action(mut self, action: Button<S>) -> Self {
self.secondary_action = Some(action); // self.secondary_action = Some(action);
self // self
} // }
fn render(&mut self, _view: &mut S, cx: &mut ViewContext<S>) -> impl Element<ViewState = S> { fn render(&mut self, _view: &mut S, cx: &mut ViewContext<S>) -> impl Element<ViewState = S> {
let color = ThemeColor::new(cx); let color = ThemeColor::new(cx);
@ -80,6 +83,6 @@ impl<S: 'static + Send + Sync + Clone> NotificationToast<S> {
), ),
); );
Toast::new(ToastOrigin::BottomRight) Toast::new(ToastOrigin::BottomRight).child(notification)
} }
} }

View file

@ -1,13 +1,13 @@
use chrono::DateTime; use chrono::DateTime;
use gpui3::{px, relative, rems, view, Context, Size, View}; use gpui3::{px, relative, rems, view, Context, Size, View};
use crate::prelude::*;
use crate::{ use crate::{
hello_world_rust_editor_with_status_example, random_players_with_call_status, theme, v_stack, hello_world_rust_editor_with_status_example, random_players_with_call_status, theme, v_stack,
AssistantPanel, ChatMessage, ChatPanel, CollabPanel, EditorPane, Label, LanguageSelector, AssistantPanel, ChatMessage, ChatPanel, CollabPanel, EditorPane, Label, LanguageSelector,
Livestream, Pane, PaneGroup, Panel, PanelAllowedSides, PanelSide, ProjectPanel, SplitDirection, Livestream, Pane, PaneGroup, Panel, PanelAllowedSides, PanelSide, ProjectPanel, SplitDirection,
StatusBar, Terminal, TitleBar, Toast, ToastOrigin, StatusBar, Terminal, TitleBar, Toast, ToastOrigin,
}; };
use crate::{prelude::*, NotificationToast};
#[derive(Clone)] #[derive(Clone)]
pub struct Workspace { pub struct Workspace {
@ -266,7 +266,11 @@ impl Workspace {
.filter(|_| self.is_language_selector_open()), .filter(|_| self.is_language_selector_open()),
) )
.child(Toast::new(ToastOrigin::Bottom).child(Label::new("A toast"))) .child(Toast::new(ToastOrigin::Bottom).child(Label::new("A toast")))
.child(Toast::new(ToastOrigin::BottomRight).child(Label::new("Another toast"))) // .child(Toast::new(ToastOrigin::BottomRight).child(Label::new("Another toast")))
.child(NotificationToast::new(
"A notification",
"This is a notification",
))
} }
} }