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

4
src/imports/mvvmdatasyncquick/DataSyncView.qml

@ -144,7 +144,7 @@ Page {
Layout.fillWidth: true
Layout.fillHeight: true
clip: true
model: viewModel.accountModel
model: viewModel.sortedModel
ScrollBar.vertical: ScrollBar {}
@ -217,7 +217,7 @@ Page {
Material.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
clip: true
model: viewModel.deviceModel
model: viewModel.sortedModel
ScrollBar.vertical: ScrollBar {}

2
src/mvvmdatasynccore/changeremoteviewmodel.cpp

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

20
src/mvvmdatasynccore/datasyncviewmodel.cpp

@ -49,6 +49,7 @@ DataSyncViewModel::DataSyncViewModel(QObject *parent) :
ViewModel(parent),
d(new DataSyncViewModelPrivate(this))
{
d->sortedModel->setSourceModel(d->accountModel);
resetColorMap();
}
@ -101,6 +102,11 @@ AccountModel *DataSyncViewModel::accountModel() const
return d->accountModel;
}
QSortFilterProxyModel *DataSyncViewModel::sortedModel() const
{
return d->sortedModel;
}
QString DataSyncViewModel::formatFingerPrint(const QByteArray &fingerPrint)
{
QByteArrayList res;
@ -251,6 +257,14 @@ void DataSyncViewModel::startNetworkExchange()
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)
{
if (d->colorMap == colorMap)
@ -352,7 +366,10 @@ void DataSyncViewModel::onInit(const QVariantHash &params)
this, &DataSyncViewModel::showAccessGranted);
connect(d->accountManager, &AccountManager::accountDevices,
this, &DataSyncViewModel::triggerGranted);
//model
d->accountModel->setup(d->accountManager, d->syncManager);
d->sortedModel->sort(0);
emit syncManagerChanged(d->syncManager);
emit accountManagerChanged(d->accountManager);
@ -391,7 +408,8 @@ QtMvvm::DataSyncViewModelPrivate::DataSyncViewModelPrivate(DataSyncViewModel *q_
syncManager(nullptr),
accountManager(nullptr),
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)

5
src/mvvmdatasynccore/datasyncviewmodel.h

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

1
src/mvvmdatasynccore/datasyncviewmodel_p.h

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

7
src/mvvmdatasynccore/exchangedevicesmodel.cpp

@ -36,9 +36,12 @@ void ExchangeDevicesModel::setup(QtDataSync::UserExchangeManager *exchangeManage
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

5
src/mvvmdatasynccore/exchangedevicesmodel.h

@ -29,7 +29,10 @@ public:
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;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;

38
src/mvvmdatasynccore/networkexchangeviewmodel.cpp

@ -37,7 +37,9 @@ QVariantHash NetworkExchangeViewModel::showParams(AccountManager *accountManager
NetworkExchangeViewModel::NetworkExchangeViewModel(QObject *parent) :
ViewModel(parent),
d(new NetworkExchangeViewModelPrivate(this))
{}
{
d->sortedModel->setSourceModel(d->deviceModel);
}
NetworkExchangeViewModel::~NetworkExchangeViewModel() {}
@ -63,17 +65,26 @@ ExchangeDevicesModel *NetworkExchangeViewModel::deviceModel() const
return d->deviceModel;
}
void NetworkExchangeViewModel::exportTo(int index)
QSortFilterProxyModel *NetworkExchangeViewModel::sortedModel() const
{
auto exCode = NetworkExchangeViewModelPrivate::ExportRequestCode;
while(d->activeExports.contains(exCode))
exCode++;
auto info = d->deviceModel->infoAt(index);
d->activeExports.insert(exCode, info);
showForResult<ExportSetupViewModel>(exCode,
ExportSetupViewModel::showParams(tr("Export accont data to device \"%1\" with address \"%1\":")
.arg(info.name())
.arg(ExchangeDevicesModel::fullAddress(info))));
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;
while(d->activeExports.contains(exCode))
exCode++;
auto info = d->deviceModel->infoAt(index);
d->activeExports.insert(exCode, info);
showForResult<ExportSetupViewModel>(exCode,
ExportSetupViewModel::showParams(tr("Export accont data to device \"%1\" with address \"%1\":")
.arg(info.name())
.arg(ExchangeDevicesModel::fullAddress(info))));
}
}
void NetworkExchangeViewModel::setPort(quint16 port)
@ -127,6 +138,7 @@ void NetworkExchangeViewModel::onInit(const QVariantHash &params)
emit deviceNameChanged(deviceName());
d->deviceModel->setup(d->exchangeManager);
d->sortedModel->sort(0);
emit ready();
} catch(SetupDoesNotExistException &e) {
logCritical() << "Failed to init DataSyncViewModel with error:"
@ -228,5 +240,7 @@ void NetworkExchangeViewModel::newUserData(const UserInfo &userInfo, bool truste
NetworkExchangeViewModelPrivate::NetworkExchangeViewModelPrivate(NetworkExchangeViewModel *q_ptr) :
exchangeManager(nullptr),
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
#include <QtCore/qscopedpointer.h>
#include <QtCore/qsortfilterproxymodel.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(ExchangeDevicesModel* deviceModel READ deviceModel CONSTANT)
Q_PROPERTY(QSortFilterProxyModel* sortedModel READ sortedModel CONSTANT)
public:
static const QString paramSetup;
@ -37,9 +39,10 @@ public:
QString deviceName() const;
bool active() const;
ExchangeDevicesModel* deviceModel() const;
QSortFilterProxyModel* sortedModel() const;
public Q_SLOTS:
void exportTo(int index);
void exportTo(int sortedIndex);
void setPort(quint16 port);
void setDeviceName(QString deviceName);

1
src/mvvmdatasynccore/networkexchangeviewmodel_p.h

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

4
src/mvvmdatasyncwidgets/datasyncwindow.cpp

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

3
src/mvvmdatasyncwidgets/datasyncwindow.ui

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

2
src/mvvmdatasyncwidgets/networkexchangewindow.cpp

@ -23,7 +23,7 @@ NetworkExchangeWindow::NetworkExchangeWindow(ViewModel *viewModel, QWidget *pare
d->ui->exchangeCheckBox, "checked",
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() {}

Loading…
Cancel
Save