[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebase/workspace/plasma/applets/systemtray/protocols/dbussystemtray
From:       Marco Martin <notmart () gmail ! com>
Date:       2009-04-15 20:08:25
Message-ID: 1239826105.700094.7804.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 954478 by mart:

asincronously fetch all the properties...
at once


 M  +68 -44    dbussystemtraytask.cpp  
 M  +1 -3      dbussystemtraytask.h  


--- trunk/KDE/kdebase/workspace/plasma/applets/systemtray/protocols/dbussystemtray/dbussystemtraytask.cpp \
#954477:954478 @@ -65,16 +65,18 @@
 
     void iconDestroyed(QObject *obj);
     void refresh();
-    void syncIcon();
 
-    void syncAttentionIcon();
     void blinkAttention();
-    void syncMovie();
     void updateMovieFrame();
 
     void syncToolTip();
     void syncStatus(QString status);
 
+    //callbacks
+    void setCategory(const QString &);
+    void syncToolTip(const ToolTipStruct &);
+    void syncMovie(const ImageVector &);
+    void refreshCallback(QDBusPendingCallWatcher *call);
 
 
     DBusSystemTrayTask *q;
@@ -108,14 +110,12 @@
 
     d->notificationAreaItemInterface = new org::kde::NotificationAreaItem(service, \
                "/NotificationAreaItem",
                                                  QDBusConnection::sessionBus());
-    d->notificationAreaItemInterface->title();
 
-    d->category = (ItemCategory)metaObject()->enumerator(metaObject()->indexOfEnumera \
tor("ItemCategory")).keyToValue(d->notificationAreaItemInterface->category().toLatin1());
 +    d->refresh();
 
-
-    connect(d->notificationAreaItemInterface, SIGNAL(NewIcon()), this, \
                SLOT(syncIcon()));
-    connect(d->notificationAreaItemInterface, SIGNAL(NewAttentionIcon()), this, \
                SLOT(syncAttentionIcon()));
-    connect(d->notificationAreaItemInterface, SIGNAL(NewToolTip()), this, \
SLOT(syncToolTip())); +    connect(d->notificationAreaItemInterface, \
SIGNAL(NewIcon()), this, SLOT(refresh())); +    \
connect(d->notificationAreaItemInterface, SIGNAL(NewAttentionIcon()), this, \
SLOT(refresh())); +    connect(d->notificationAreaItemInterface, \
                SIGNAL(NewToolTip()), this, SLOT(refresh()));
     connect(d->notificationAreaItemInterface, SIGNAL(NewStatus(QString)), this, \
SLOT(syncStatus(QString)));  }
 
@@ -219,49 +219,68 @@
 
 void DBusSystemTrayTaskPrivate::refresh()
 {
-    syncIcon();
-    syncAttentionIcon();
-    syncMovie();
-    syncToolTip();
-    syncStatus(notificationAreaItemInterface->status());
+    QDBusMessage message = \
QDBusMessage::createMethodCall(notificationAreaItemInterface->service(), +    \
notificationAreaItemInterface->path(), "org.freedesktop.DBus.Properties", "GetAll"); \
+ +    message << notificationAreaItemInterface->interface();
+    QDBusPendingCall call = \
notificationAreaItemInterface->connection().asyncCall(message); +    \
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, q); +    \
q->connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher *)), q, \
SLOT(refreshCallback(QDBusPendingCallWatcher *)));  }
 
