From abcd9042b041e5919d68a6351a4c1f2fb1685e84 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Sun, 17 Sep 2023 09:13:47 +0300 Subject: [PATCH] plasma: complete the notifications applet application notifications widget complete as in fully functional Signed-off-by: Ivailo Monev --- .../notifications/applicationswidget.cpp | 37 +++++++++++++------ .../notifications/applicationswidget.h | 1 - plasma/applets/notifications/jobswidget.cpp | 2 +- plasma/applets/notifications/jobswidget.h | 2 + .../applets/notifications/notifications.cpp | 23 +++++++++++- 5 files changed, 51 insertions(+), 14 deletions(-) diff --git a/plasma/applets/notifications/applicationswidget.cpp b/plasma/applets/notifications/applicationswidget.cpp index eb6f1e96..b4dc4b27 100644 --- a/plasma/applets/notifications/applicationswidget.cpp +++ b/plasma/applets/notifications/applicationswidget.cpp @@ -20,8 +20,10 @@ #include #include +#include #include -#include +#include +#include #include #include #include @@ -171,28 +173,32 @@ void ApplicationsWidget::dataUpdated(const QString &name, const Plasma::DataEngi // row insertation starts at 0, count is +1 if (framelayout->rowCount() >= 4) { buttonslayout = static_cast(framelayout->itemAt(3, 0)); - } - if (buttonslayout) { - // remove buttons in case of notification update - QList actionbuttons; + // redo the buttons layout in case of notification update + QList actionbuttons; for (int i = 0; i < buttonslayout->count(); i++) { - Plasma::ToolButton* actionbutton = static_cast(buttonslayout->itemAt(i)); - actionbuttons.append(actionbutton); + Plasma::PushButton* actionbutton = static_cast(buttonslayout->itemAt(i)); + if (actionbutton) { + actionbuttons.append(actionbutton); + } buttonslayout->removeAt(i); } qDeleteAll(actionbuttons); actionbuttons.clear(); + framelayout->removeItem(buttonslayout); + delete buttonslayout; + buttonslayout = nullptr; } for (int i = 0; i < actions.size(); i++) { const QString actionid = actions[i]; i++; - const QString actionname = actions[i]; + const QString actionname = (i < actions.size() ? actions.at(i) : QString()); if (actionid.isEmpty() || actionname.isEmpty()) { kWarning() << "Empty action ID or name" << actionid << actionname; continue; } - Plasma::ToolButton* actionbutton = new Plasma::ToolButton(frame); + Plasma::PushButton* actionbutton = new Plasma::PushButton(frame); + actionbutton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); actionbutton->setProperty("_k_name", framename); actionbutton->setProperty("_k_actionid", actionid); actionbutton->setText(actionname); @@ -202,10 +208,12 @@ void ApplicationsWidget::dataUpdated(const QString &name, const Plasma::DataEngi ); if (!buttonslayout) { buttonslayout = new QGraphicsLinearLayout(Qt::Horizontal, framelayout); + buttonslayout->addStretch(); } buttonslayout->addItem(actionbutton); } if (buttonslayout) { + buttonslayout->addStretch(); framelayout->addItem(buttonslayout, 3, 0, 1, 3); framelayout->setAlignment(buttonslayout, Qt::AlignCenter); } @@ -256,12 +264,14 @@ void ApplicationsWidget::slotConfigureActivated() { const Plasma::IconWidget* configurewidget = qobject_cast(sender()); const QString frameapprealname = configurewidget->property("_k_apprealname").toString(); + // same thing the notifications service does KNotificationConfigWidget::configure(frameapprealname, nullptr); } void ApplicationsWidget::slotActionClicked() { - const Plasma::ToolButton* actionbutton = qobject_cast(sender()); + QMutexLocker locker(&m_mutex); + const Plasma::PushButton* actionbutton = qobject_cast(sender()); const QString framename = actionbutton->property("_k_name").toString(); const QString actionid = actionbutton->property("_k_actionid").toString(); Plasma::Service* plasmaservice = m_dataengine->serviceForSource(framename); @@ -272,7 +282,12 @@ void ApplicationsWidget::slotActionClicked() plasmaserviceargs["actionId"] = actionid; (void)plasmaservice->startOperationCall("invokeAction", plasmaserviceargs); } - // TODO: remove notification too + + // remove notification too (compat) + Plasma::Frame* actionframe = qobject_cast(actionbutton->parentObject()); + Q_ASSERT(actionframe != nullptr); + Plasma::IconWidget* removewidget = qvariant_cast(actionframe->property("_k_removewidget")); + QMetaObject::invokeMethod(removewidget, "activated", Qt::QueuedConnection); } #include "moc_applicationswidget.cpp" diff --git a/plasma/applets/notifications/applicationswidget.h b/plasma/applets/notifications/applicationswidget.h index b440ebca..59688c28 100644 --- a/plasma/applets/notifications/applicationswidget.h +++ b/plasma/applets/notifications/applicationswidget.h @@ -25,7 +25,6 @@ #include #include #include -#include class NotificationsWidget; diff --git a/plasma/applets/notifications/jobswidget.cpp b/plasma/applets/notifications/jobswidget.cpp index c1a71093..734407ad 100644 --- a/plasma/applets/notifications/jobswidget.cpp +++ b/plasma/applets/notifications/jobswidget.cpp @@ -58,7 +58,7 @@ JobsWidget::~JobsWidget() int JobsWidget::count() const { - return 0; + return m_frames.size(); } void JobsWidget::sourceAdded(const QString &name) diff --git a/plasma/applets/notifications/jobswidget.h b/plasma/applets/notifications/jobswidget.h index 772ec455..542f74a8 100644 --- a/plasma/applets/notifications/jobswidget.h +++ b/plasma/applets/notifications/jobswidget.h @@ -22,6 +22,7 @@ #include #include #include +#include #include class NotificationsWidget; @@ -47,6 +48,7 @@ private: NotificationsWidget *m_notificationswidget; QGraphicsLinearLayout* m_layout; Plasma::Label* m_label; + QList m_frames; Plasma::DataEngine *m_dataengine; }; diff --git a/plasma/applets/notifications/notifications.cpp b/plasma/applets/notifications/notifications.cpp index da7ef83a..563b78c6 100644 --- a/plasma/applets/notifications/notifications.cpp +++ b/plasma/applets/notifications/notifications.cpp @@ -26,6 +26,25 @@ #include static const QSizeF s_minimumsize = QSizeF(290, 140); +static const int s_svgiconsize = 256; + +static QIcon kNotificationIcon(QObject *parent, const bool active) +{ + QIcon result; + Plasma::Svg plasmasvg(parent); + plasmasvg.setImagePath("icons/notification"); + plasmasvg.setContainsMultipleImages(true); + if (plasmasvg.isValid()) { + QPixmap iconpixmap(s_svgiconsize, s_svgiconsize); + iconpixmap.fill(Qt::transparent); + QPainter iconpainter(&iconpixmap); + plasmasvg.paint(&iconpainter, iconpixmap.rect(), active ? "notification-active" : "notification-disabled"); + result = QIcon(iconpixmap); + } else { + result = KIcon("preferences-desktop-notification"); + } + return result; +} class NotificationsWidget : public Plasma::TabBar { @@ -86,8 +105,10 @@ void NotificationsWidget::slotCountChanged() { const int totalcount = (m_jobswidget->count() + m_applicationswidget->count()); if (totalcount > 0) { + m_notifications->setPopupIcon(kNotificationIcon(m_notifications, true)); m_notifications->setStatus(Plasma::ItemStatus::ActiveStatus); } else { + m_notifications->setPopupIcon(kNotificationIcon(m_notifications, false)); m_notifications->setStatus(Plasma::ItemStatus::PassiveStatus); } } @@ -100,7 +121,7 @@ NotificationsApplet::NotificationsApplet(QObject *parent, const QVariantList &ar KGlobal::locale()->insertCatalog("plasma_applet_notifications"); setAspectRatioMode(Plasma::AspectRatioMode::IgnoreAspectRatio); m_notificationswidget = new NotificationsWidget(this); - setPopupIcon("preferences-desktop-notification"); + setPopupIcon(kNotificationIcon(this, false)); } NotificationsApplet::~NotificationsApplet()