Browse Source

added sorting for lists in datasync views

pull/2/head
Skycoder42 7 years ago
parent
commit
617c58d8e9
  1. 15
      src/imports/mvvmdatasynccore/plugins.qmltypes
  2. 4
      src/imports/mvvmdatasyncquick/DataSyncView.qml
  3. 2
      src/imports/mvvmdatasyncquick/NetworkExchangeView.qml
  4. 2
      src/mvvmdatasynccore/changeremoteviewmodel.cpp
  5. 20
      src/mvvmdatasynccore/datasyncviewmodel.cpp
  6. 5
      src/mvvmdatasynccore/datasyncviewmodel.h
  7. 1
      src/mvvmdatasynccore/datasyncviewmodel_p.h
  8. 7
      src/mvvmdatasynccore/exchangedevicesmodel.cpp
  9. 5
      src/mvvmdatasynccore/exchangedevicesmodel.h
  10. 20
      src/mvvmdatasynccore/networkexchangeviewmodel.cpp
  11. 5
      src/mvvmdatasynccore/networkexchangeviewmodel.h
  12. 1
      src/mvvmdatasynccore/networkexchangeviewmodel_p.h
  13. 4
      src/mvvmdatasyncwidgets/datasyncwindow.cpp
  14. 3
      src/mvvmdatasyncwidgets/datasyncwindow.ui
  15. 2
      src/mvvmdatasyncwidgets/networkexchangewindow.cpp

15
src/imports/mvvmdatasynccore/plugins.qmltypes

@ -126,6 +126,7 @@ Module {
Property { name: "colorMap"; type: "ColorMap" } Property { name: "colorMap"; type: "ColorMap" }
Property { name: "statusString"; type: "string"; isReadonly: true } Property { name: "statusString"; type: "string"; isReadonly: true }
Property { name: "accountModel"; type: "QtMvvm::AccountModel"; isReadonly: true; isPointer: true } Property { name: "accountModel"; type: "QtMvvm::AccountModel"; isReadonly: true; isPointer: true }
Property { name: "sortedModel"; type: "QSortFilterProxyModel"; isReadonly: true; isPointer: true }
Signal { Signal {
name: "syncManagerChanged" name: "syncManagerChanged"
Parameter { name: "syncManager"; type: "QtDataSync::SyncManager"; isPointer: true } Parameter { name: "syncManager"; type: "QtDataSync::SyncManager"; isPointer: true }
@ -146,6 +147,10 @@ Module {
Method { name: "performReset" } Method { name: "performReset" }
Method { name: "changeRemote" } Method { name: "changeRemote" }
Method { name: "startNetworkExchange" } Method { name: "startNetworkExchange" }
Method {
name: "removeDevice"
Parameter { name: "sortedIndex"; type: "int" }
}
Method { Method {
name: "setColorMap" name: "setColorMap"
Parameter { name: "colorMap"; type: "ColorMap" } Parameter { name: "colorMap"; type: "ColorMap" }
@ -180,7 +185,12 @@ Module {
Method { Method {
name: "infoAt" name: "infoAt"
type: "QtDataSync::UserInfo" type: "QtDataSync::UserInfo"
Parameter { name: "index"; type: "int" } Parameter { name: "index"; type: "QModelIndex" }
}
Method {
name: "infoAt"
type: "QtDataSync::UserInfo"
Parameter { name: "row"; type: "int" }
} }
} }
Component { Component {
@ -259,6 +269,7 @@ Module {
Property { name: "deviceName"; type: "string" } Property { name: "deviceName"; type: "string" }
Property { name: "active"; type: "bool" } Property { name: "active"; type: "bool" }
Property { name: "deviceModel"; type: "ExchangeDevicesModel"; isReadonly: true; isPointer: true } Property { name: "deviceModel"; type: "ExchangeDevicesModel"; isReadonly: true; isPointer: true }
Property { name: "sortedModel"; type: "QSortFilterProxyModel"; isReadonly: true; isPointer: true }
Signal { name: "ready" } Signal { name: "ready" }
Signal { Signal {
name: "portChanged" name: "portChanged"
@ -274,7 +285,7 @@ Module {
} }
Method { Method {
name: "exportTo" name: "exportTo"
Parameter { name: "index"; type: "int" } Parameter { name: "sortedIndex"; type: "int" }
} }
Method { Method {
name: "setPort" name: "setPort"

4
src/imports/mvvmdatasyncquick/DataSyncView.qml

@ -144,7 +144,7 @@ Page {
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
clip: true clip: true
model: viewModel.accountModel model: viewModel.sortedModel
ScrollBar.vertical: ScrollBar {} ScrollBar.vertical: ScrollBar {}
@ -217,7 +217,7 @@ Page {
Material.foreground: "white" Material.foreground: "white"
Universal.foreground: "white" Universal.foreground: "white"
onClicked: viewModel.accountModel.removeDevice(index) onClicked: viewModel.removeDevice(index)
} }
} }
} }

2
src/imports/mvvmdatasyncquick/NetworkExchangeView.qml

@ -99,7 +99,7 @@ Page {
Layout.fillHeight: true Layout.fillHeight: true
clip: true clip: true
model: viewModel.deviceModel model: viewModel.sortedModel
ScrollBar.vertical: ScrollBar {} ScrollBar.vertical: ScrollBar {}

2
src/mvvmdatasynccore/changeremoteviewmodel.cpp

@ -22,6 +22,8 @@ ChangeRemoteViewModel::ChangeRemoteViewModel(QObject *parent) :
{KeyRole, "key"}, {KeyRole, "key"},
{ValueRole, "value"} {ValueRole, "value"}
}); });
_headerModel->setSortRole(KeyRole);
_headerModel->sort(0);
connect(this, &ChangeRemoteViewModel::urlChanged, connect(this, &ChangeRemoteViewModel::urlChanged,
this, &ChangeRemoteViewModel::validChanged); this, &ChangeRemoteViewModel::validChanged);

20
src/mvvmdatasynccore/datasyncviewmodel.cpp

@ -49,6 +49,7 @@ DataSyncViewModel::DataSyncViewModel(QObject *parent) :
ViewModel(parent), ViewModel(parent),
d(new DataSyncViewModelPrivate(this)) d(new DataSyncViewModelPrivate(this))
{ {
d->sortedModel->setSourceModel(d->accountModel);
resetColorMap(); resetColorMap();
} }
@ -101,6 +102,11 @@ AccountModel *DataSyncViewModel::accountModel() const
return d->accountModel; return d->accountModel;
} }
QSortFilterProxyModel *DataSyncViewModel::sortedModel() const
{
return d->sortedModel;
}
QString DataSyncViewModel::formatFingerPrint(const QByteArray &fingerPrint) QString DataSyncViewModel::formatFingerPrint(const QByteArray &fingerPrint)
{ {
QByteArrayList res; QByteArrayList res;
@ -251,6 +257,14 @@ void DataSyncViewModel::startNetworkExchange()
show<NetworkExchangeViewModel>(NetworkExchangeViewModel::showParams(d->accountManager)); show<NetworkExchangeViewModel>(NetworkExchangeViewModel::showParams(d->accountManager));
} }
void DataSyncViewModel::removeDevice(int sortedIndex)
{
auto mIndex = d->sortedModel->index(sortedIndex, 0);
auto index = d->sortedModel->mapToSource(mIndex);
if(index.isValid())
d->accountModel->removeDevice(index);
}
void DataSyncViewModel::setColorMap(DataSyncViewModel::ColorMap colorMap) void DataSyncViewModel::setColorMap(DataSyncViewModel::ColorMap colorMap)
{ {
if (d->colorMap == colorMap) if (d->colorMap == colorMap)
@ -352,7 +366,10 @@ void DataSyncViewModel::onInit(const QVariantHash &params)
this, &DataSyncViewModel::showAccessGranted); this, &DataSyncViewModel::showAccessGranted);
connect(d->accountManager, &AccountManager::accountDevices, connect(d->accountManager, &AccountManager::accountDevices,
this, &DataSyncViewModel::triggerGranted); this, &DataSyncViewModel::triggerGranted);
//model
d->accountModel->setup(d->accountManager, d->syncManager); d->accountModel->setup(d->accountManager, d->syncManager);
d->sortedModel->sort(0);
emit syncManagerChanged(d->syncManager); emit syncManagerChanged(d->syncManager);
emit accountManagerChanged(d->accountManager); emit accountManagerChanged(d->accountManager);
@ -391,7 +408,8 @@ QtMvvm::DataSyncViewModelPrivate::DataSyncViewModelPrivate(DataSyncViewModel *q_
syncManager(nullptr), syncManager(nullptr),
accountManager(nullptr), accountManager(nullptr),
colorMap(), colorMap(),
accountModel(new AccountModel(q_ptr)) accountModel(new AccountModel(q_ptr)),
sortedModel(new QSortFilterProxyModel(q_ptr))
{} {}
void DataSyncViewModelPrivate::performExport(bool trusted, bool includeServer, const QString &password) void DataSyncViewModelPrivate::performExport(bool trusted, bool includeServer, const QString &password)

5
src/mvvmdatasynccore/datasyncviewmodel.h

@ -3,6 +3,7 @@
#include <QtCore/qmap.h> #include <QtCore/qmap.h>
#include <QtCore/qscopedpointer.h> #include <QtCore/qscopedpointer.h>
#include <QtCore/qsortfilterproxymodel.h>
#include <QtGui/qcolor.h> #include <QtGui/qcolor.h>
@ -28,6 +29,7 @@ class Q_MVVMDATASYNCCORE_EXPORT DataSyncViewModel : public ViewModel
Q_PROPERTY(QString statusString READ statusString NOTIFY statusStringChanged) Q_PROPERTY(QString statusString READ statusString NOTIFY statusStringChanged)
Q_PROPERTY(QtMvvm::AccountModel* accountModel READ accountModel CONSTANT) Q_PROPERTY(QtMvvm::AccountModel* accountModel READ accountModel CONSTANT)
Q_PROPERTY(QSortFilterProxyModel* sortedModel READ sortedModel CONSTANT)
public: public:
typedef QMap<QtDataSync::SyncManager::SyncState, QColor> ColorMap; typedef QMap<QtDataSync::SyncManager::SyncState, QColor> ColorMap;
@ -47,6 +49,7 @@ public:
QString statusString() const; QString statusString() const;
AccountModel *accountModel() const; AccountModel *accountModel() const;
QSortFilterProxyModel* sortedModel() const;
Q_INVOKABLE static QString formatFingerPrint(const QByteArray &fingerPrint); Q_INVOKABLE static QString formatFingerPrint(const QByteArray &fingerPrint);
@ -59,6 +62,8 @@ public Q_SLOTS:
void changeRemote(); void changeRemote();
void startNetworkExchange(); void startNetworkExchange();
void removeDevice(int sortedIndex);
void setColorMap(ColorMap colorMap); void setColorMap(ColorMap colorMap);
void resetColorMap(); void resetColorMap();

1
src/mvvmdatasynccore/datasyncviewmodel_p.h

@ -21,6 +21,7 @@ public:
QtDataSync::AccountManager *accountManager; QtDataSync::AccountManager *accountManager;
DataSyncViewModel::ColorMap colorMap; DataSyncViewModel::ColorMap colorMap;
AccountModel *accountModel; AccountModel *accountModel;
QSortFilterProxyModel *sortedModel;
QSet<QUuid> pendingGrants; QSet<QUuid> pendingGrants;

7
src/mvvmdatasynccore/exchangedevicesmodel.cpp

@ -36,9 +36,12 @@ void ExchangeDevicesModel::setup(QtDataSync::UserExchangeManager *exchangeManage
this, &ExchangeDevicesModel::updateDevices); this, &ExchangeDevicesModel::updateDevices);
} }
UserInfo ExchangeDevicesModel::infoAt(int index) const UserInfo ExchangeDevicesModel::infoAt(const QModelIndex &index) const
{ {
return d->devices.value(index); if(index.isValid())
return d->devices.value(index.row());
else
return {};
} }
QVariant ExchangeDevicesModel::headerData(int section, Qt::Orientation orientation, int role) const QVariant ExchangeDevicesModel::headerData(int section, Qt::Orientation orientation, int role) const

5
src/mvvmdatasynccore/exchangedevicesmodel.h

@ -29,7 +29,10 @@ public:
Q_INVOKABLE void setup(QtDataSync::UserExchangeManager *exchangeManager); Q_INVOKABLE void setup(QtDataSync::UserExchangeManager *exchangeManager);
Q_INVOKABLE QtDataSync::UserInfo infoAt(int index) const; Q_INVOKABLE QtDataSync::UserInfo infoAt(const QModelIndex &index) const;
Q_INVOKABLE inline QtDataSync::UserInfo infoAt(int row) const {
return infoAt(index(row));
}
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override;

20
src/mvvmdatasynccore/networkexchangeviewmodel.cpp

@ -37,7 +37,9 @@ QVariantHash NetworkExchangeViewModel::showParams(AccountManager *accountManager
NetworkExchangeViewModel::NetworkExchangeViewModel(QObject *parent) : NetworkExchangeViewModel::NetworkExchangeViewModel(QObject *parent) :
ViewModel(parent), ViewModel(parent),
d(new NetworkExchangeViewModelPrivate(this)) d(new NetworkExchangeViewModelPrivate(this))
{} {
d->sortedModel->setSourceModel(d->deviceModel);
}
NetworkExchangeViewModel::~NetworkExchangeViewModel() {} NetworkExchangeViewModel::~NetworkExchangeViewModel() {}
@ -63,8 +65,16 @@ ExchangeDevicesModel *NetworkExchangeViewModel::deviceModel() const
return d->deviceModel; return d->deviceModel;
} }
void NetworkExchangeViewModel::exportTo(int index) QSortFilterProxyModel *NetworkExchangeViewModel::sortedModel() const
{ {
return d->sortedModel;
}
void NetworkExchangeViewModel::exportTo(int sortedIndex)
{
auto mIndex = d->sortedModel->index(sortedIndex, 0);
auto index = d->sortedModel->mapToSource(mIndex);
if(index.isValid()) {
auto exCode = NetworkExchangeViewModelPrivate::ExportRequestCode; auto exCode = NetworkExchangeViewModelPrivate::ExportRequestCode;
while(d->activeExports.contains(exCode)) while(d->activeExports.contains(exCode))
exCode++; exCode++;
@ -75,6 +85,7 @@ void NetworkExchangeViewModel::exportTo(int index)
.arg(info.name()) .arg(info.name())
.arg(ExchangeDevicesModel::fullAddress(info)))); .arg(ExchangeDevicesModel::fullAddress(info))));
} }
}
void NetworkExchangeViewModel::setPort(quint16 port) void NetworkExchangeViewModel::setPort(quint16 port)
{ {
@ -127,6 +138,7 @@ void NetworkExchangeViewModel::onInit(const QVariantHash &params)
emit deviceNameChanged(deviceName()); emit deviceNameChanged(deviceName());
d->deviceModel->setup(d->exchangeManager); d->deviceModel->setup(d->exchangeManager);
d->sortedModel->sort(0);
emit ready(); emit ready();
} catch(SetupDoesNotExistException &e) { } catch(SetupDoesNotExistException &e) {
logCritical() << "Failed to init DataSyncViewModel with error:" logCritical() << "Failed to init DataSyncViewModel with error:"
@ -228,5 +240,7 @@ void NetworkExchangeViewModel::newUserData(const UserInfo &userInfo, bool truste
NetworkExchangeViewModelPrivate::NetworkExchangeViewModelPrivate(NetworkExchangeViewModel *q_ptr) : NetworkExchangeViewModelPrivate::NetworkExchangeViewModelPrivate(NetworkExchangeViewModel *q_ptr) :
exchangeManager(nullptr), exchangeManager(nullptr),
deviceModel(new ExchangeDevicesModel(q_ptr)), deviceModel(new ExchangeDevicesModel(q_ptr)),
port(UserExchangeManager::DataExchangePort) sortedModel(new QSortFilterProxyModel(q_ptr)),
port(UserExchangeManager::DataExchangePort),
activeExports()
{} {}

5
src/mvvmdatasynccore/networkexchangeviewmodel.h

@ -2,6 +2,7 @@
#define QTMVVM_NETWORKEXCHANGEVIEWMODEL_H #define QTMVVM_NETWORKEXCHANGEVIEWMODEL_H
#include <QtCore/qscopedpointer.h> #include <QtCore/qscopedpointer.h>
#include <QtCore/qsortfilterproxymodel.h>
#include <QtMvvmCore/viewmodel.h> #include <QtMvvmCore/viewmodel.h>
@ -22,6 +23,7 @@ class Q_MVVMDATASYNCCORE_EXPORT NetworkExchangeViewModel : public ViewModel
Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged) Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged)
Q_PROPERTY(ExchangeDevicesModel* deviceModel READ deviceModel CONSTANT) Q_PROPERTY(ExchangeDevicesModel* deviceModel READ deviceModel CONSTANT)
Q_PROPERTY(QSortFilterProxyModel* sortedModel READ sortedModel CONSTANT)
public: public:
static const QString paramSetup; static const QString paramSetup;
@ -37,9 +39,10 @@ public:
QString deviceName() const; QString deviceName() const;
bool active() const; bool active() const;
ExchangeDevicesModel* deviceModel() const; ExchangeDevicesModel* deviceModel() const;
QSortFilterProxyModel* sortedModel() const;
public Q_SLOTS: public Q_SLOTS:
void exportTo(int index); void exportTo(int sortedIndex);
void setPort(quint16 port); void setPort(quint16 port);
void setDeviceName(QString deviceName); void setDeviceName(QString deviceName);

1
src/mvvmdatasynccore/networkexchangeviewmodel_p.h

@ -15,6 +15,7 @@ public:
QtDataSync::UserExchangeManager *exchangeManager; QtDataSync::UserExchangeManager *exchangeManager;
ExchangeDevicesModel *deviceModel; ExchangeDevicesModel *deviceModel;
QSortFilterProxyModel *sortedModel;
quint16 port; quint16 port;
QHash<quint32, QtDataSync::UserInfo> activeExports; QHash<quint32, QtDataSync::UserInfo> activeExports;
}; };

4
src/mvvmdatasyncwidgets/datasyncwindow.cpp

@ -83,7 +83,7 @@ void DataSyncWindow::viewModelReady()
this, "errorText", this, "errorText",
Binding::OneWayToView); Binding::OneWayToView);
//account manager bindings //account manager bindings
d->ui->treeView->setModel(d->viewModel->accountModel()); d->ui->treeView->setModel(d->viewModel->sortedModel());
//sync manager connections //sync manager connections
connect(d->ui->syncButton, &QCommandLinkButton::clicked, connect(d->ui->syncButton, &QCommandLinkButton::clicked,
@ -120,7 +120,7 @@ void DataSyncWindow::removeCurrentDevice()
{ {
auto index = d->ui->treeView->currentIndex(); auto index = d->ui->treeView->currentIndex();
if(index.isValid()) if(index.isValid())
d->viewModel->accountModel()->removeDevice(index); d->viewModel->removeDevice(index.row());
} }
// ------------- Private Implementation ------------- // ------------- Private Implementation -------------

3
src/mvvmdatasyncwidgets/datasyncwindow.ui

@ -190,6 +190,9 @@
<property name="itemsExpandable"> <property name="itemsExpandable">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="animated"> <property name="animated">
<bool>true</bool> <bool>true</bool>
</property> </property>

2
src/mvvmdatasyncwidgets/networkexchangewindow.cpp

@ -23,7 +23,7 @@ NetworkExchangeWindow::NetworkExchangeWindow(ViewModel *viewModel, QWidget *pare
d->ui->exchangeCheckBox, "checked", d->ui->exchangeCheckBox, "checked",
Binding::OneWayToViewModel);//NOTE workaround because of buggy active property in datasync Binding::OneWayToViewModel);//NOTE workaround because of buggy active property in datasync
d->ui->treeView->setModel(d->viewModel->deviceModel()); d->ui->treeView->setModel(d->viewModel->sortedModel());
} }
NetworkExchangeWindow::~NetworkExchangeWindow() {} NetworkExchangeWindow::~NetworkExchangeWindow() {}

Loading…
Cancel
Save