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