-QPixmap DBusSystemTrayTaskPrivate::iconDataToPixmap(const ImageStruct &icon) const
+
+void DBusSystemTrayTaskPrivate::refreshCallback(QDBusPendingCallWatcher *call)
 {
-    QImage iconImage( icon.width, icon.height, QImage::Format_ARGB32 );
-    memcpy(iconImage.bits(), (uchar*)icon.data.data(), iconImage.numBytes());
+    QDBusPendingReply<QVariantMap> reply = *call;
+    QVariantMap properties = reply.argumentAt<0>();
+    if (!reply.isError()) {
+        setCategory(properties["Category"].toString());
 
-    return QPixmap::fromImage(iconImage);
-}
+        syncStatus(properties["Status"].toString());
 
-//normal icon
-void DBusSystemTrayTaskPrivate::syncIcon()
-{
-    if (notificationAreaItemInterface->icon().length() > 0) {
-        icon = KIcon(notificationAreaItemInterface->icon());
-    } else {
-        icon = iconDataToPixmap(notificationAreaItemInterface->image());
-    }
+        //Icon
+        if (properties["Icon"].toString().length() > 0) {
+            icon = KIcon(properties["Icon"].toString());
+        } else {
+            ImageStruct image;
+            properties["Image"].value<QDBusArgument>()>>image;
+            icon = iconDataToPixmap(image);
+        }
 
-    if (status != DBusSystemTrayTask::NeedsAttention) {
-        foreach (Plasma::IconWidget *iconWidget, iconWidgets) {
-            iconWidget->setIcon(icon);
+        if (status != DBusSystemTrayTask::NeedsAttention) {
+            foreach (Plasma::IconWidget *iconWidget, iconWidgets) {
+                iconWidget->setIcon(icon);
+            }
         }
-    }
-}
 
+        //Attention icon
+        if (properties["AttentionIcon"].toString().length() > 0) {
+            attentionIcon = KIcon(properties["AttentionIcon"].toString());
+        } else {
+            ImageStruct image;
+            properties["AttentionImage"].value<QDBusArgument>()>>image;
+            attentionIcon = iconDataToPixmap(image);
+        }
 
-//Attention icon and movie
+        ImageVector movie;
+        properties["AttentionMovie"].value<QDBusArgument>()>>movie;
+        syncMovie(movie);
 
-void DBusSystemTrayTaskPrivate::syncAttentionIcon()
-{
-    if (notificationAreaItemInterface->attentionIcon().length() > 0) {
-        attentionIcon = KIcon(notificationAreaItemInterface->attentionIcon());
-    } else {
-        attentionIcon = \
iconDataToPixmap(notificationAreaItemInterface->attentionImage()); +        \
ToolTipStruct toolTip; +        \
properties["ToolTip"].value<QDBusArgument>()>>toolTip; +        syncToolTip(toolTip);
     }
+    delete call;
 }
 
+QPixmap DBusSystemTrayTaskPrivate::iconDataToPixmap(const ImageStruct &icon) const
+{
+    QImage iconImage( icon.width, icon.height, QImage::Format_ARGB32 );
+    memcpy(iconImage.bits(), (uchar*)icon.data.data(), iconImage.numBytes());
+
+    return QPixmap::fromImage(iconImage);
+}
+
 void DBusSystemTrayTaskPrivate::blinkAttention()
 {
     if (blink) {
@@ -276,9 +295,8 @@
     blink = !blink;
 }
 
-void DBusSystemTrayTaskPrivate::syncMovie()
+void DBusSystemTrayTaskPrivate::syncMovie(const ImageVector &movieData)
 {
-    ImageVector movieData = notificationAreaItemInterface->attentionMovie();
     movie = QVector<QPixmap>(movieData.size());
 
     if (!movieData.isEmpty()) {
@@ -288,6 +306,8 @@
     }
 }
 
+
+
 void DBusSystemTrayTaskPrivate::updateMovieFrame()
 {
     foreach (Plasma::IconWidget *iconWidget, iconWidgets) {
@@ -299,10 +319,8 @@
 
 //toolTip
 
-void DBusSystemTrayTaskPrivate::syncToolTip()
+void DBusSystemTrayTaskPrivate::syncToolTip(const ToolTipStruct &tipStruct)
 {
-    ToolTipStruct tipStruct = notificationAreaItemInterface->toolTip();
-
     if (tipStruct.title.isEmpty()) {
         foreach (Plasma::IconWidget *iconWidget, iconWidgets) {
             Plasma::ToolTipManager::self()->clearContent(iconWidget);
@@ -378,6 +396,12 @@
     emit q->changed(q);
 }
 
+
+void DBusSystemTrayTaskPrivate::setCategory(const QString &cat)
+{
+    category = (DBusSystemTrayTask::ItemCategory)q->metaObject()->enumerator(q->metaObject()->indexOfEnumerator("ItemCategory")).keyToValue(cat.toLatin1());
  }
 
+}
+
 #include "dbussystemtraytask.moc"
--- trunk/KDE/kdebase/workspace/plasma/applets/systemtray/protocols/dbussystemtray/dbussystemtraytask.h \
#954477:954478 @@ -71,10 +71,8 @@
 
     Q_PRIVATE_SLOT(d, void iconDestroyed(QObject *obj))
     Q_PRIVATE_SLOT(d, void refresh())
-    Q_PRIVATE_SLOT(d, void syncIcon())
-    Q_PRIVATE_SLOT(d, void syncAttentionIcon())
-    Q_PRIVATE_SLOT(d, void syncToolTip())
     Q_PRIVATE_SLOT(d, void syncStatus(QString status))
+    Q_PRIVATE_SLOT(d, void refreshCallback(QDBusPendingCallWatcher *))
     Q_PRIVATE_SLOT(d, void updateMovieFrame())
     Q_PRIVATE_SLOT(d, void blinkAttention())
 };


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic