From 2822897df53e3556c50065491c0d4eeabb9e2499 Mon Sep 17 00:00:00 2001 From: Skycoder42 Date: Fri, 2 Mar 2018 18:39:33 +0100 Subject: [PATCH] implemented change remote stuff --- .../changeremoteviewmodel.cpp | 131 +++++++++ .../changeremoteviewmodel_p.h | 73 +++++ src/mvvmdatasynccore/datasyncviewmodel.cpp | 9 +- src/mvvmdatasynccore/datasyncviewmodel_p.h | 1 + src/mvvmdatasynccore/mvvmdatasynccore.pro | 6 +- .../changeremotedialog.cpp | 74 +++++ src/mvvmdatasyncwidgets/changeremotedialog.ui | 263 ++++++++++++++++++ .../changeremotedialog_p.h | 40 +++ src/mvvmdatasyncwidgets/exportsetupdialog.cpp | 10 +- .../mvvmdatasyncwidgets.pro | 11 +- .../qtmvvmdatasyncwidgets_global.cpp | 2 + src/mvvmwidgets/widgetspresenter.cpp | 6 + src/mvvmwidgets/widgetspresenter_p.h | 7 +- 13 files changed, 623 insertions(+), 10 deletions(-) create mode 100644 src/mvvmdatasynccore/changeremoteviewmodel.cpp create mode 100644 src/mvvmdatasynccore/changeremoteviewmodel_p.h create mode 100644 src/mvvmdatasyncwidgets/changeremotedialog.cpp create mode 100644 src/mvvmdatasyncwidgets/changeremotedialog.ui create mode 100644 src/mvvmdatasyncwidgets/changeremotedialog_p.h diff --git a/src/mvvmdatasynccore/changeremoteviewmodel.cpp b/src/mvvmdatasynccore/changeremoteviewmodel.cpp new file mode 100644 index 0000000..a477b4a --- /dev/null +++ b/src/mvvmdatasynccore/changeremoteviewmodel.cpp @@ -0,0 +1,131 @@ +#include "changeremoteviewmodel_p.h" +using namespace QtMvvm; +using namespace QtDataSync; + +std::tuple ChangeRemoteViewModel::result(const QVariant &data) +{ + auto map = data.toHash(); + return std::make_tuple(map.value(QStringLiteral("config")).value(), + map.value(QStringLiteral("keepData")).toBool()); +} + +ChangeRemoteViewModel::ChangeRemoteViewModel(QObject *parent) : + ViewModel(parent), + _url(), + _accessKey(), + _keepAlive(), + _keepData(true), + _headerModel(new QStandardItemModel(0, 2, this)) +{ + _headerModel->setHorizontalHeaderLabels({tr("Key"), tr("Value")}); + _headerModel->setItemRoleNames({ + {KeyRole, "key"}, + {ValueRole, "value"} + }); + + connect(this, &ChangeRemoteViewModel::urlChanged, + this, &ChangeRemoteViewModel::validChanged); +} + +QUrl ChangeRemoteViewModel::url() const +{ + return _url; +} + +QString ChangeRemoteViewModel::accessKey() const +{ + return _accessKey; +} + +int ChangeRemoteViewModel::keepAlive() const +{ + return _keepAlive; +} + +bool ChangeRemoteViewModel::keepData() const +{ + return _keepData; +} + +QStandardItemModel *ChangeRemoteViewModel::headerModel() const +{ + return _headerModel; +} + +bool ChangeRemoteViewModel::isValid() const +{ + return _url.isValid(); +} + +bool ChangeRemoteViewModel::completeSetup() +{ + if(!isValid()) + return false; + + RemoteConfig::HeaderHash headers; + for(auto i = 0; i < _headerModel->rowCount(); i++) { + auto item = _headerModel->item(i); + headers.insert(item->text().toUtf8(), + item->data(ValueRole).toString().toUtf8()); + } + + QVariantHash hash; + hash[QStringLiteral("config")] = QVariant::fromValue({ + _url, + _accessKey, + headers, + _keepAlive + }); + hash[QStringLiteral("keepData")] = _keepData; + emit resultReady(hash); + return true; +} + +void ChangeRemoteViewModel::setUrl(const QUrl &url) +{ + if (_url == url) + return; + + _url = url; + emit urlChanged(_url); +} + +void ChangeRemoteViewModel::setAccessKey(const QString &accessKey) +{ + if (_accessKey == accessKey) + return; + + _accessKey = accessKey; + emit accessKeyChanged(_accessKey); +} + +void ChangeRemoteViewModel::setKeepAlive(int keepAlive) +{ + if (_keepAlive == keepAlive) + return; + + _keepAlive = keepAlive; + emit keepAliveChanged(_keepAlive); +} + +void ChangeRemoteViewModel::setKeepData(bool keepData) +{ + if (_keepData == keepData) + return; + + _keepData = keepData; + emit keepDataChanged(_keepData); +} + +void ChangeRemoteViewModel::addHeaderConfig(const QString &key, const QString &value) +{ + auto item0 = new QStandardItem(key); + item0->setData(value, ValueRole); + auto item1 = new QStandardItem(value); + _headerModel->appendRow({item0, item1}); +} + +void ChangeRemoteViewModel::removeHeaderConfig(int index) +{ + _headerModel->removeRow(index); +} diff --git a/src/mvvmdatasynccore/changeremoteviewmodel_p.h b/src/mvvmdatasynccore/changeremoteviewmodel_p.h new file mode 100644 index 0000000..49884b3 --- /dev/null +++ b/src/mvvmdatasynccore/changeremoteviewmodel_p.h @@ -0,0 +1,73 @@ +#ifndef QTMVVM_CHANGEREMOTEVIEWMODEL_P_H +#define QTMVVM_CHANGEREMOTEVIEWMODEL_P_H + +#include + +#include + +#include + +#include "qtmvvmdatasynccore_global.h" + +namespace QtMvvm { + +class Q_MVVMDATASYNCCORE_EXPORT ChangeRemoteViewModel : public ViewModel +{ + Q_OBJECT + + Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged) + Q_PROPERTY(QString accessKey READ accessKey WRITE setAccessKey NOTIFY accessKeyChanged) + Q_PROPERTY(int keepAlive READ keepAlive WRITE setKeepAlive NOTIFY keepAliveChanged) + Q_PROPERTY(bool keepData READ keepData WRITE setKeepData NOTIFY keepDataChanged) + Q_PROPERTY(QStandardItemModel* headerModel READ headerModel CONSTANT) + + Q_PROPERTY(bool valid READ isValid NOTIFY validChanged) + +public: + enum Roles { + KeyRole = Qt::DisplayRole, + ValueRole = Qt::UserRole + 1 + }; + Q_ENUM(Roles) + + static std::tuple result(const QVariant &data); + + Q_INVOKABLE explicit ChangeRemoteViewModel(QObject *parent = nullptr); + + QUrl url() const; + QString accessKey() const; + int keepAlive() const; + bool keepData() const; + QStandardItemModel* headerModel() const; + bool isValid() const; + +public Q_SLOTS: + bool completeSetup(); + + void setUrl(const QUrl &url); + void setAccessKey(const QString &accessKey); + void setKeepAlive(int keepAlive); + void setKeepData(bool keepData); + + void addHeaderConfig(const QString &key, const QString &value); + void removeHeaderConfig(int index); + +Q_SIGNALS: + void urlChanged(const QUrl &url); + void accessKeyChanged(const QString &accessKey); + void keepAliveChanged(int keepAlive); + void keepDataChanged(bool keepData); + void validChanged(); + +private: + QUrl _url; + QString _accessKey; + int _keepAlive; + bool _keepData; + + QStandardItemModel *_headerModel; +}; + +} + +#endif // QTMVVM_CHANGEREMOTEVIEWMODEL_P_H diff --git a/src/mvvmdatasynccore/datasyncviewmodel.cpp b/src/mvvmdatasynccore/datasyncviewmodel.cpp index 12d0614..c8e2840 100644 --- a/src/mvvmdatasynccore/datasyncviewmodel.cpp +++ b/src/mvvmdatasynccore/datasyncviewmodel.cpp @@ -1,6 +1,7 @@ #include "datasyncviewmodel.h" #include "datasyncviewmodel_p.h" #include "exportsetupviewmodel_p.h" +#include "changeremoteviewmodel_p.h" #include #include @@ -224,7 +225,7 @@ void DataSyncViewModel::performReset() void DataSyncViewModel::changeRemote() { - Q_UNIMPLEMENTED(); + showForResult(DataSyncViewModelPrivate::ChangeRemoteRequestCode); } void DataSyncViewModel::startNetworkExchange() @@ -349,6 +350,12 @@ void DataSyncViewModel::onResult(quint32 requestCode, const QVariant &result) d->performExport(std::get<0>(res), std::get<1>(res), std::get<2>(res)); } break; + case DataSyncViewModelPrivate::ChangeRemoteRequestCode: + if(result.isValid()) { + auto res = ChangeRemoteViewModel::result(result); + d->accountManager->changeRemote(std::get<0>(res), std::get<1>(res)); + } + break; default: break; } diff --git a/src/mvvmdatasynccore/datasyncviewmodel_p.h b/src/mvvmdatasynccore/datasyncviewmodel_p.h index 09dc792..20e8180 100644 --- a/src/mvvmdatasynccore/datasyncviewmodel_p.h +++ b/src/mvvmdatasynccore/datasyncviewmodel_p.h @@ -12,6 +12,7 @@ class DataSyncViewModelPrivate { public: static const quint32 ExportRequestCode = 0xb201; + static const quint32 ChangeRemoteRequestCode = 0xb202; DataSyncViewModelPrivate(DataSyncViewModel *q_ptr); diff --git a/src/mvvmdatasynccore/mvvmdatasynccore.pro b/src/mvvmdatasynccore/mvvmdatasynccore.pro index 097f5a3..ce57e49 100644 --- a/src/mvvmdatasynccore/mvvmdatasynccore.pro +++ b/src/mvvmdatasynccore/mvvmdatasynccore.pro @@ -8,12 +8,14 @@ HEADERS += \ datasyncviewmodel_p.h \ accountmodel.h \ accountmodel_p.h \ - exportsetupviewmodel_p.h + exportsetupviewmodel_p.h \ + changeremoteviewmodel_p.h SOURCES += \ datasyncviewmodel.cpp \ accountmodel.cpp \ - exportsetupviewmodel.cpp + exportsetupviewmodel.cpp \ + changeremoteviewmodel.cpp TRANSLATIONS += \ translations/qtmvvmdatasynccore_de.ts \ diff --git a/src/mvvmdatasyncwidgets/changeremotedialog.cpp b/src/mvvmdatasyncwidgets/changeremotedialog.cpp new file mode 100644 index 0000000..0889a74 --- /dev/null +++ b/src/mvvmdatasyncwidgets/changeremotedialog.cpp @@ -0,0 +1,74 @@ +#include "changeremotedialog_p.h" +#include "ui_changeremotedialog.h" +#include +#include +using namespace QtMvvm; + +ChangeRemoteDialog::ChangeRemoteDialog(ViewModel *viewModel, QWidget *parent) : + QDialog(parent), + _viewModel(static_cast(viewModel)), + ui(new Ui::ChangeRemoteDialog) +{ + ui->setupUi(this); + if(parentWidget()) { + setWindowModality(Qt::WindowModal); + setWindowFlags(Qt::Sheet | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + } else { + setWindowModality(Qt::ApplicationModal); + setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + } + + ui->addHeaderButton->setDefaultAction(ui->actionA_dd_Header); + ui->removeHeaderButton->setDefaultAction(ui->action_Remove_Header); + ui->treeView->addActions({ + ui->actionA_dd_Header, + ui->action_Remove_Header + }); + ui->urlLineEdit->setValidator(createUrlValidator({QStringLiteral("ws"), QStringLiteral("wss")}, ui->urlLineEdit)); + + bind(_viewModel, "url", + ui->urlLineEdit, "text", + Binding::OneWayToViewModel); + bind(_viewModel, "accessKey", + ui->accessKeyLineEdit, "text", + Binding::OneWayToViewModel); + bind(_viewModel, "keepAlive", + ui->keepAliveTimeoutSpinBox, "value"); + bind(_viewModel, "keepData", + ui->keepDataCheckBox, "checked"); + bind(_viewModel, "valid", + ui->buttonBox->button(QDialogButtonBox::Ok), "enabled", + Binding::OneWayToView); + + connect(ui->actionA_dd_Header, &QAction::triggered, + this, &ChangeRemoteDialog::addHeader); + connect(ui->action_Remove_Header, &QAction::triggered, + this, &ChangeRemoteDialog::removeHeader); + + ui->treeView->setModel(_viewModel->headerModel()); + ui->treeView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); +} + +ChangeRemoteDialog::~ChangeRemoteDialog() {} + +void ChangeRemoteDialog::accept() +{ + if(_viewModel->completeSetup()) + QDialog::accept(); +} + +void ChangeRemoteDialog::addHeader() +{ + if(ui->keyEdit->text().isEmpty()) + return; + _viewModel->addHeaderConfig(ui->keyEdit->text(), ui->valueEdit->text()); + ui->keyEdit->clear(); + ui->valueEdit->clear(); +} + +void ChangeRemoteDialog::removeHeader() +{ + auto index = ui->treeView->currentIndex(); + if(index.isValid()) + _viewModel->removeHeaderConfig(index.row()); +} diff --git a/src/mvvmdatasyncwidgets/changeremotedialog.ui b/src/mvvmdatasyncwidgets/changeremotedialog.ui new file mode 100644 index 0000000..a50e2f2 --- /dev/null +++ b/src/mvvmdatasyncwidgets/changeremotedialog.ui @@ -0,0 +1,263 @@ + + + ChangeRemoteDialog + + + + 0 + 0 + 487 + 376 + + + + Dialog + + + true + + + true + + + + + + &Url: + + + urlLineEdit + + + + + + + wss://example.org/qdsapp/ + + + + + + + &Access Key: + + + accessKeyLineEdit + + + + + + + QLineEdit::Password + + + Optional access secret + + + + + + + Keep-&Alive Timeout: + + + keepAliveTimeoutSpinBox + + + + + + + QAbstractSpinBox::PlusMinus + + + true + + + QAbstractSpinBox::CorrectToNearestValue + + + true + + + min + + + 1 + + + 1440 + + + + + + + &Keep data: + + + keepDataCheckBox + + + + + + + true + + + + + + + Qt::ActionsContextMenu + + + true + + + false + + + false + + + true + + + true + + + false + + + + + + + Extra &Headers: + + + treeView + + + + + + + + + Header Key + + + + + + + Header Value + + + + + + + Qt::ToolButtonFollowStyle + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::ToolButtonFollowStyle + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + .. + + + A&dd Header + + + Ctrl+Ins + + + + + + .. + + + &Remove Selected Header + + + Del + + + + + + + buttonBox + accepted() + ChangeRemoteDialog + accept() + + + 227 + 279 + + + 157 + 274 + + + + + buttonBox + rejected() + ChangeRemoteDialog + reject() + + + 295 + 285 + + + 286 + 274 + + + + + diff --git a/src/mvvmdatasyncwidgets/changeremotedialog_p.h b/src/mvvmdatasyncwidgets/changeremotedialog_p.h new file mode 100644 index 0000000..f89c819 --- /dev/null +++ b/src/mvvmdatasyncwidgets/changeremotedialog_p.h @@ -0,0 +1,40 @@ +#ifndef QTMVVM_CHANGEREMOTEDIALOG_P_H +#define QTMVVM_CHANGEREMOTEDIALOG_P_H + +#include + +#include + +#include + +#include "qtmvvmdatasyncwidgets_global.h" + +namespace Ui { +class ChangeRemoteDialog; +} + +namespace QtMvvm { + +class Q_MVVMDATASYNCWIDGETS_EXPORT ChangeRemoteDialog : public QDialog +{ + Q_OBJECT + +public: + Q_INVOKABLE explicit ChangeRemoteDialog(QtMvvm::ViewModel *viewModel, QWidget *parent = nullptr); + ~ChangeRemoteDialog(); + +public Q_SLOTS: + void accept() override; + +private Q_SLOTS: + void addHeader(); + void removeHeader(); + +private: + ChangeRemoteViewModel *_viewModel; + QScopedPointer ui; +}; + +} + +#endif // QTMVVM_CHANGEREMOTEDIALOG_P_H diff --git a/src/mvvmdatasyncwidgets/exportsetupdialog.cpp b/src/mvvmdatasyncwidgets/exportsetupdialog.cpp index 988deb4..52daaa9 100644 --- a/src/mvvmdatasyncwidgets/exportsetupdialog.cpp +++ b/src/mvvmdatasyncwidgets/exportsetupdialog.cpp @@ -9,13 +9,21 @@ ExportSetupDialog::ExportSetupDialog(ViewModel *viewModel, QWidget *parent) : ui(new Ui::ExportSetupDialog) { ui->setupUi(this); + if(parentWidget()) { + setWindowModality(Qt::WindowModal); + setWindowFlags(Qt::Sheet | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + } else { + setWindowModality(Qt::ApplicationModal); + setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + } bind(_viewModel, "trusted", ui->trustedCheckBox, "checked"); bind(_viewModel, "includeServer", ui->includeServerCheckBox, "checked"); bind(_viewModel, "password", - ui->passwordLineEdit, "text"); + ui->passwordLineEdit, "text", + Binding::OneWayToViewModel); bind(_viewModel, "valid", ui->buttonBox->button(QDialogButtonBox::Ok), "enabled", Binding::OneWayToView); diff --git a/src/mvvmdatasyncwidgets/mvvmdatasyncwidgets.pro b/src/mvvmdatasyncwidgets/mvvmdatasyncwidgets.pro index 5549c19..adf1d55 100644 --- a/src/mvvmdatasyncwidgets/mvvmdatasyncwidgets.pro +++ b/src/mvvmdatasyncwidgets/mvvmdatasyncwidgets.pro @@ -1,17 +1,19 @@ TARGET = QtMvvmDataSyncWidgets -QT = core gui mvvmdatasynccore mvvmwidgets mvvmdatasynccore-private +QT = core gui mvvmdatasynccore mvvmwidgets mvvmdatasynccore-private mvvmwidgets-private HEADERS += \ qtmvvmdatasyncwidgets_global.h \ datasyncwindow.h \ datasyncwindow_p.h \ - exportsetupdialog_p.h + exportsetupdialog_p.h \ + changeremotedialog_p.h SOURCES += \ datasyncwindow.cpp \ qtmvvmdatasyncwidgets_global.cpp \ - exportsetupdialog.cpp + exportsetupdialog.cpp \ + changeremotedialog.cpp TRANSLATIONS += \ translations/qtmvvmdatasyncwidgets_de.ts \ @@ -40,5 +42,6 @@ qpmx_ts_target.files += translations/qtmvvmdatasyncwidgets_template.ts FORMS += \ datasyncwindow.ui \ - exportsetupdialog.ui + exportsetupdialog.ui \ + changeremotedialog.ui diff --git a/src/mvvmdatasyncwidgets/qtmvvmdatasyncwidgets_global.cpp b/src/mvvmdatasyncwidgets/qtmvvmdatasyncwidgets_global.cpp index 22dc096..92af415 100644 --- a/src/mvvmdatasyncwidgets/qtmvvmdatasyncwidgets_global.cpp +++ b/src/mvvmdatasyncwidgets/qtmvvmdatasyncwidgets_global.cpp @@ -3,9 +3,11 @@ #include "datasyncwindow.h" #include "exportsetupdialog_p.h" +#include "changeremotedialog_p.h" void QtMvvm::registerDataSyncWidgets() { QtMvvm::WidgetsPresenter::registerView(); QtMvvm::WidgetsPresenter::registerView(); + QtMvvm::WidgetsPresenter::registerView(); } diff --git a/src/mvvmwidgets/widgetspresenter.cpp b/src/mvvmwidgets/widgetspresenter.cpp index e3fd9bf..3a89acb 100644 --- a/src/mvvmwidgets/widgetspresenter.cpp +++ b/src/mvvmwidgets/widgetspresenter.cpp @@ -22,6 +22,7 @@ #include #include +#include namespace { @@ -448,3 +449,8 @@ WidgetsPresenter *WidgetsPresenterPrivate::currentPresenter() qFatal(e.what()); } } + +QValidator *QtMvvm::createUrlValidator(const QStringList &schemes, QObject *parent) +{ + return new QUrlValidator(schemes, parent); +} diff --git a/src/mvvmwidgets/widgetspresenter_p.h b/src/mvvmwidgets/widgetspresenter_p.h index 11b6518..161e27e 100644 --- a/src/mvvmwidgets/widgetspresenter_p.h +++ b/src/mvvmwidgets/widgetspresenter_p.h @@ -1,8 +1,9 @@ #ifndef QTMVVM_WIDGETSPRESENTER_P_H #define QTMVVM_WIDGETSPRESENTER_P_H -#include -#include +#include +#include +#include #include "qtmvvmwidgets_global.h" #include "widgetspresenter.h" @@ -21,6 +22,8 @@ public: QHash explicitMappings; }; +Q_MVVMWIDGETS_EXPORT QValidator *createUrlValidator(const QStringList &schemes, QObject* parent = nullptr); + } #endif // QTMVVM_WIDGETSPRESENTER_P_H