From 9000ab5ad0bcededd2f80c8539f2f5a4e285137c Mon Sep 17 00:00:00 2001 From: Patrick von Reth Date: Sun, 19 Jan 2014 17:43:23 +0100 Subject: [PATCH] chaned update stuff --- src/core/notification/notification.cpp | 10 ++--- src/core/notification/notification.h | 3 +- src/core/notification/notification_p.cpp | 17 +++++++ src/core/notification/notification_p.h | 3 ++ src/core/plugins/snorebackend.cpp | 4 +- src/plugins/backends/snarl/snarl.cpp | 44 ++++++++----------- src/plugins/backends/snarl/snarl.h | 2 +- .../freedesktopnotificationfrontend.cpp | 10 +++-- src/trayicon.cpp | 32 ++++++++++---- src/trayicon.h | 10 +++-- 10 files changed, 85 insertions(+), 50 deletions(-) diff --git a/src/core/notification/notification.cpp b/src/core/notification/notification.cpp index de2f8c2..d057905 100644 --- a/src/core/notification/notification.cpp +++ b/src/core/notification/notification.cpp @@ -43,6 +43,11 @@ Notification::Notification(const Application &application, const Alert &alert, c } +Notification::Notification(const Notification &old, const QString &title, const QString &text, const Icon &icon, int timeout, NotificationEnums::Prioritys::prioritys priority): + d(new NotificationData(old,title,text,icon,timeout,priority)) +{ +} + Notification::Notification ( const Notification &other ) : d(other.d) { @@ -73,11 +78,6 @@ const int &Notification::timeout() const return d->m_timeout; } -void Notification::setNotificationToReplace(const Notification &n) -{ - d->m_toReplace = n; -} - Notification Notification::notificationToReplace() const { return d->m_toReplace; diff --git a/src/core/notification/notification.h b/src/core/notification/notification.h index dfbe360..9035c82 100644 --- a/src/core/notification/notification.h +++ b/src/core/notification/notification.h @@ -41,6 +41,8 @@ class SNORE_EXPORT Notification public: Notification(); explicit Notification(const Application &application,const Alert &alert,const QString &title,const QString &text,const Icon &icon,int timeout = defaultTimeout(), NotificationEnums::Prioritys::prioritys priority = NotificationEnums::Prioritys::NORMAL ); + explicit Notification(const Notification &old,const QString &title,const QString &text,const Icon &icon,int timeout = defaultTimeout(), NotificationEnums::Prioritys::prioritys priority = NotificationEnums::Prioritys::NORMAL ); + Notification(const Notification &other ); Notification &operator=(const Notification &other); ~Notification(); @@ -50,7 +52,6 @@ public: //0 means sticky const int &timeout() const; - void setNotificationToReplace(const Notification &n); Notification notificationToReplace() const; bool isUpdate() const; diff --git a/src/core/notification/notification_p.cpp b/src/core/notification/notification_p.cpp index c71c1a5..42d259c 100644 --- a/src/core/notification/notification_p.cpp +++ b/src/core/notification/notification_p.cpp @@ -48,6 +48,23 @@ NotificationData::NotificationData (const Snore::Application &application, const qDebug()<< "Creating Notification: ActiveNotifications" << notificationCount << "id" << m_id; } +Snore::NotificationData::NotificationData(const Notification &old, const QString &title, const QString &text, const Icon &icon, int timeout, NotificationEnums::Prioritys::prioritys priority): + m_id ( old.id() ), + m_timeout( timeout ), + m_source( NULL), + m_application ( old.application()), + m_alert( old.alert() ), + m_title( title ), + m_text( text ), + m_icon( icon ), + m_priority(priority), + m_closeReason(NotificationEnums::CloseReasons::NONE), + m_toReplace(old) +{ + notificationCount++; + qDebug()<< "Creating Notification: ActiveNotifications" << notificationCount << "id" << m_id; +} + NotificationData::~NotificationData() { if(!m_timeoutTimer.isNull()) diff --git a/src/core/notification/notification_p.h b/src/core/notification/notification_p.h index 9ad09d2..84828d3 100644 --- a/src/core/notification/notification_p.h +++ b/src/core/notification/notification_p.h @@ -40,6 +40,9 @@ public: NotificationData ( const Application &application,const Alert &alert,const QString &title,const QString &text,const Icon &icon, int timeout,NotificationEnums::Prioritys::prioritys priority ); + NotificationData(const Notification &old,const QString &title,const QString &text,const Icon &icon,int timeout, NotificationEnums::Prioritys::prioritys priority); + + ~NotificationData(); void setSource(class SnoreFrontend *source); diff --git a/src/core/plugins/snorebackend.cpp b/src/core/plugins/snorebackend.cpp index 5678fca..85cd281 100644 --- a/src/core/plugins/snorebackend.cpp +++ b/src/core/plugins/snorebackend.cpp @@ -121,7 +121,7 @@ bool SnoreSecondaryBackend::supportsRichtext() Snore::Notification SnoreBackend::getActiveNotificationByID(uint id) { - return m_activeNotifications[id]; + return m_activeNotifications.value(id); } bool SnoreBackend::canCloseNotification() @@ -146,7 +146,7 @@ void SnoreBackend::slotDeregisterApplication(const Application &application) void SnoreBackend::addActiveNotification(Notification n) { - m_activeNotifications[n.id()] = n; + m_activeNotifications.insert(n.id(), n); } diff --git a/src/plugins/backends/snarl/snarl.cpp b/src/plugins/backends/snarl/snarl.cpp index 3014603..cc4f4aa 100644 --- a/src/plugins/backends/snarl/snarl.cpp +++ b/src/plugins/backends/snarl/snarl.cpp @@ -68,17 +68,7 @@ public: Notification notification; if(msg->lParam != 0) { - uint notificationID = 0; - for(QHash::iterator it = m_snarl->m_idMap.begin();it != m_snarl->m_idMap.end();++it) - { - if(it.value() == msg->lParam) - { - notificationID = it.key(); - break; - } - } - notification = m_snarl->snore()->getActiveNotificationByID(notificationID); - qDebug()<<"recived a Snarl callback id:"<lParam <<"action:"<snore()->getActiveNotificationByID(m_snarl->m_idMap[ msg->lParam]); } NotificationEnums::CloseReasons::closeReasons reason = NotificationEnums::CloseReasons::NONE; @@ -229,9 +219,10 @@ void SnarlBackend::slotNotify(Notification notification){ break; } + ULONG32 id = 0; if(!notification.isUpdate()) { - ULONG32 id = snarlInterface->Notify(notification.alert().name().toUtf8().constData(), + id = snarlInterface->Notify(notification.alert().name().toUtf8().constData(), Snore::toPlainText(notification.title()).toUtf8().constData(), Snore::toPlainText(notification.text()).toUtf8().constData(), notification.timeout(), @@ -243,25 +234,26 @@ void SnarlBackend::slotNotify(Notification notification){ { snarlInterface->AddAction(id,a.name().toUtf8().constData(),QString("@").append(QString::number(a.id())).toUtf8().constData()); } - m_idMap[notification.id()] = id; - startTimeout(notification); - + m_idMap[id] = notification.id(); + notification.hints().setPrivateValue(this, "id", id); } else { //update message - snarlInterface->Update(m_idMap[notification.notificationToReplace().id()], - notification.alert().name().toUtf8().constData(), - Snore::toPlainText(notification.title()).toUtf8().constData(), - Snore::toPlainText(notification.text()).toUtf8().constData(), - notification.timeout(), - notification.icon().isLocalFile()?notification.icon().localUrl().toUtf8().constData():0, - !notification.icon().isLocalFile()?notification.icon().imageData().toBase64().constData():0, - priority); - m_idMap[notification.id()] = m_idMap[notification.notificationToReplace().id()]; - startTimeout(notification); + id = notification.notificationToReplace().hints().privateValue(this, "id").toUInt(); + snarlInterface->Update(id, + notification.alert().name().toUtf8().constData(), + Snore::toPlainText(notification.title()).toUtf8().constData(), + Snore::toPlainText(notification.text()).toUtf8().constData(), + notification.timeout(), + notification.icon().isLocalFile()?notification.icon().localUrl().toUtf8().constData():0, + !notification.icon().isLocalFile()?notification.icon().imageData().toBase64().constData():0, + priority); } + notification.hints().setPrivateValue(this, "id", id); + startTimeout(notification);//if dnd or away snarl does not timeout atomatically + } void SnarlBackend::slotCloseNotification(Notification notification) @@ -271,5 +263,5 @@ void SnarlBackend::slotCloseNotification(Notification notification) qDebug() << Q_FUNC_INFO << "Unknown apllication: " << notification.application().name(); return; } - m_applications.value(notification.application().name())->Hide(m_idMap.take(notification.id())); + m_applications.value(notification.application().name())->Hide(notification.hints().privateValue(this, "id").toUInt()); } diff --git a/src/plugins/backends/snarl/snarl.h b/src/plugins/backends/snarl/snarl.h index eb558bb..739e940 100644 --- a/src/plugins/backends/snarl/snarl.h +++ b/src/plugins/backends/snarl/snarl.h @@ -47,7 +47,7 @@ public slots: void slotCloseNotification(Snore::Notification notification); private: - QHash m_idMap; + QHash m_idMap; }; diff --git a/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.cpp b/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.cpp index 683fd90..4d7fbf3 100644 --- a/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.cpp +++ b/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.cpp @@ -126,10 +126,14 @@ uint FreedesktopFrontend::Notify(const QString &app_name, uint replaces_id, priotity = NotificationEnums::Prioritys::prioritys(hints["urgency"].toInt()-1); } - Notification noti(app, *app.alerts().begin(), summary, body, icon, timeout==-1?Notification::defaultTimeout():timeout/1000, priotity); - if(replaces_id != 0) + Notification noti; + if(replaces_id != 0 && snore()->getActiveNotificationByID(replaces_id).isValid()) { - noti.setNotificationToReplace(snore()->getActiveNotificationByID(replaces_id)); + noti = Notification(snore()->getActiveNotificationByID(replaces_id),summary, body, icon, timeout==-1?Notification::defaultTimeout():timeout/1000, priotity); + } + else + { + noti = Notification(app, *app.alerts().begin(), summary, body, icon, timeout==-1?Notification::defaultTimeout():timeout/1000, priotity); } noti.data()->setSource(this); for(int i = 0;i < actions.length(); i+=2) diff --git a/src/trayicon.cpp b/src/trayicon.cpp index ebcd898..7d80394 100644 --- a/src/trayicon.cpp +++ b/src/trayicon.cpp @@ -30,8 +30,11 @@ using namespace Snore; TrayIcon::TrayIcon(): - m_trayIcon(new QSystemTrayIcon(QIcon(":/root/snore.png"))) + m_trayIcon(new QSystemTrayIcon(QIcon(":/root/snore.png"))), + m_app("SnoreNotify Test", Icon(":/root/snore.png")), + m_alert("Default") { + m_app.addAlert(m_alert); } void TrayIcon::initConextMenu(SnoreCore *snore) @@ -85,12 +88,25 @@ void TrayIcon::setPrimaryBackend(){ void TrayIcon::slotTestNotification() { - const Application &app = m_snore->d()->defaultApplication(); - m_snore->registerApplication(app); - Notification n(app, *app.alerts().begin(), "Hello World", "This is Snore", Icon(":/root/snore.png")); - n.addAction(Action(1,"Test Action")); - m_snore->broadcastNotification(n); - m_snore->broadcastNotification(Notification(app, *app.alerts().begin(), "Hello World", "This is Snore, color test", Icon("http://jweatherwatch.googlecode.com/svn/trunk/iconset/04.png"))); -// m_snore->deregisterApplication(app); + + if(!m_snore->aplications().contains(m_app.name())) + { + m_snore->registerApplication(m_app); + } + m_noti = Notification(m_app, m_alert, "Hello World", "This is Snore", Icon(":/root/snore.png")); + m_noti.addAction(Action(1,"Test Action")); + m_snore->broadcastNotification(m_noti); + + QTimer::singleShot(m_noti.timeout()/2*1000,this,SLOT(sloutUpdateTestNotification())); + + + // m_snore->deregisterApplication(app); +} + +void TrayIcon::sloutUpdateTestNotification() +{ + Notification update(m_noti, "Hello World", "This is Snore, color test", Icon("http://jweatherwatch.googlecode.com/svn/trunk/iconset/04.png")); + m_snore->broadcastNotification(update); + m_noti = Notification(); } diff --git a/src/trayicon.h b/src/trayicon.h index ceda150..e0db423 100644 --- a/src/trayicon.h +++ b/src/trayicon.h @@ -21,10 +21,8 @@ #define TRAYICON_H #include +#include "core/snore.h" -namespace Snore{ - class SnoreCore; -} class TrayIcon:public QObject { @@ -39,12 +37,16 @@ private: class QSystemTrayIcon *m_trayIcon; class QMenu *m_trayMenu; class QList m_backendActions; - class Snore::SnoreCore *m_snore; + Snore::SnoreCore *m_snore; + Snore::Application m_app; + Snore::Alert m_alert; + Snore::Notification m_noti; public slots: void setPrimaryBackend(); void slotTestNotification(); + void sloutUpdateTestNotification(); }; #endif // TRAYICON_H