ayatana-commits team mailing list archive
-
ayatana-commits team
-
Mailing list archive
-
Message #01090
[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();
}