22 changed files with 845 additions and 24 deletions
			
			
		| @ -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(); | |||
| } | |||
| @ -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
 | |||
| @ -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
 | |||
| @ -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 ¶ms) | |||
| { | |||
| 	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) | |||
| {} | |||
| @ -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 ¶ms) 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
 | |||
| @ -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
 | |||
| @ -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()) | |||
| {} | |||
| @ -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
 | |||
| @ -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 &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 &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>&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> | |||
| @ -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
 | |||
					Loading…
					
					
				
		Reference in new issue