From 6ff94e1bcbd8f261a39e4d5ad9d74e6249564a87 Mon Sep 17 00:00:00 2001 From: Valentijn Date: Mon, 20 Aug 2018 18:37:37 +0200 Subject: [PATCH] Support the action_hints hint --- src/notification.cpp | 24 +++++++++++++++--------- src/notificationwidgets.cpp | 34 +++++++++++++++++++++++++++++----- src/notificationwidgets.h | 4 ++-- src/notifyd.cpp | 2 +- 4 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/notification.cpp b/src/notification.cpp index 213d7b63..64a1b313 100644 --- a/src/notification.cpp +++ b/src/notification.cpp @@ -175,13 +175,17 @@ void Notification::setValues(const QString &application, // TODO/FIXME: Urgencies - how to handle it? } + bool action_icons = !hints[QL1S("action-icons")].isNull(); // Actions - if (actions.count() && m_actionWidget == 0) + if (actions.count()) { + if (m_actionWidget != 0) + delete m_actionWidget; + if (actions.count()/2 < 4) - m_actionWidget = new NotificationActionsButtonsWidget(actions, this); + m_actionWidget = new NotificationActionsButtonsWidget(actions, this, action_icons); else - m_actionWidget = new NotificationActionsComboWidget(actions, this); + m_actionWidget = new NotificationActionsComboWidget(actions, this, action_icons); connect(m_actionWidget, &NotificationActionsWidget::actionTriggered, this, &Notification::actionTriggered); @@ -256,16 +260,18 @@ QPixmap Notification::getPixmapFromHint(const QVariant &argument) const QPixmap Notification::getPixmapFromString(const QString &str) const { QUrl url(str); - if (url.isValid() && QFile::exists(url.toLocalFile())) + + if (url.isLocalFile() && QFile::exists(url.toLocalFile())) { -// qDebug() << " getPixmapFromString by URL" << url; + //qDebug() << " getPixmapFromString by URL" << url; return QPixmap(url.toLocalFile()); + } else { -// qDebug() << " getPixmapFromString by XdgIcon theme" << str << ICONSIZE << XdgIcon::themeName(); -// qDebug() << " " << XdgIcon::fromTheme(str) << "isnull:" << XdgIcon::fromTheme(str).isNull(); - // They say: do not display an icon if it;s not found - see #325 + // qDebug() << " getPixmapFromString by XdgIcon theme" << str << ICONSIZE << XdgIcon::themeName(); + // qDebug() << " " << XdgIcon::fromTheme(str) << "isnull:" << XdgIcon::fromTheme(str).isNull(); + // They say: do not display an icon if it's not found - see #325 return XdgIcon::fromTheme(str/*, XdgIcon::defaultApplicationIcon()*/).pixmap(ICONSIZE); } } @@ -318,7 +324,7 @@ void Notification::mouseReleaseEvent(QMouseEvent * event) KWindowInfo info = KWindowInfo(i, NET::WMName | NET::WMVisibleName); appName = info.name(); windowTitle = info.visibleName(); - // qDebug() << " " << i << "APPNAME" << appName << "TITLE" << windowTitle; + // qDebug() << " " << i << "APPNAME" << appName << "TITLE" << windowTitle; if (appName.isEmpty()) { QWidget::mouseReleaseEvent(event); diff --git a/src/notificationwidgets.cpp b/src/notificationwidgets.cpp index 82359037..7924c393 100644 --- a/src/notificationwidgets.cpp +++ b/src/notificationwidgets.cpp @@ -27,16 +27,20 @@ #include +#include +#include +#include #include #include #include +#include #include #include - #include "notificationwidgets.h" #include +#define ICONSIZE QSize(32, 32) NotificationActionsWidget::NotificationActionsWidget(const QStringList& actions, QWidget *parent) : QWidget(parent) @@ -65,8 +69,7 @@ NotificationActionsWidget::NotificationActionsWidget(const QStringList& actions, m_defaultAction = m_actions[0].first; } - -NotificationActionsButtonsWidget::NotificationActionsButtonsWidget(const QStringList& actions, QWidget *parent) +NotificationActionsButtonsWidget::NotificationActionsButtonsWidget(const QStringList& actions, QWidget *parent, const bool action_icons) : NotificationActionsWidget(actions, parent) { QHBoxLayout *l = new QHBoxLayout(); @@ -78,12 +81,24 @@ NotificationActionsButtonsWidget::NotificationActionsButtonsWidget(const QString { QPushButton *b = new QPushButton(action.second, this); b->setObjectName(action.first); + + if (action_icons) + { + QIcon icon = XdgIcon::fromTheme(action.first).pixmap(ICONSIZE); + + if (! icon.isNull()) { + b->setText(QString()); + b->setIcon(icon); + } + } + l->addWidget(b); group->addButton(b); if (action.first == m_defaultAction) b->setFocus(Qt::OtherFocusReason); } + connect(group, static_cast(&QButtonGroup::buttonClicked), this, &NotificationActionsButtonsWidget::actionButtonActivated); } @@ -94,7 +109,7 @@ void NotificationActionsButtonsWidget::actionButtonActivated(QAbstractButton* bu } -NotificationActionsComboWidget::NotificationActionsComboWidget(const QStringList& actions, QWidget *parent) +NotificationActionsComboWidget::NotificationActionsComboWidget(const QStringList& actions, QWidget *parent, bool action_icons) : NotificationActionsWidget(actions, parent) { QHBoxLayout *l = new QHBoxLayout(); @@ -107,8 +122,17 @@ NotificationActionsComboWidget::NotificationActionsComboWidget(const QStringList for (int i = 0; i < m_actions.count(); ++i) { auto const & action = m_actions[i]; - m_comboBox->addItem(action.second, action.first); + + if (action_icons) + { + QIcon icon = XdgIcon::fromTheme(action.first).pixmap(ICONSIZE); + if (!icon.isNull()) + { + m_comboBox->setItemIcon(i, icon); + } + } + if (action.first == m_defaultAction) { currentIndex = i; diff --git a/src/notificationwidgets.h b/src/notificationwidgets.h index e50642f3..c60290a5 100644 --- a/src/notificationwidgets.h +++ b/src/notificationwidgets.h @@ -76,7 +76,7 @@ class NotificationActionsButtonsWidget : public NotificationActionsWidget /*! Create new widget. * \param actions a list of actions in form: (key1, display1, key2, display2, ..., keyN, displayN) */ - NotificationActionsButtonsWidget(const QStringList& actions, QWidget *parent); + NotificationActionsButtonsWidget(const QStringList& actions, QWidget *parent, const bool action_icons); private slots: void actionButtonActivated(QAbstractButton* button); }; @@ -89,7 +89,7 @@ class NotificationActionsComboWidget : public NotificationActionsWidget /*! Create new widget. * \param actions a list of actions in form: (key1, display1, key2, display2, ..., keyN, displayN) */ - NotificationActionsComboWidget(const QStringList& actions, QWidget *parent); + NotificationActionsComboWidget(const QStringList& actions, QWidget *parent, const bool action_icons); private: QComboBox *m_comboBox; diff --git a/src/notifyd.cpp b/src/notifyd.cpp index 1135a211..58f24bab 100644 --- a/src/notifyd.cpp +++ b/src/notifyd.cpp @@ -73,7 +73,7 @@ QStringList Notifyd::GetCapabilities() QStringList caps; caps << QSL("actions") - // << "action-icons" + << QSL("action-icons") << QSL("body") << QSL("body-hyperlinks") << QSL("body-images")