Browse Source

implemented all ds core and widgets stuff

pull/2/head
Skycoder42 7 years ago
parent
commit
07d51d07c8
  1. 15
      src/mvvmdatasynccore/accountmodel.cpp
  2. 1
      src/mvvmdatasynccore/accountmodel.h
  3. 10
      src/mvvmdatasynccore/datasyncviewmodel.cpp
  4. 148
      src/mvvmdatasynccore/exchangedevicesmodel.cpp
  5. 51
      src/mvvmdatasynccore/exchangedevicesmodel.h
  6. 20
      src/mvvmdatasynccore/exchangedevicesmodel_p.h
  7. 19
      src/mvvmdatasynccore/exportsetupviewmodel.cpp
  8. 10
      src/mvvmdatasynccore/exportsetupviewmodel_p.h
  9. 2
      src/mvvmdatasynccore/identityeditviewmodel.cpp
  10. 4
      src/mvvmdatasynccore/identityeditviewmodel_p.h
  11. 10
      src/mvvmdatasynccore/mvvmdatasynccore.pro
  12. 225
      src/mvvmdatasynccore/networkexchangeviewmodel.cpp
  13. 69
      src/mvvmdatasynccore/networkexchangeviewmodel.h
  14. 24
      src/mvvmdatasynccore/networkexchangeviewmodel_p.h
  15. 3
      src/mvvmdatasyncwidgets/exportsetupdialog.cpp
  16. 19
      src/mvvmdatasyncwidgets/exportsetupdialog.ui
  17. 10
      src/mvvmdatasyncwidgets/mvvmdatasyncwidgets.pro
  18. 42
      src/mvvmdatasyncwidgets/networkexchangewindow.cpp
  19. 32
      src/mvvmdatasyncwidgets/networkexchangewindow.h
  20. 129
      src/mvvmdatasyncwidgets/networkexchangewindow.ui
  21. 24
      src/mvvmdatasyncwidgets/networkexchangewindow_p.h
  22. 2
      src/mvvmdatasyncwidgets/qtmvvmdatasyncwidgets_global.cpp

15
src/mvvmdatasynccore/accountmodel.cpp

