[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