[SCM] ktp-common-internals packaging branch, master, updated. debian/16.04.2-1-111-g6e00b1c

Maximiliano Curia maxy at moszumanska.debian.org
Tue Sep 12 14:08:58 UTC 2017


Gitweb-URL: http://git.debian.org/?p=pkg-kde/applications/ktp-common-internals.git;a=commitdiff;h=ec9381e

The following commit has been merged in the master branch:
commit ec9381ebccfc5a6a7e7537bd745934988bb26aa6
Author: James D. Smith <smithjd15 at gmail.com>
Date:   Mon Jan 9 03:27:02 2017 -0700

    Implement > presence operator, correct < operator.
    Greater hidden presence type sort priority.
    Fully propagating PresenceModel with custom > presence operator.
    REVIEW: 126834
---
 KTp/Models/presence-model.cpp | 129 ++++++++++++++++++++++++++++++------------
 KTp/Models/presence-model.h   |  19 ++++---
 KTp/presence.cpp              |  13 +++--
 KTp/presence.h                |   7 ++-
 4 files changed, 119 insertions(+), 49 deletions(-)

diff --git a/KTp/Models/presence-model.cpp b/KTp/Models/presence-model.cpp
index ddc1a7c..04322f2 100644
--- a/KTp/Models/presence-model.cpp
+++ b/KTp/Models/presence-model.cpp
@@ -1,6 +1,7 @@
 /*
  * Presence Model - A model of settable presences.
  *
+ * Copyright (C) 2016 James D. Smith <smithjd15 at gmail.com>
  * Copyright (C) 2011 David Edmundson <kde at davidedmundson.co.uk>
  *
  * This library is free software; you can redistribute it and/or
@@ -30,20 +31,43 @@
 #include <KLocalizedString>
 #include <KConfig>
 #include <KConfigGroup>
+
+#include "types.h"
 #include "debug.h"
 
 namespace KTp
 {
 
+struct PresenceModelGreaterThan : public std::function<bool(KTp::Presence,KTp::Presence)>
+{
+    inline bool operator()(const KTp::Presence& presence, const KTp::Presence& other)
+    {
+        if (KTp::Presence::sortPriority(presence.type()) < KTp::Presence::sortPriority(other.type())) {
+            return true;
+        } else if (KTp::Presence::sortPriority(presence.type()) == KTp::Presence::sortPriority(other.type())) {
+            return (presence.statusMessage() < other.statusMessage());
+        } else {
+            return false;
+        }
+    }
+};
+
 PresenceModel::PresenceModel(QObject *parent) :
     QAbstractListModel(parent)
 {
+    Tp::registerTypes();
+
     loadPresences();
+
+    QDBusConnection::sessionBus().connect(QString(), QLatin1String("/Telepathy"),
+                                              QLatin1String("org.kde.Telepathy"),
+                                              QLatin1String("presenceModelChanged"),
+                                              this,
+                                              SLOT(propagationChange(QVariantList)));
 }
 
 PresenceModel::~PresenceModel()
 {
-    syncCustomPresencesToDisk();
 }
 
 void PresenceModel::syncCustomPresencesToDisk()
@@ -62,6 +86,20 @@ void PresenceModel::syncCustomPresencesToDisk()
     m_presenceGroup.sync();
 }
 
+void PresenceModel::propagationChange(const QVariantList modelChange)
+{
+    KTp::Presence presence = KTp::Presence(qdbus_cast<Tp::SimplePresence>(modelChange.value(0)));
+    bool presenceAdded = qdbus_cast<bool>(modelChange.value(1));
+
+    if (!presence.isValid()) {
+        return;
+    }
+
+    if (presenceAdded != m_presences.contains(presence)) {
+        modifyModel(presence);
+    }
+}
+
 QVariant PresenceModel::data(int index) const
 {
     if (index < 0 || index >= m_presences.size()) {
@@ -128,12 +166,12 @@ void PresenceModel::loadPresences()
 
 void PresenceModel::loadDefaultPresences()
 {
-    addPresence(Tp::Presence::available());
-    addPresence(Tp::Presence::busy());
-    addPresence(Tp::Presence::away());
-    addPresence(Tp::Presence::xa());
-    addPresence(Tp::Presence::hidden());
-    addPresence(Tp::Presence::offline());
+    modifyModel(KTp::Presence::available());
+    modifyModel(KTp::Presence::busy());
+    modifyModel(KTp::Presence::away());
+    modifyModel(KTp::Presence::xa());
+    modifyModel(KTp::Presence::hidden());
+    modifyModel(KTp::Presence::offline());
 }
 
 void PresenceModel::loadCustomPresences()
@@ -145,60 +183,77 @@ void PresenceModel::loadCustomPresences()
 
         switch (entry.first().toInt()) {
         case Tp::ConnectionPresenceTypeAvailable:
-            addPresence(Tp::Presence::available(statusMessage));
+            modifyModel(KTp::Presence::available(statusMessage));
             break;
         case Tp::ConnectionPresenceTypeAway:
-            addPresence(Tp::Presence::away(statusMessage));
+            modifyModel(KTp::Presence::away(statusMessage));
             break;
         case Tp::ConnectionPresenceTypeBusy:
-            addPresence(Tp::Presence::busy(statusMessage));
+            modifyModel(KTp::Presence::busy(statusMessage));
             break;
         case Tp::ConnectionPresenceTypeExtendedAway:
-            addPresence(Tp::Presence::xa(statusMessage));
+            modifyModel(KTp::Presence::xa(statusMessage));
         }
     }
 }
 
-QModelIndex PresenceModel::addPresence(const KTp::Presence &presence)
+void PresenceModel::modifyModel(const KTp::Presence &presence)
 {
     if (m_presences.contains(presence)) {
-        return createIndex(m_presences.indexOf(presence), 0);
-    }
+        int row = m_presences.indexOf(presence);
+        beginRemoveRows(QModelIndex(), row, row);
+        endRemoveRows();
+
+        m_presences.removeOne(presence);
+    } else {
+        m_presences.append(presence);
+
+        // Identical presence types with status messages are compared with the
+        // status messages in ascending order.
+        std::sort(m_presences.begin(), m_presences.end(), PresenceModelGreaterThan());
 
-    QList<KTp::Presence>::iterator i = qLowerBound(m_presences.begin(), m_presences.end(), KTp::Presence(presence));
-    m_presences.insert(i, presence);
+        int index = m_presences.indexOf(presence);
+
+        beginInsertRows(QModelIndex(), index, index);
+        endInsertRows();
+    }
 
-    int index = m_presences.indexOf(presence);
-    //this is technically a backwards and wrong, but I can't get a row from a const iterator,
-    //and using qLowerBound does seem a good approach
-    beginInsertRows(QModelIndex(), index, index);
-    endInsertRows();
     Q_EMIT countChanged();
-    return createIndex(index, 0);
 }
 
-void PresenceModel::removePresence(const KTp::Presence &presence)
+QModelIndex PresenceModel::addPresence(const KTp::Presence &presence)
 {
-    int row = m_presences.indexOf(presence);
-    beginRemoveRows(QModelIndex(), row, row);
-    m_presences.removeOne(presence);
-    endRemoveRows();
-    Q_EMIT countChanged();
+    if (!m_presences.contains(presence)) {
+        modifyModel(presence);
+        propagateChange(presence);
+    }
+
+    return createIndex(m_presences.indexOf(presence), 0);
 }
 
-int PresenceModel::updatePresenceApplet()
+void PresenceModel::removePresence(const KTp::Presence &presence)
 {
-    if (!QDBusConnection::sessionBus().isConnected()) {
-        return 1;
+    if (m_presences.contains(presence)) {
+        modifyModel(presence);
+        propagateChange(presence);
     }
+}
 
-    QDBusInterface callApplet(QLatin1String("org.kde.Telepathy.PresenceAppletActive"),
-                              QLatin1String("/"), QLatin1String(""), QDBusConnection::sessionBus());
-    if (callApplet.isValid()) {
-        callApplet.asyncCall(QLatin1String("handleCustomPresenceChange"));
-        return 0;
+void PresenceModel::propagateChange(const KTp::Presence &presence)
+{
+    QVariantList messageArgList;
+    QDBusMessage message = QDBusMessage::createSignal(QLatin1String("/Telepathy"),
+                                                          QLatin1String("org.kde.Telepathy"),
+                                                          QLatin1String("presenceModelChanged"));
+
+    messageArgList << QVariant::fromValue<Tp::SimplePresence>(presence.barePresence());
+    messageArgList << QVariant::fromValue<bool>(m_presences.contains(presence));
+    message << messageArgList;
+
+    if (!QDBusConnection::sessionBus().send(message)) {
+        const QString &error = QDBusConnection::sessionBus().lastError().message();
+        qCWarning(KTP_MODELS) << "presence model change propagation failed: " << error;
     }
-    return 1;
 }
 
 QHash<int, QByteArray> PresenceModel::roleNames() const
diff --git a/KTp/Models/presence-model.h b/KTp/Models/presence-model.h
index 8f206b8..7d35c9f 100644
--- a/KTp/Models/presence-model.h
+++ b/KTp/Models/presence-model.h
@@ -1,6 +1,7 @@
 /*
  * Presence Model - A model of settable presences.
  *
+ * Copyright (C) 2016 James D. Smith <smithjd15 at gmail.com>
  * Copyright (C) 2011 David Edmundson <kde at davidedmundson.co.uk>
  *
  * This library is free software; you can redistribute it and/or
@@ -45,9 +46,10 @@ public:
         IconNameRole
     };
 
-    /** Adds a custom presence to the model, and write value to config file.
-      @return the newly added item
-    */
+    /** Adds a custom presence to the model, writes it to the config file, and
+      * propagates it to other models.
+      * @return the newly added item
+      */
     QModelIndex addPresence(const KTp::Presence &presence);
 
     void removePresence(const KTp::Presence &presence);
@@ -58,9 +60,6 @@ public:
     /** Write all presences to disk */
     void syncCustomPresencesToDisk();
 
-    /** Updates context menu of presence applet */
-    int updatePresenceApplet();
-
     Q_SCRIPTABLE QVariant get(int row, const QByteArray& role) const;
 
     //protected:
@@ -69,12 +68,18 @@ public:
     virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
     virtual QHash<int, QByteArray> roleNames() const;
 
+public Q_SLOTS:
+    /** Incoming changes from other models */
+    void propagationChange(const QVariantList modelChange);
+
 Q_SIGNALS:
     void countChanged();
 
 private:
+    void modifyModel(const KTp::Presence &presence);
+    void propagateChange(const KTp::Presence &presence);
 
-    /** Loads standard presences (online, away etc) into */
+    /** Loads standard presences (online, away etc) into the model */
     void loadDefaultPresences();
 
     /** Loads any user custom presences into the model */
diff --git a/KTp/presence.cpp b/KTp/presence.cpp
index 6030db0..5ac92b1 100644
--- a/KTp/presence.cpp
+++ b/KTp/presence.cpp
@@ -78,7 +78,7 @@ QString Presence::iconName(bool useImIcons) const
 
 bool Presence::operator <(const Presence &other) const
 {
-    if (sortPriority(type()) < sortPriority(other.type())) {
+    if (sortPriority(type()) > sortPriority(other.type())) {
         return true;
     } else if (sortPriority(type()) == sortPriority(other.type())) {
         return (statusMessage() < other.statusMessage());
@@ -87,6 +87,11 @@ bool Presence::operator <(const Presence &other) const
     }
 }
 
+bool Presence::operator >(const Presence &other) const
+{
+    return (other < *this);
+}
+
 QString Presence::displayString() const
 {
     switch (type()) {
@@ -114,11 +119,11 @@ int Presence::sortPriority(const Tp::ConnectionPresenceType &type)
             return 0;
         case Tp::ConnectionPresenceTypeBusy:
             return 1;
-        case Tp::ConnectionPresenceTypeHidden:
-            return 2;
         case Tp::ConnectionPresenceTypeAway:
-            return 3;
+            return 2;
         case Tp::ConnectionPresenceTypeExtendedAway:
+            return 3;
+        case Tp::ConnectionPresenceTypeHidden:
             return 4;
         //don't distinguish between the following three presences
         case Tp::ConnectionPresenceTypeError:
diff --git a/KTp/presence.h b/KTp/presence.h
index 7da07d0..901bd98 100644
--- a/KTp/presence.h
+++ b/KTp/presence.h
@@ -69,11 +69,16 @@ public:
     QString displayString() const;
 
     /**
-     * rief Returns which presence is "more available"
+     * rief Returns which presence is "less available"
      */
     bool operator <(const Presence &other) const;
 
     /**
+     * rief Returns which presence is "more available"
+     */
+    bool operator >(const Presence &other) const;
+
+    /**
      * rief Returns an int representation of the presence type sorted by priority.
      *
      * 0 - most online, 7 - offline

-- 
ktp-common-internals packaging



More information about the pkg-kde-commits mailing list