@ -16,13 +16,14 @@ AccountModel::~AccountModel() {}
void AccountModel::setup(AccountManager *accountManager, SyncManager *syncManager)
{
beginResetModel();
d->devices.clear();
if(d->accountManager)
d->accountManager->disconnect(this);
d->accountManager = accountManager;
if(d->syncManager)
d->syncManager->disconnect(this);
beginResetModel();
d->devices.clear();
d->accountManager = accountManager;
d->syncManager = syncManager;
endResetModel();
@ -114,6 +115,14 @@ QVariant AccountModel::data(const QModelIndex &index, int role) const
return {};
}
QHash<int, QByteArray> AccountModel::roleNames() const
{
return {
{NameRole, "name"},
{FingerPrintRole, "fingerPrint"}
};
}
bool AccountModel::removeDevice(const QModelIndex &index)
{
if (!index.isValid())

1
src/mvvmdatasynccore/accountmodel.h

@ -33,6 +33,7 @@ public:
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;
Q_INVOKABLE bool removeDevice(const QModelIndex &index);
Q_INVOKABLE inline bool removeDevice(int row) {

10
src/mvvmdatasynccore/datasyncviewmodel.cpp

@ -1,5 +1,6 @@
#include "datasyncviewmodel.h"
#include "datasyncviewmodel_p.h"
#include "networkexchangeviewmodel.h"
#include "exportsetupviewmodel_p.h"
#include "changeremoteviewmodel_p.h"
#include "identityeditviewmodel_p.h"
@ -117,12 +118,13 @@ void DataSyncViewModel::showDeviceInfo()
{
if(!d->accountManager)
return;
show<IdentityEditViewModel>(IdentityEditViewModel::params(d->accountManager));
show<IdentityEditViewModel>(IdentityEditViewModel::showParams(d->accountManager));
}
void DataSyncViewModel::startExport()
{
showForResult<ExportSetupViewModel>(DataSyncViewModelPrivate::ExportRequestCode);
showForResult<ExportSetupViewModel>(DataSyncViewModelPrivate::ExportRequestCode,
ExportSetupViewModel::showParams(tr("Export account data to file:")));
}
void DataSyncViewModel::startImport()
@ -181,7 +183,7 @@ void DataSyncViewModel::startImport()
.setButtonText(MessageConfig::YesToAll, tr("Reset data"))
.setButtonText(MessageConfig::Yes, tr("Keep data"));
auto res = CoreApp::showDialog(config);
connect(res, &MessageResult::dialogDone, this, [this, res, data](MessageConfig::StandardButton btn) {
connect(res, &MessageResult::dialogDone, this, [this, data](MessageConfig::StandardButton btn) {
switch (btn) {
case MessageConfig::YesToAll:
d->performImport(false, {}, data, false);
@ -233,7 +235,7 @@ void DataSyncViewModel::changeRemote()
void DataSyncViewModel::startNetworkExchange()
{
Q_UNIMPLEMENTED();
show<NetworkExchangeViewModel>(NetworkExchangeViewModel::showParams(d->accountManager));
}
void DataSyncViewModel::setColorMap(DataSyncViewModel::ColorMap colorMap)

148
src/mvvmdatasynccore/exchangedevicesmodel.cpp

@ -0,0 +1,148 @@
#include "exchangedevicesmodel.h"
#include "exchangedevicesmodel_p.h"
using namespace QtMvvm;
using namespace QtDataSync;
ExchangeDevicesModel::ExchangeDevicesModel(QObject *parent) :
QAbstractListModel(parent),
d(new ExchangeDevicesModelPrivate())
{}
ExchangeDevicesModel::~ExchangeDevicesModel() {}
void ExchangeDevicesModel::setup(QtDataSync::UserExchangeManager *exchangeManager)
{
if(d->exchangeManager)
d->exchangeManager->disconnect(this);
beginResetModel();
d->exchangeManager = exchangeManager;
d->devices = d->exchangeManager->devices();
endResetModel();
connect(d->exchangeManager, &UserExchangeManager::devicesChanged,
this, &ExchangeDevicesModel::updateDevices);
}
UserInfo ExchangeDevicesModel::infoAt(int index) const
{
return d->devices.value(index);
}
QVariant ExchangeDevicesModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if(orientation != Qt::Horizontal)
return {};
switch (section) {
case 0:
switch(role) {
case NameRole:
return tr("Name");
case HostRole:
return tr("Host");
case PortRole:
return tr("Port");
case AddressRole:
return tr("Address");
default:
break;
}
break;
case 1:
if(role == Qt::DisplayRole)
return tr("Address");
break;
default:
break;
}
return {};
}
int ExchangeDevicesModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
else
return d->devices.size();
}
int ExchangeDevicesModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
else
return 2;
}
QVariant ExchangeDevicesModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
switch (index.column()) {
case 0:
switch(role) {
case NameRole:
return d->devices.value(index.row()).name();
case HostRole:
return d->devices.value(index.row()).address().toString();
case PortRole:
return d->devices.value(index.row()).port();
case AddressRole:
return fullAddress(d->devices.value(index.row()));
default:
break;
}
break;
case 1:
if(role == Qt::DisplayRole)
return fullAddress(d->devices.value(index.row()));
break;
default:
break;
}
return {};
}
QHash<int, QByteArray> ExchangeDevicesModel::roleNames() const
{
return {
{NameRole, "name"},
{HostRole, "host"},
{PortRole, "port"},
{AddressRole, "address"}
};
}
QString ExchangeDevicesModel::fullAddress(const UserInfo &userInfo)
{
return tr("%1:%2")
.arg(userInfo.address().toString())
.arg(userInfo.port());
}
void ExchangeDevicesModel::updateDevices(const QList<UserInfo> &devices)
{
QList<UserInfo> addList;
for(auto device : devices) {
auto dIndex = d->devices.indexOf(device);
if(dIndex != -1) {
if(device.name() != d->devices[dIndex].name()) {
d->devices[dIndex] = device;
emit dataChanged(index(dIndex), index(dIndex, 1));
}
} else
addList.append(device);
}
if(addList.isEmpty())
return;
beginInsertRows(QModelIndex(),
d->devices.size(),
d->devices.size() + addList.size() - 1);
d->devices.append(addList);
endInsertRows();
}

51
src/mvvmdatasynccore/exchangedevicesmodel.h

@ -0,0 +1,51 @@
#ifndef QTMVVM_EXCHANGEDEVICESMODEL_H
#define QTMVVM_EXCHANGEDEVICESMODEL_H
#include <QtCore/qabstractitemmodel.h>
#include <QtCore/qscopedpointer.h>
#include <QtDataSync/userexchangemanager.h>
#include "QtMvvmDataSyncCore/qtmvvmdatasynccore_global.h"
namespace QtMvvm {
class ExchangeDevicesModelPrivate;
class Q_MVVMDATASYNCCORE_EXPORT ExchangeDevicesModel : public QAbstractListModel
{
Q_OBJECT
public:
enum Roles {
NameRole = Qt::DisplayRole,
HostRole = Qt::UserRole + 1,
PortRole,
AddressRole
};
Q_ENUM(Roles)
explicit ExchangeDevicesModel(QObject *parent = nullptr);
~ExchangeDevicesModel();
Q_INVOKABLE void setup(QtDataSync::UserExchangeManager *exchangeManager);
Q_INVOKABLE QtDataSync::UserInfo infoAt(int index) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) 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;
QHash<int, QByteArray> roleNames() const override;
static QString fullAddress(const QtDataSync::UserInfo &userInfo);
private Q_SLOTS:
void updateDevices(const QList<QtDataSync::UserInfo> &devices);
private:
QScopedPointer<ExchangeDevicesModelPrivate> d;
};
}
#endif // QTMVVM_EXCHANGEDEVICESMODEL_H

20
src/mvvmdatasynccore/exchangedevicesmodel_p.h

@ -0,0 +1,20 @@
#ifndef QTMVVM_EXCHANGEDEVICESMODEL_P_H
#define QTMVVM_EXCHANGEDEVICESMODEL_P_H
#include <QtCore/QHash>
#include "qtmvvmdatasynccore_global.h"
#include "exchangedevicesmodel.h"
namespace QtMvvm {
class ExchangeDevicesModelPrivate
{
public:
QtDataSync::UserExchangeManager *exchangeManager = nullptr;
QList<QtDataSync::UserInfo> devices;
};
}
#endif // QTMVVM_EXCHANGEDEVICESMODEL_P_H

19
src/mvvmdatasynccore/exportsetupviewmodel.cpp

@ -1,6 +1,13 @@
#include "exportsetupviewmodel_p.h"
using namespace QtMvvm;
QVariantHash ExportSetupViewModel::showParams(const QString &label)
{
return {
{QStringLiteral("label"), label}
};
}
std::tuple<bool, bool, QString> ExportSetupViewModel::result(const QVariant &data)
{
auto map = data.toHash();
@ -11,6 +18,7 @@ std::tuple<bool, bool, QString> ExportSetupViewModel::result(const QVariant &dat
ExportSetupViewModel::ExportSetupViewModel(QObject *parent) :
ViewModel(parent),
_label(),
_trusted(false),
_includeServer(false),
_password()
@ -21,6 +29,11 @@ ExportSetupViewModel::ExportSetupViewModel(QObject *parent) :
this, &ExportSetupViewModel::validChanged);
}
QString ExportSetupViewModel::label() const
{
return _label;
}
bool ExportSetupViewModel::trusted() const
{
return _trusted;
@ -80,3 +93,9 @@ void ExportSetupViewModel::setPassword(QString password)
_password = password;
emit passwordChanged(_password);
}
void ExportSetupViewModel::onInit(const QVariantHash &params)
{
_label = params.value(QStringLiteral("label")).toString();
emit labelChanged(_label);
}

10
src/mvvmdatasynccore/exportsetupviewmodel_p.h

@ -13,6 +13,7 @@ class Q_MVVMDATASYNCCORE_EXPORT ExportSetupViewModel : public ViewModel
{
Q_OBJECT
Q_PROPERTY(QString label READ label NOTIFY labelChanged)
Q_PROPERTY(bool trusted READ trusted WRITE setTrusted NOTIFY trustedChanged)
Q_PROPERTY(bool includeServer READ includeServer WRITE setIncludeServer NOTIFY includeServerChanged)
Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)
@ -20,10 +21,12 @@ class Q_MVVMDATASYNCCORE_EXPORT ExportSetupViewModel : public ViewModel
Q_PROPERTY(bool valid READ isValid NOTIFY validChanged)
public:
static std::tuple<bool, bool, QString> result(const QVariant &data);
static QVariantHash showParams(const QString &label);
static std::tuple<bool, bool, QString> result(const QVariant &data); //(trusted, includeServer, password)
Q_INVOKABLE explicit ExportSetupViewModel(QObject *parent = nullptr);
QString label() const;
bool trusted() const;
bool includeServer() const;
QString password() const;
@ -37,12 +40,17 @@ public Q_SLOTS:
void setPassword(QString password);
Q_SIGNALS:
void labelChanged(QString label);
void trustedChanged(bool trusted);
void includeServerChanged(bool includeServer);
void passwordChanged(QString password);
void validChanged();
protected:
void onInit(const QVariantHash &params) override;
private:
QString _label;
bool _trusted;
QString _password;
bool _includeServer;

2
src/mvvmdatasynccore/identityeditviewmodel.cpp

@ -8,7 +8,7 @@ IdentityEditViewModel::IdentityEditViewModel(QObject *parent) :
_manager(nullptr)
{}
QVariantHash IdentityEditViewModel::params(AccountManager *manager)
QVariantHash IdentityEditViewModel::showParams(AccountManager *manager)
{
return {
{QStringLiteral("manager"), QVariant::fromValue(manager)}

4
src/mvvmdatasynccore/identityeditviewmodel_p.h

@ -19,7 +19,7 @@ class Q_MVVMDATASYNCCORE_EXPORT IdentityEditViewModel : public ViewModel
public:
Q_INVOKABLE explicit IdentityEditViewModel(QObject *parent = nullptr);
static QVariantHash params(QtDataSync::AccountManager *manager);
static QVariantHash showParams(QtDataSync::AccountManager *manager);
QString name() const;
QString fingerPrint() const;
@ -34,7 +34,7 @@ Q_SIGNALS:
void fingerPrintChanged();
protected:
void onInit(const QVariantHash &params) override;
void onInit(const QVariantHash &showParams) override;
private:
QtDataSync::AccountManager *_manager;

10
src/mvvmdatasynccore/mvvmdatasynccore.pro

@ -10,14 +10,20 @@ HEADERS += \
accountmodel_p.h \
exportsetupviewmodel_p.h \
changeremoteviewmodel_p.h \
identityeditviewmodel_p.h
identityeditviewmodel_p.h \
networkexchangeviewmodel.h \
networkexchangeviewmodel_p.h \
exchangedevicesmodel.h \
exchangedevicesmodel_p.h
SOURCES += \
datasyncviewmodel.cpp \
accountmodel.cpp \
exportsetupviewmodel.cpp \
changeremoteviewmodel.cpp \
identityeditviewmodel.cpp
identityeditviewmodel.cpp \
networkexchangeviewmodel.cpp \
exchangedevicesmodel.cpp
TRANSLATIONS += \
translations/qtmvvmdatasynccore_de.ts \

225
src/mvvmdatasynccore/networkexchangeviewmodel.cpp

@ -0,0 +1,225 @@
#include "networkexchangeviewmodel.h"
#include "networkexchangeviewmodel_p.h"
#include "datasyncviewmodel.h"
#include "exportsetupviewmodel_p.h"
#include <QtMvvmCore/Messages>
#include <QtDataSync/AccountManager>
#undef logDebug
#undef logInfo
#undef logWarning
#undef logCritical
#include <QtMvvmCore/private/qtmvvm_logging_p.h>
using namespace QtMvvm;
using namespace QtDataSync;
const QString NetworkExchangeViewModel::paramSetup(QStringLiteral("setup"));
const QString NetworkExchangeViewModel::paramAccountManager(QStringLiteral("accountManager"));
QVariantHash NetworkExchangeViewModel::showParams(const QString &setup)
{
return {
{paramSetup, setup}
};
}
QVariantHash NetworkExchangeViewModel::showParams(AccountManager *accountManager)
{
return {
{paramAccountManager, QVariant::fromValue(accountManager)}
};
}
NetworkExchangeViewModel::NetworkExchangeViewModel(QObject *parent) :
ViewModel(parent),
d(new NetworkExchangeViewModelPrivate(this))
{}
NetworkExchangeViewModel::~NetworkExchangeViewModel() {}
quint16 NetworkExchangeViewModel::port() const
{
return d->port;
}
QString NetworkExchangeViewModel::deviceName() const
{
return d->exchangeManager ?
d->exchangeManager->accountManager()->deviceName() :
QString();
}
bool NetworkExchangeViewModel::active() const
{
return d->exchangeManager && d->exchangeManager->isActive();
}
ExchangeDevicesModel *NetworkExchangeViewModel::deviceModel() const
{
return d->deviceModel;
}
void NetworkExchangeViewModel::exportTo(int index)
{
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)
{
if (d->port == port)
return;
d->port = port;
emit portChanged(d->port);
}
void NetworkExchangeViewModel::setDeviceName(QString deviceName)
{
if (!d->exchangeManager ||
this->deviceName() == deviceName)
return;
d->exchangeManager->accountManager()->setDeviceName(deviceName);
}
void NetworkExchangeViewModel::setActive(bool active)
{
if(active != this->active()) {
if(active)
d->exchangeManager->startExchange(d->port);
else
d->exchangeManager->stopExchange();
}
}
void NetworkExchangeViewModel::onInit(const QVariantHash &params)
{
try {
if(params.contains(paramAccountManager)) {
auto accountManager = params.value(paramAccountManager).value<AccountManager*>();
d->exchangeManager = new UserExchangeManager(accountManager, this);
} else {
auto setup = params.value(paramSetup, QtDataSync::DefaultSetup).toString();
d->exchangeManager = new UserExchangeManager(setup, this);
}
connect(d->exchangeManager->accountManager(), &AccountManager::deviceNameChanged,
this, &NetworkExchangeViewModel::deviceNameChanged);
connect(d->exchangeManager, &UserExchangeManager::userDataReceived,
this, &NetworkExchangeViewModel::newUserData);
connect(d->exchangeManager, &UserExchangeManager::exchangeError,
this, &NetworkExchangeViewModel::exchangeError);
connect(d->exchangeManager, &UserExchangeManager::activeChanged,
this, &NetworkExchangeViewModel::activeChanged);
emit deviceNameChanged(deviceName());
d->deviceModel->setup(d->exchangeManager);
emit ready();
} catch(SetupDoesNotExistException &e) {
logCritical() << "Failed to init DataSyncViewModel with error:"
<< e.what();
}
}
void NetworkExchangeViewModel::onResult(quint32 requestCode, const QVariant &result)
{
if(d->activeExports.contains(requestCode)) {
auto info = d->activeExports.take(requestCode);
if(result.isValid()) {
auto res = ExportSetupViewModel::result(result);
if(std::get<0>(res))
d->exchangeManager->exportTrustedTo(info, std::get<1>(res), std::get<2>(res));
else
d->exchangeManager->exportTo(info, std::get<1>(res));
}
}
}
void NetworkExchangeViewModel::exchangeError(const QString &errorString)
{
critical(tr("Network exchange error"), errorString);
}
void NetworkExchangeViewModel::newUserData(const UserInfo &userInfo, bool trusted)
{
QPointer<NetworkExchangeViewModel> qPtr(this);
auto importDoneHandler = [this, qPtr](bool ok, QString error) {
if(!qPtr)
return;
if(ok) {
information(DataSyncViewModel::tr("Import completed"),
DataSyncViewModel::tr("Data was successfully imported."));
} else
critical(DataSyncViewModel::tr("Import failed"), error);
};
if(trusted) {
MessageConfig config{MessageConfig::TypeInputDialog, QMetaType::typeName(QMetaType::QString)};
config.setTitle(tr("Import account data"))
.setText(tr("Enter the password to decrypt the account data received from \"%1\" with address \"%2\". "
"Then choose whether you want to keep you local data or not:")
.arg(userInfo.name())
.arg(ExchangeDevicesModel::fullAddress(userInfo)))
.setButtons(MessageConfig::YesToAll | MessageConfig::Yes | MessageConfig::Cancel) //TODO adjust to get ideal placement
.setButtonText(MessageConfig::YesToAll, tr("Reset data"))
.setButtonText(MessageConfig::Yes, tr("Keep data"))
.setViewProperties({
{QStringLiteral("echoMode"), 2} //QLineEdit::Password
});
auto res = CoreApp::showDialog(config);
connect(res, &MessageResult::dialogDone, this, [this, res, userInfo, importDoneHandler](MessageConfig::StandardButton btn) {
switch (btn) {
case MessageConfig::YesToAll:
d->exchangeManager->importTrustedFrom(userInfo, res->result().toString(), importDoneHandler, false);
break;
case MessageConfig::Yes:
d->exchangeManager->importTrustedFrom(userInfo, res->result().toString(), importDoneHandler, true);
break;
default:
break;
}
});
} else {
MessageConfig config{MessageConfig::TypeMessageBox, MessageConfig::SubTypeQuestion};
config.setTitle(tr("Import account data"))
.setText(tr("Do you want to import data received from \"%1\" with address \"%2\"? "
"Keep the local data after changing the account?")
.arg(userInfo.name())
.arg(ExchangeDevicesModel::fullAddress(userInfo)))
.setButtons(MessageConfig::YesToAll | MessageConfig::Yes | MessageConfig::Cancel) //TODO adjust to get ideal placement
.setButtonText(MessageConfig::YesToAll, tr("Reset data"))
.setButtonText(MessageConfig::Yes, tr("Keep data"));
auto res = CoreApp::showDialog(config);
connect(res, &MessageResult::dialogDone, this, [this, userInfo, importDoneHandler](MessageConfig::StandardButton btn) {
switch (btn) {
case MessageConfig::YesToAll:
d->exchangeManager->importFrom(userInfo, importDoneHandler, false);
break;
case MessageConfig::Yes:
d->exchangeManager->importFrom(userInfo, importDoneHandler, true);
break;
default:
break;
}
});
}
}
// ------------- Private Implementation -------------
NetworkExchangeViewModelPrivate::NetworkExchangeViewModelPrivate(NetworkExchangeViewModel *q_ptr) :
exchangeManager(nullptr),
deviceModel(new ExchangeDevicesModel(q_ptr)),
port(UserExchangeManager::DataExchangePort)
{}

69
src/mvvmdatasynccore/networkexchangeviewmodel.h

@ -0,0 +1,69 @@
#ifndef QTMVVM_NETWORKEXCHANGEVIEWMODEL_H
#define QTMVVM_NETWORKEXCHANGEVIEWMODEL_H
#include <QtCore/qscopedpointer.h>
#include <QtMvvmCore/viewmodel.h>
#include <QtDataSync/userexchangemanager.h>
#include "QtMvvmDataSyncCore/qtmvvmdatasynccore_global.h"
#include "QtMvvmDataSyncCore/exchangedevicesmodel.h"
namespace QtMvvm {
class NetworkExchangeViewModelPrivate;
class Q_MVVMDATASYNCCORE_EXPORT NetworkExchangeViewModel : public ViewModel
{
Q_OBJECT
Q_PROPERTY(quint16 port READ port WRITE setPort NOTIFY portChanged)
Q_PROPERTY(QString deviceName READ deviceName WRITE setDeviceName NOTIFY deviceNameChanged)
Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged)
Q_PROPERTY(ExchangeDevicesModel* deviceModel READ deviceModel CONSTANT)
public:
static const QString paramSetup;
static const QString paramAccountManager;
static QVariantHash showParams(const QString &setup);
static QVariantHash showParams(QtDataSync::AccountManager *accountManager);
Q_INVOKABLE explicit NetworkExchangeViewModel(QObject *parent = nullptr);
~NetworkExchangeViewModel();
quint16 port() const;
QString deviceName() const;
bool active() const;
ExchangeDevicesModel* deviceModel() const;
public Q_SLOTS:
void exportTo(int index);
void setPort(quint16 port);
void setDeviceName(QString deviceName);
void setActive(bool active);
Q_SIGNALS:
void ready();
void portChanged(quint16 port);
void deviceNameChanged(QString deviceName);
void activeChanged(bool active);
protected:
void onInit(const QVariantHash &params) override;
void onResult(quint32 requestCode, const QVariant &result) override;
private Q_SLOTS:
void exchangeError(const QString &errorString);
void newUserData(const QtDataSync::UserInfo &userInfo, bool trusted);
private:
QScopedPointer<NetworkExchangeViewModelPrivate> d;
};
}
#endif // QTMVVM_NETWORKEXCHANGEVIEWMODEL_H

24
src/mvvmdatasynccore/networkexchangeviewmodel_p.h

@ -0,0 +1,24 @@
#ifndef QTMVVM_NETWORKEXCHANGEVIEWMODEL_P_H
#define QTMVVM_NETWORKEXCHANGEVIEWMODEL_P_H
#include "qtmvvmdatasynccore_global.h"
#include "networkexchangeviewmodel.h"
namespace QtMvvm {
class NetworkExchangeViewModelPrivate
{
public:
static const quint32 ExportRequestCode = 0xb300;
NetworkExchangeViewModelPrivate(NetworkExchangeViewModel *q_ptr);
QtDataSync::UserExchangeManager *exchangeManager;
ExchangeDevicesModel *deviceModel;
quint16 port;
QHash<quint32, QtDataSync::UserInfo> activeExports;
};
}
#endif // QTMVVM_NETWORKEXCHANGEVIEWMODEL_P_H

3
src/mvvmdatasyncwidgets/exportsetupdialog.cpp

@ -17,6 +17,9 @@ ExportSetupDialog::ExportSetupDialog(ViewModel *viewModel, QWidget *parent) :
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint);
}
bind(_viewModel, "label",
ui->titleLabel, "text",
Binding::OneWayToView);
bind(_viewModel, "trusted",
ui->trustedCheckBox, "checked");
bind(_viewModel, "includeServer",

19
src/mvvmdatasyncwidgets/exportsetupdialog.ui

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>296</width>
<height>124</height>
<height>148</height>
</rect>
</property>
<property name="windowTitle">
@ -20,7 +20,7 @@
<bool>true</bool>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<item row="1" column="0">
<widget class="QLabel" name="trustedLabel">
<property name="text">
<string>&amp;Trusted:</string>
@ -30,10 +30,10 @@
</property>
</widget>
</item>
<item row="0" column="1">
<item row="1" column="1">
<widget class="QCheckBox" name="trustedCheckBox"/>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QLabel" name="includeServerLabel">
<property name="text">
<string>Include &amp;Server:</string>
@ -43,10 +43,10 @@
</property>
</widget>
</item>
<item row="1" column="1">
<item row="2" column="1">
<widget class="QCheckBox" name="includeServerCheckBox"/>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QLabel" name="passwordLabel">
<property name="enabled">
<bool>false</bool>
@ -59,7 +59,7 @@
</property>
</widget>
</item>
<item row="2" column="1">
<item row="3" column="1">
<widget class="QLineEdit" name="passwordLineEdit">
<property name="enabled">
<bool>false</bool>
@ -72,7 +72,7 @@
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<item row="4" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -82,6 +82,9 @@
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="titleLabel"/>
</item>
</layout>
</widget>
<resources/>

10
src/mvvmdatasyncwidgets/mvvmdatasyncwidgets.pro

@ -8,14 +8,17 @@ HEADERS += \
datasyncwindow_p.h \
exportsetupdialog_p.h \
changeremotedialog_p.h \
identityeditdialog_p.h
identityeditdialog_p.h \
networkexchangewindow.h \
networkexchangewindow_p.h
SOURCES += \
datasyncwindow.cpp \
qtmvvmdatasyncwidgets_global.cpp \
exportsetupdialog.cpp \
changeremotedialog.cpp \
identityeditdialog.cpp
identityeditdialog.cpp \
networkexchangewindow.cpp
TRANSLATIONS += \
translations/qtmvvmdatasyncwidgets_de.ts \
@ -46,5 +49,6 @@ FORMS += \
datasyncwindow.ui \
exportsetupdialog.ui \
changeremotedialog.ui \
identityeditdialog.ui
identityeditdialog.ui \
networkexchangewindow.ui

42
src/mvvmdatasyncwidgets/networkexchangewindow.cpp

@ -0,0 +1,42 @@
#include "networkexchangewindow.h"
#include "networkexchangewindow_p.h"
#include "ui_networkexchangewindow.h"
#include <QtMvvmCore/Binding>
using namespace QtMvvm;
NetworkExchangeWindow::NetworkExchangeWindow(ViewModel *viewModel, QWidget *parent) :
QWidget(parent, Qt::Window),
d(new NetworkExchangeWindowPrivate(viewModel))
{
d->ui->setupUi(this);
connect(d->ui->treeView, &QTreeView::activated,
this, &NetworkExchangeWindow::activated);
bind(d->viewModel, "port",
d->ui->exchangePortSpinBox, "value");
bind(d->viewModel, "deviceName",
d->ui->deviceNameLineEdit, "text",
Binding::TwoWay,
nullptr, "editingFinished()");
bind(d->viewModel, "active",
d->ui->exchangeCheckBox, "checked",
Binding::OneWayToViewModel);//NOTE workaround because of buggy active property in datasync
d->ui->treeView->setModel(d->viewModel->deviceModel());
}
NetworkExchangeWindow::~NetworkExchangeWindow() {}
void NetworkExchangeWindow::activated(const QModelIndex &index)
{
if(index.isValid())
d->viewModel->exportTo(index.row());
}
// ------------- Private Implementation -------------
NetworkExchangeWindowPrivate::NetworkExchangeWindowPrivate(ViewModel *viewModel) :
viewModel(static_cast<NetworkExchangeViewModel*>(viewModel)),
ui(new Ui::NetworkExchangeWindow())
{}

32
src/mvvmdatasyncwidgets/networkexchangewindow.h

@ -0,0 +1,32 @@
#ifndef QTMVVM_NETWORKEXCHANGEWINDOW_H
#define QTMVVM_NETWORKEXCHANGEWINDOW_H
#include <QtCore/qscopedpointer.h>
#include <QtMvvmDataSyncCore/networkexchangeviewmodel.h>
#include <QtWidgets/qwidget.h>
#include "QtMvvmDataSyncWidgets/qtmvvmdatasyncwidgets_global.h"
namespace QtMvvm {
class NetworkExchangeWindowPrivate;
class Q_MVVMDATASYNCWIDGETS_EXPORT NetworkExchangeWindow : public QWidget
{
Q_OBJECT
public:
Q_INVOKABLE explicit NetworkExchangeWindow(QtMvvm::ViewModel *viewModel, QWidget *parent = nullptr);
~NetworkExchangeWindow();
private Q_SLOTS:
void activated(const QModelIndex &index);
private:
QScopedPointer<NetworkExchangeWindowPrivate> d;
};
}
#endif // QTMVVM_NETWORKEXCHANGEWINDOW_H

129
src/mvvmdatasyncwidgets/networkexchangewindow.ui

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>NetworkExchangeWindow</class>
<widget class="QWidget" name="NetworkExchangeWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>433</width>
<height>303</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="exchangePortLabel">
<property name="text">
<string>Exchange &amp;Port:</string>
</property>
<property name="buddy">
<cstring>exchangePortSpinBox</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="exchangePortSpinBox">
<property name="specialValueText">
<string>Random</string>
</property>
<property name="accelerated">
<bool>true</bool>
</property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
</property>
<property name="showGroupSeparator" stdset="0">
<bool>true</bool>
</property>
<property name="maximum">
<number>65535</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="deviceNameLabel">
<property name="text">
<string>Device &amp;Name:</string>
</property>
<property name="buddy">
<cstring>deviceNameLineEdit</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="deviceNameLineEdit">
<property name="placeholderText">
<string>Name shown to other devices</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="exchangeCheckBox">
<property name="text">
<string>&amp;Exchange active:</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QTreeView" name="treeView">
<property name="enabled">
<bool>false</bool>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="animated">
<bool>true</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>exchangeCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>treeView</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>93</x>
<y>151</y>
</hint>
<hint type="destinationlabel">
<x>118</x>
<y>229</y>
</hint>
</hints>
</connection>
</connections>
</ui>

24
src/mvvmdatasyncwidgets/networkexchangewindow_p.h

@ -0,0 +1,24 @@
#ifndef QTMVVM_NETWORKEXCHANGEWINDOW_P_H
#define QTMVVM_NETWORKEXCHANGEWINDOW_P_H
#include "qtmvvmdatasyncwidgets_global.h"
#include "networkexchangewindow.h"
namespace Ui {
class NetworkExchangeWindow;
}
namespace QtMvvm {
class NetworkExchangeWindowPrivate
{
public:
NetworkExchangeWindowPrivate(ViewModel *viewModel);
NetworkExchangeViewModel *viewModel;
QScopedPointer<Ui::NetworkExchangeWindow> ui;
};
}
#endif // QTMVVM_NETWORKEXCHANGEWINDOW_P_H

2
src/mvvmdatasyncwidgets/qtmvvmdatasyncwidgets_global.cpp

@ -2,6 +2,7 @@
#include <QtMvvmWidgets/WidgetsPresenter>
#include "datasyncwindow.h"
#include "networkexchangewindow.h"
#include "exportsetupdialog_p.h"
#include "changeremotedialog_p.h"
#include "identityeditdialog_p.h"
@ -9,6 +10,7 @@
void QtMvvm::registerDataSyncWidgets()
{
QtMvvm::WidgetsPresenter::registerView<DataSyncWindow>();
QtMvvm::WidgetsPresenter::registerView<NetworkExchangeWindow>();
QtMvvm::WidgetsPresenter::registerView<ExportSetupDialog>();
QtMvvm::WidgetsPresenter::registerView<ChangeRemoteDialog>();
QtMvvm::WidgetsPresenter::registerView<IdentityEditDialog>();

Loading…
Cancel
Save