← Back to team overview

ayatana-commits team mailing list archive

[Branch ~agateau/plasma-widget-message-indicator/trunk] Rev 121: Started to integrate support for menu actions

 

------------------------------------------------------------
revno: 121
committer: Aurelien Gateau <aurelien.gateau@xxxxxxxxxxxxx>
branch nick: plasma-widget-message-indicator
timestamp: Mon 2010-03-08 11:20:45 +0100
message:
  Started to integrate support for menu actions
modified:
  CMakeLists.txt
  src/CMakeLists.txt
  src/listenermodel.cpp
  src/listenermodel.h
  src/message-indicator.cpp


--
lp:plasma-widget-message-indicator
https://code.launchpad.net/~agateau/plasma-widget-message-indicator/trunk

Your team ayatana-commits is subscribed to branch lp:plasma-widget-message-indicator.
To unsubscribe from this branch go to https://code.launchpad.net/~agateau/plasma-widget-message-indicator/trunk/+edit-subscription.
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt	2010-02-19 14:34:52 +0000
+++ CMakeLists.txt	2010-03-08 10:20:45 +0000
@@ -7,16 +7,19 @@
 include(KDE4Defaults)
 find_package(PkgConfig REQUIRED)
 pkg_check_modules(INDICATE REQUIRED indicate>=0.2.1)
-pkg_check_modules(INDICATEQT REQUIRED indicate-qt>=0.2.4)
+pkg_check_modules(INDICATEQT REQUIRED indicate-qt>=0.2.5)
+pkg_check_modules(DBUSMENUQT REQUIRED dbusmenu-qt>=0.2.2)
 
 include_directories(
     ${KDE4_INCLUDES}
     ${INDICATE_INCLUDE_DIRS}
     ${INDICATEQT_INCLUDE_DIRS}
+    ${DBUSMENUQT_INCLUDE_DIRS}
     )
 
 link_directories(
     ${INDICATEQT_LIBRARY_DIRS}
+    ${DBUSMENUQT_LIBRARY_DIRS}
     )
 
 add_subdirectory(src)

=== modified file 'src/CMakeLists.txt'
--- src/CMakeLists.txt	2010-01-15 10:26:42 +0000
+++ src/CMakeLists.txt	2010-03-08 10:20:45 +0000
@@ -18,7 +18,7 @@
     ${KDE4_PLASMA_LIBS}
     ${KDE4_KIO_LIBS}
     ${INDICATEQT_LIBRARIES}
-    ${INDICATE_LIBRARIES}
+    ${DBUSMENUQT_LIBRARIES}
     )
 
 install(TARGETS plasma_applet_message_indicator

=== modified file 'src/listenermodel.cpp'
--- src/listenermodel.cpp	2010-02-16 10:25:12 +0000
+++ src/listenermodel.cpp	2010-03-08 10:20:45 +0000
@@ -12,6 +12,8 @@
 #include "listenermodel.h"
 
 // Qt
+#include <QDBusInterface>
+#include <QMenu>
 #include <QRegExp>
 #include <QTime>
 
@@ -27,6 +29,9 @@
 // libindicate-qt
 #include <qindicatedecode.h>
 
+// libdbusmenu-qt
+#include <dbusmenuimporter.h>
+
 // Local
 
 #define USE_ICONS_FOR_SERVERS
@@ -38,6 +43,22 @@
     OutdatedKeyListRole
 };
 
+struct ServerInfo
+{
+    ServerInfo()
+    : item(0)
+    , menuImporter(0)
+    {}
+
+    ServerInfo(QStandardItem* _item)
+    : item(_item)
+    , menuImporter(0)
+    {}
+
+    QStandardItem* item;
+    DBusMenuImporter* menuImporter;
+};
+
 typedef QPair<QIndicate::Listener::Server*, QIndicate::Listener::Indicator*> ServerIndicatorPair;
 typedef QHash<ServerIndicatorPair, QStandardItem*> ItemForIndicatorHash;
 typedef QSet<QIndicate::Listener::Indicator*> IndicatorSet;
@@ -50,7 +71,7 @@
     // Indicators we have received, but for which we haven't received a server
     // yet
     QHash<QIndicate::Listener::Server*, IndicatorSet> mWaitingIndicators;
-    QHash<QIndicate::Listener::Server*, QStandardItem*> mItemForServer;
+    QHash<QIndicate::Listener::Server*, ServerInfo> mServerInfoForServer;
     ItemForIndicatorHash mItemForIndicator;
 
     void updateIndicatorItem(QStandardItem* item)
@@ -135,7 +156,7 @@
         return;
     }
 
-    if (d->mItemForServer.contains(server)) {
+    if (d->mServerInfoForServer.contains(server)) {
         kWarning() << "We already know about server" << server;
         return;
     }
@@ -143,7 +164,7 @@
     QStandardItem* item = new QStandardItem;
     item->setData(QVariant::fromValue(server), ServerRole);
     item->setData(type, ServerTypeRole);
-    d->mItemForServer.insert(server, item);
+    d->mServerInfoForServer.insert(server, ServerInfo(item));
     appendRow(item);
 
     // Simulate slotIndicatorAdded for waiting indicators
@@ -171,7 +192,7 @@
         name = fileName.section('/', -1);
     }
 
-    QStandardItem* item = d->mItemForServer.value(server);
+    QStandardItem* item = d->mServerInfoForServer.value(server).item;
     Q_ASSERT(item);
     item->setText(name);
 
@@ -187,6 +208,56 @@
         item->setData(QVariant(icon), Qt::DecorationRole);
     }
 #endif
+
+    d->mListener->getServerMenuObjectPath(server,
+                                          this,
+                                          SLOT(slotMenuObjectPathReceived(
+                                               QIndicate::Listener::Server*,
+                                               const QString&)
+                                               )
+                                          );
+}
+
+class MyDBusMenuImporter : public DBusMenuImporter
+{
+public:
+    MyDBusMenuImporter(QDBusAbstractInterface* iface, QObject* parent = 0)
+    : DBusMenuImporter(iface, parent)
+    {}
+
+protected:
+    virtual QMenu* createMenu(QWidget* parent)
+    {
+        return new QMenu(parent);
+    }
+
+    virtual QIcon iconForName(const QString&)
+    {
+        return QIcon();
+    }
+};
+
+void ListenerModel::slotMenuObjectPathReceived(QIndicate::Listener::Server* server, const QString& objectPath)
+{
+    if (objectPath.isEmpty()) {
+        kWarning() << "Empty objectPath!";
+        return;
+    }
+
+    if (!d->mServerInfoForServer.contains(server)) {
+        kWarning() << "No server info found for server" << server;
+        return;
+    }
+
+    QString dbusName = d->mListener->getServerMenuDBusName(server);
+    if (dbusName.isEmpty()) {
+        kWarning() << "Empty dbusname!";
+        return;
+    }
+
+    QDBusInterface* iface = new QDBusInterface(dbusName, objectPath);
+    DBusMenuImporter* importer = new MyDBusMenuImporter(iface, this);
+    d->mServerInfoForServer[server].menuImporter = importer;
 }
 
 void ListenerModel::slotServerRemoved(QIndicate::Listener::Server* server)
@@ -195,7 +266,7 @@
         d->mWaitingIndicators.remove(server);
         return;
     }
-    QStandardItem* item = d->mItemForServer.value(server);
+    QStandardItem* item = d->mServerInfoForServer.value(server).item;
     if (!item) {
         kWarning() << "No item found for server" << server;
         return;
@@ -207,13 +278,13 @@
     }
 
     // Delete server item
-    d->mItemForServer.remove(server);
+    d->mServerInfoForServer.remove(server);
     removeRow(item->row());
 }
 
 void ListenerModel::slotServerCountChanged(QIndicate::Listener::Server* server, int count)
 {
-    QStandardItem* item = d->mItemForServer.value(server);
+    QStandardItem* item = d->mServerInfoForServer.value(server).item;
     if (!item) {
         kWarning() << "No item found for server" << server;
         return;
@@ -232,7 +303,7 @@
         << INDICATE_INDICATOR_MESSAGES_PROP_ATTENTION
         << INDICATE_INDICATOR_MESSAGES_PROP_COUNT;
 
-    QStandardItem* serverItem = d->mItemForServer.value(server);
+    QStandardItem* serverItem = d->mServerInfoForServer.value(server).item;
     if (!serverItem) {
         kWarning() << "We received indicatorAdded() signal before serverAdded() signal!";
         d->mWaitingIndicators[server] << indicator;
@@ -347,4 +418,14 @@
     }
 }
 
+void ListenerModel::activate(const QModelIndex& index)
+{
+    QIndicate::Listener::Server* server = 0;
+    QIndicate::Listener::Indicator* indicator = 0;
+
+    getProxiesForIndex(index, &server, &indicator);
+    d->mListener->display(server, indicator);
+
+}
+
 #include "listenermodel.moc"

=== modified file 'src/listenermodel.h'
--- src/listenermodel.h	2010-02-16 10:25:12 +0000
+++ src/listenermodel.h	2010-03-08 10:20:45 +0000
@@ -44,6 +44,11 @@
                             QIndicate::Listener::Server** server,
                             QIndicate::Listener::Indicator** indicator) const;
 
+    /**
+     * Triggers the action associated with this index
+     */
+    void activate(const QModelIndex& index);
+
 Q_SIGNALS:
     void drawAttentionChanged(const QModelIndex&);
 
@@ -52,6 +57,7 @@
     void slotServerCountChanged(QIndicate::Listener::Server* server, int count);
     void slotServerRemoved(QIndicate::Listener::Server* server);
     void slotDesktopFileReceived(QIndicate::Listener::Server* server, const QByteArray&);
+    void slotMenuObjectPathReceived(QIndicate::Listener::Server* server, const QString&);
 
     void slotIndicatorAdded(QIndicate::Listener::Server* server,
                             QIndicate::Listener::Indicator* indicator);

=== modified file 'src/message-indicator.cpp'
--- src/message-indicator.cpp	2010-02-16 10:36:43 +0000
+++ src/message-indicator.cpp	2010-03-08 10:20:45 +0000
@@ -204,12 +204,7 @@
 
 void MessageIndicator::slotClicked(const QModelIndex& index)
 {
-    QIndicate::Listener::Server* server = 0;
-    QIndicate::Listener::Indicator* indicator = 0;
-
-    mSourceModel->getProxiesForIndex(index, &server, &indicator);
-    mListener->display(server, indicator);
-
+    mSourceModel->activate(index);
     hidePopup();
 }