Skip to content
Snippets Groups Projects
Commit 682721b7 authored by Andreas Traczyk's avatar Andreas Traczyk
Browse files

jami-devices: replace C++ filter proxy model with QML-SFPM

Change-Id: I740199bc2c3da90dfe865a41b6ea3855a1b41fc4
parent bb548250
No related branches found
No related tags found
No related merge requests found
...@@ -32,8 +32,10 @@ AccountAdapter::AccountAdapter(AppSettingsManager* settingsManager, ...@@ -32,8 +32,10 @@ AccountAdapter::AccountAdapter(AppSettingsManager* settingsManager,
: QmlAdapterBase(instance, parent) : QmlAdapterBase(instance, parent)
, settingsManager_(settingsManager) , settingsManager_(settingsManager)
, accountListModel_(new AccountListModel(instance)) , accountListModel_(new AccountListModel(instance))
, deviceItemListModel_(new DeviceItemListModel(instance))
{ {
QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, accountListModel_.get(), "AccountListModel"); QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, accountListModel_.get(), "AccountListModel");
QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, deviceItemListModel_.get(), "DeviceItemListModel");
connect(&lrcInstance_->accountModel(), connect(&lrcInstance_->accountModel(),
&AccountModel::accountStatusChanged, &AccountModel::accountStatusChanged,
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "qmladapterbase.h" #include "qmladapterbase.h"
#include "accountlistmodel.h" #include "accountlistmodel.h"
#include "deviceitemlistmodel.h"
#include "lrcinstance.h" #include "lrcinstance.h"
#include "utils.h" #include "utils.h"
...@@ -103,5 +104,6 @@ private: ...@@ -103,5 +104,6 @@ private:
AppSettingsManager* settingsManager_; AppSettingsManager* settingsManager_;
QScopedPointer<AccountListModel> accountListModel_; QScopedPointer<AccountListModel> accountListModel_;
QScopedPointer<DeviceItemListModel> deviceItemListModel_;
}; };
Q_DECLARE_METATYPE(AccountAdapter*) Q_DECLARE_METATYPE(AccountAdapter*)
...@@ -26,49 +26,29 @@ ...@@ -26,49 +26,29 @@
#include "api/conversation.h" #include "api/conversation.h"
#include "api/devicemodel.h" #include "api/devicemodel.h"
DeviceItemListModel::DeviceItemListModel(QObject* parent) DeviceItemListModel::DeviceItemListModel(LRCInstance* instance, QObject* parent)
: AbstractListModelBase(parent) : AbstractListModelBase(parent)
{ {
connect(this, &AbstractListModelBase::lrcInstanceChanged, [this] { lrcInstance_ = instance;
if (lrcInstance_) {
if (!lrcInstance_->get_currentAccountId().isEmpty())
onAccountChanged();
connect(lrcInstance_, connect(lrcInstance_,
&LRCInstance::currentAccountIdChanged, &LRCInstance::currentAccountIdChanged,
this, this,
&DeviceItemListModel::onAccountChanged, &DeviceItemListModel::connectAccount,
Qt::UniqueConnection); Qt::UniqueConnection);
}
});
}
DeviceItemListModel::~DeviceItemListModel() {} connectAccount();
}
int int
DeviceItemListModel::rowCount(const QModelIndex& parent) const DeviceItemListModel::rowCount(const QModelIndex& parent) const
{ {
if (!parent.isValid() && lrcInstance_) { if (!parent.isValid() && lrcInstance_) {
/*
* Count.
*/
return lrcInstance_->getCurrentAccountInfo().deviceModel->getAllDevices().size(); return lrcInstance_->getCurrentAccountInfo().deviceModel->getAllDevices().size();
} }
/*
* A valid QModelIndex returns 0 as no entry has sub-elements.
*/
return 0; return 0;
} }
int
DeviceItemListModel::columnCount(const QModelIndex& parent) const
{
Q_UNUSED(parent);
/*
* Only need one column.
*/
return 1;
}
QVariant QVariant
DeviceItemListModel::data(const QModelIndex& index, int role) const DeviceItemListModel::data(const QModelIndex& index, int role) const
{ {
...@@ -98,27 +78,6 @@ DeviceItemListModel::roleNames() const ...@@ -98,27 +78,6 @@ DeviceItemListModel::roleNames() const
return roles; return roles;
} }
QModelIndex
DeviceItemListModel::index(int row, int column, const QModelIndex& parent) const
{
Q_UNUSED(parent);
if (column != 0) {
return QModelIndex();
}
if (row >= 0 && row < rowCount()) {
return createIndex(row, column);
}
return QModelIndex();
}
QModelIndex
DeviceItemListModel::parent(const QModelIndex& child) const
{
Q_UNUSED(child);
return QModelIndex();
}
Qt::ItemFlags Qt::ItemFlags
DeviceItemListModel::flags(const QModelIndex& index) const DeviceItemListModel::flags(const QModelIndex& index) const
{ {
...@@ -143,8 +102,12 @@ DeviceItemListModel::revokeDevice(QString deviceId, QString password) ...@@ -143,8 +102,12 @@ DeviceItemListModel::revokeDevice(QString deviceId, QString password)
} }
void void
DeviceItemListModel::onAccountChanged() DeviceItemListModel::connectAccount()
{ {
if (lrcInstance_->get_currentAccountId().isEmpty()) {
return;
}
reset(); reset();
auto* deviceModel = lrcInstance_->getCurrentAccountInfo().deviceModel.get(); auto* deviceModel = lrcInstance_->getCurrentAccountInfo().deviceModel.get();
......
...@@ -21,9 +21,7 @@ ...@@ -21,9 +21,7 @@
#include "abstractlistmodelbase.h" #include "abstractlistmodelbase.h"
#include <QSortFilterProxyModel> class DeviceItemListModel final : public AbstractListModelBase
class DeviceItemListModel : public AbstractListModelBase
{ {
Q_OBJECT Q_OBJECT
...@@ -31,74 +29,18 @@ public: ...@@ -31,74 +29,18 @@ public:
enum Role { DeviceName = Qt::UserRole + 1, DeviceID, IsCurrent }; enum Role { DeviceName = Qt::UserRole + 1, DeviceID, IsCurrent };
Q_ENUM(Role) Q_ENUM(Role)
explicit DeviceItemListModel(QObject* parent = nullptr); explicit DeviceItemListModel(LRCInstance* instance, QObject* parent = nullptr);
~DeviceItemListModel();
// QAbstractListModel override. // QAbstractListModel override.
int rowCount(const QModelIndex& parent = QModelIndex()) const override; int rowCount(const QModelIndex& parent = QModelIndex()) const override;
int columnCount(const QModelIndex& parent) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
// Override role name as access point in qml.
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const; Qt::ItemFlags flags(const QModelIndex& index) const override;
QModelIndex parent(const QModelIndex& child) const;
Qt::ItemFlags flags(const QModelIndex& index) const;
// This function is to reset the model when there's new account added. // This function is to reset the model when there's new account added.
Q_INVOKABLE void reset(); Q_INVOKABLE void reset();
Q_INVOKABLE void revokeDevice(QString deviceId, QString password); Q_INVOKABLE void revokeDevice(QString deviceId, QString password);
public Q_SLOTS: public Q_SLOTS:
void onAccountChanged(); void connectAccount();
};
class DeviceItemProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
Q_PROPERTY(LRCInstance* lrcInstance READ getLrcInstance WRITE setLrcInstance)
public:
explicit DeviceItemProxyModel(QObject* parent = nullptr)
: QSortFilterProxyModel(parent)
{
sourceModel_ = new DeviceItemListModel(this);
setSourceModel(sourceModel_);
setSortRole(DeviceItemListModel::Role::IsCurrent);
sort(0, Qt::DescendingOrder);
setFilterCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive);
}
bool lessThan(const QModelIndex& left, const QModelIndex& right) const override
{
QVariant leftIsCurrent = sourceModel()->data(left, DeviceItemListModel::Role::IsCurrent);
QVariant rightIsCurrent = sourceModel()->data(right, DeviceItemListModel::Role::IsCurrent);
if (leftIsCurrent.toBool())
return false;
if (rightIsCurrent.toBool())
return true;
QChar leftDeviceNameFirstChar
= sourceModel()->data(left, DeviceItemListModel::Role::DeviceName).toString().at(0);
QChar rightDeviceNameFirstChar
= sourceModel()->data(right, DeviceItemListModel::Role::DeviceName).toString().at(0);
return leftDeviceNameFirstChar < rightDeviceNameFirstChar;
}
LRCInstance* getLrcInstance()
{
return sourceModel_->property("lrcInstance").value<LRCInstance*>();
}
void setLrcInstance(LRCInstance* instance)
{
sourceModel_->setProperty("lrcInstance", QVariant::fromValue(instance));
}
private:
DeviceItemListModel* sourceModel_;
}; };
...@@ -153,7 +153,6 @@ registerTypes(QQmlEngine* engine, ...@@ -153,7 +153,6 @@ registerTypes(QQmlEngine* engine,
QML_REGISTERNAMESPACE(NS_ENUMS, dummy::staticMetaObject, ""); QML_REGISTERNAMESPACE(NS_ENUMS, dummy::staticMetaObject, "");
// QAbstractListModels // QAbstractListModels
QML_REGISTERTYPE(NS_MODELS, DeviceItemProxyModel);
QML_REGISTERTYPE(NS_MODELS, BannedListModel); QML_REGISTERTYPE(NS_MODELS, BannedListModel);
QML_REGISTERTYPE(NS_MODELS, ModeratorListModel); QML_REGISTERTYPE(NS_MODELS, ModeratorListModel);
QML_REGISTERTYPE(NS_MODELS, MediaCodecListModel); QML_REGISTERTYPE(NS_MODELS, MediaCodecListModel);
......
...@@ -20,6 +20,8 @@ import QtQuick ...@@ -20,6 +20,8 @@ import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import SortFilterProxyModel 0.2
import net.jami.Models 1.1 import net.jami.Models 1.1
import net.jami.Adapters 1.1 import net.jami.Adapters 1.1
import net.jami.Constants 1.1 import net.jami.Constants 1.1
...@@ -49,7 +51,7 @@ ColumnLayout { ...@@ -49,7 +51,7 @@ ColumnLayout {
id: revokeDevicePasswordDialog id: revokeDevicePasswordDialog
onRevokeDeviceWithPassword: function(idOfDevice, password) { onRevokeDeviceWithPassword: function(idOfDevice, password) {
deviceItemListModel.sourceModel.revokeDevice(idOfDevice, password) DeviceItemListModel.revokeDevice(idOfDevice, password)
} }
} }
...@@ -64,7 +66,9 @@ ColumnLayout { ...@@ -64,7 +66,9 @@ ColumnLayout {
buttonTitles: [JamiStrings.optionOk, JamiStrings.optionCancel] buttonTitles: [JamiStrings.optionOk, JamiStrings.optionCancel]
buttonStyles: [SimpleMessageDialog.ButtonStyle.TintedBlue, buttonStyles: [SimpleMessageDialog.ButtonStyle.TintedBlue,
SimpleMessageDialog.ButtonStyle.TintedBlack] SimpleMessageDialog.ButtonStyle.TintedBlack]
buttonCallBacks: [function() {deviceItemListModel.sourceModel.revokeDevice(idOfDev, "")}] buttonCallBacks: [
function() { DeviceItemListModel.revokeDevice(idOfDev, "") }
]
} }
Label { Label {
...@@ -83,10 +87,15 @@ ColumnLayout { ...@@ -83,10 +87,15 @@ ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 160 Layout.preferredHeight: 160
model: DeviceItemProxyModel { model: SortFilterProxyModel {
id: deviceItemListModel sourceModel: DeviceItemListModel
sorters: [
lrcInstance: LRCInstance RoleSorter { roleName: "IsCurrent"; sortOrder: Qt.DescendingOrder },
StringSorter {
roleName: "DeviceName"
caseSensitivity: Qt.CaseInsensitive
}
]
} }
delegate: DeviceItemDelegate { delegate: DeviceItemDelegate {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment