diff --git a/crates/workspace/src/notifications.rs b/crates/workspace/src/notifications.rs index b2a9c6d6c8..0756428a5c 100644 --- a/crates/workspace/src/notifications.rs +++ b/crates/workspace/src/notifications.rs @@ -1,20 +1,14 @@ use crate::{Toast, Workspace}; use anyhow::Context; use anyhow::{anyhow, Result}; -use collections::HashMap; use gpui::{ - svg, AnyView, AppContext, AsyncWindowContext, ClipboardItem, DismissEvent, Entity, EntityId, - EventEmitter, Global, PromptLevel, Render, ScrollHandle, Task, View, ViewContext, - VisualContext, WindowContext, + svg, AppContext, AsyncWindowContext, ClipboardItem, DismissEvent, EventEmitter, PromptLevel, + Render, ScrollHandle, Task, View, ViewContext, VisualContext, WindowContext, }; -use std::{any::TypeId, ops::DerefMut, time::Duration}; +use std::{any::TypeId, time::Duration}; use ui::{prelude::*, Tooltip}; use util::ResultExt; -pub fn init(cx: &mut AppContext) { - cx.set_global(NotificationTracker::new()); -} - #[derive(Debug, PartialEq, Clone)] pub enum NotificationId { Unique(TypeId), @@ -44,81 +38,7 @@ pub trait Notification: EventEmitter + Render {} impl + Render> Notification for V {} -pub trait NotificationHandle: Send { - fn id(&self) -> EntityId; - fn to_any(&self) -> AnyView; -} - -impl NotificationHandle for View { - fn id(&self) -> EntityId { - self.entity_id() - } - - fn to_any(&self) -> AnyView { - self.clone().into() - } -} - -impl From<&dyn NotificationHandle> for AnyView { - fn from(val: &dyn NotificationHandle) -> Self { - val.to_any() - } -} - -pub(crate) struct NotificationTracker { - notifications_sent: HashMap>, -} - -impl Global for NotificationTracker {} - -impl std::ops::Deref for NotificationTracker { - type Target = HashMap>; - - fn deref(&self) -> &Self::Target { - &self.notifications_sent - } -} - -impl DerefMut for NotificationTracker { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.notifications_sent - } -} - -impl NotificationTracker { - fn new() -> Self { - Self { - notifications_sent: Default::default(), - } - } -} - impl Workspace { - pub fn has_shown_notification_once( - &self, - id: &NotificationId, - cx: &ViewContext, - ) -> bool { - cx.global::() - .get(&TypeId::of::()) - .map(|ids| ids.contains(id)) - .unwrap_or(false) - } - - pub fn show_notification_once( - &mut self, - id: NotificationId, - cx: &mut ViewContext, - build_notification: impl FnOnce(&mut ViewContext) -> View, - ) { - if !self.has_shown_notification_once::(&id, cx) { - let tracker = cx.global_mut::(); - let entry = tracker.entry(TypeId::of::()).or_default(); - entry.push(id.clone()); - self.show_notification::(id, cx, build_notification) - } - } - #[cfg(any(test, feature = "test-support"))] pub fn notification_ids(&self) -> Vec { self.notifications @@ -144,7 +64,7 @@ impl Workspace { } }) .detach(); - self.notifications.push((id, Box::new(notification))); + self.notifications.push((id, notification.into())); cx.notify(); } diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index b54b797449..8551d49077 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -47,9 +47,7 @@ use itertools::Itertools; use language::{LanguageRegistry, Rope}; pub use modal_layer::*; use node_runtime::NodeRuntime; -use notifications::{ - simple_message_notification::MessageNotification, DetachAndPromptErr, NotificationHandle, -}; +use notifications::{simple_message_notification::MessageNotification, DetachAndPromptErr}; pub use pane::*; pub use pane_group::*; pub use persistence::{ @@ -370,7 +368,6 @@ fn prompt_and_open_paths( pub fn init(app_state: Arc, cx: &mut AppContext) { init_settings(cx); - notifications::init(cx); theme_preview::init(cx); cx.on_action(Workspace::close_global); @@ -785,7 +782,7 @@ pub struct Workspace { status_bar: View, modal_layer: View, titlebar_item: Option, - notifications: Vec<(NotificationId, Box)>, + notifications: Vec<(NotificationId, AnyView)>, project: Model, follower_states: HashMap, last_leaders_by_pane: HashMap, PeerId>, @@ -3640,7 +3637,7 @@ impl Workspace { .children( self.notifications .iter() - .map(|(_, notification)| notification.to_any()), + .map(|(_, notification)| notification.clone().into_any()), ), ) } @@ -4895,7 +4892,7 @@ fn notify_if_database_failed(workspace: WindowHandle, cx: &mut AsyncA if (*db::ALL_FILE_DB_FAILED).load(std::sync::atomic::Ordering::Acquire) { struct DatabaseFailedNotification; - workspace.show_notification_once( + workspace.show_notification( NotificationId::unique::(), cx, |cx| {