diff --git a/src/gui/newwizard/CMakeLists.txt b/src/gui/newwizard/CMakeLists.txt index eab47d6c0b..4b93897450 100644 --- a/src/gui/newwizard/CMakeLists.txt +++ b/src/gui/newwizard/CMakeLists.txt @@ -15,6 +15,10 @@ target_sources(OpenCloudGui PRIVATE pages/accountconfiguredwizardpage.h pages/accountconfiguredwizardpage.cpp + pages/syncfoldersetupwizardpage.ui + pages/syncfoldersetupwizardpage.h + pages/syncfoldersetupwizardpage.cpp + setupwizardwidget.ui setupwizardwidget.h setupwizardwidget.cpp @@ -43,6 +47,8 @@ target_sources(OpenCloudGui PRIVATE states/serverurlsetupwizardstate.cpp states/oauthcredentialssetupwizardstate.cpp states/accountconfiguredsetupwizardstate.cpp + states/syncfoldersetupwizardstate.cpp + states/syncfoldersetupwizardstate.h setupwizardcontext.cpp ) diff --git a/src/gui/newwizard/enums.cpp b/src/gui/newwizard/enums.cpp index 728b3b194c..3fc15d8f95 100644 --- a/src/gui/newwizard/enums.cpp +++ b/src/gui/newwizard/enums.cpp @@ -25,6 +25,8 @@ template <> QString OCC::Utility::enumToDisplayName(SetupWizardState state) { switch (state) { + case SetupWizardState::SyncFolderSetupState: + return QApplication::translate("SetupWizardState", "Sync Folder"); case SetupWizardState::ServerUrlState: if (GlobalConfig::serverUrl().isValid()) { return QApplication::translate("SetupWizardState", "Server URL"); diff --git a/src/gui/newwizard/enums.h b/src/gui/newwizard/enums.h index 5207c6ee85..323f3b4b7c 100644 --- a/src/gui/newwizard/enums.h +++ b/src/gui/newwizard/enums.h @@ -22,8 +22,10 @@ namespace OCC::Wizard { Q_NAMESPACE enum class SetupWizardState { + SyncFolderSetupState, + FirstState = SyncFolderSetupState, + ServerUrlState, - FirstState = ServerUrlState, CredentialsState, diff --git a/src/gui/newwizard/pages/syncfoldersetupwizardpage.cpp b/src/gui/newwizard/pages/syncfoldersetupwizardpage.cpp new file mode 100644 index 0000000000..d02f287442 --- /dev/null +++ b/src/gui/newwizard/pages/syncfoldersetupwizardpage.cpp @@ -0,0 +1,45 @@ +#include "syncfoldersetupwizardpage.h" + +#include + +#include "libsync/theme.h" +#include "ui_syncfoldersetupwizardpage.h" + +namespace OCC::Wizard { + +SyncFolderSetupWizardPage::SyncFolderSetupWizardPage(const QString &defaultSyncFolder, QWidget *parent) + : _ui(std::make_unique()) +{ + _ui->setupUi(this); + _ui->syncFolderLineEdit->setText(QDir::toNativeSeparators(defaultSyncFolder)); + + connect(_ui->chooseFolderButton, &QToolButton::clicked, this, [this, defaultSyncFolder]() { + auto dialog = new QFileDialog(this, tr("Select the sync folder location"), defaultSyncFolder); + dialog->setFileMode(QFileDialog::Directory); + dialog->setOption(QFileDialog::ShowDirsOnly); + dialog->setOption(QFileDialog::DontCreateDirectories); + + connect(dialog, &QFileDialog::fileSelected, this, [this](const QString &directory) { + _ui->syncFolderLineEdit->setText(QDir::toNativeSeparators(directory)); + Q_EMIT contentChanged(); + }); + dialog->open(); + }); +} + +SyncFolderSetupWizardPage::~SyncFolderSetupWizardPage() noexcept +{ + delete _ui; +} + +QString SyncFolderSetupWizardPage::syncFolder() const +{ + return QDir::fromNativeSeparators(_ui->syncFolderLineEdit->text()); +} + +bool SyncFolderSetupWizardPage::validateInput() const +{ + return !syncFolder().isEmpty(); +} + +} // OCC::Wizard diff --git a/src/gui/newwizard/pages/syncfoldersetupwizardpage.h b/src/gui/newwizard/pages/syncfoldersetupwizardpage.h new file mode 100644 index 0000000000..fdd23fde44 --- /dev/null +++ b/src/gui/newwizard/pages/syncfoldersetupwizardpage.h @@ -0,0 +1,32 @@ + +#pragma once + +#include "gui/newwizard/pages/abstractsetupwizardpage.h" + +#include + +namespace Ui { +class SyncFolderSetupWizardPage; +} + +namespace OCC::Wizard { + +class SyncFolderSetupWizardPage : public AbstractSetupWizardPage +{ + Q_OBJECT + +public: + explicit SyncFolderSetupWizardPage(const QString &defaultSyncFolder, QWidget *parent = nullptr); + ~SyncFolderSetupWizardPage() override; + + QString syncFolder() const; + bool validateInput() const override; + +Q_SIGNALS: + void contentChanged() override; + +private: + std::unique_ptr _ui; +}; + +} // OCC::Wizard diff --git a/src/gui/newwizard/pages/syncfoldersetupwizardpage.ui b/src/gui/newwizard/pages/syncfoldersetupwizardpage.ui new file mode 100644 index 0000000000..102df9fbd7 --- /dev/null +++ b/src/gui/newwizard/pages/syncfoldersetupwizardpage.ui @@ -0,0 +1,126 @@ + + + SyncFolderSetupWizardPage + + + + 0 + 0 + 500 + 300 + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::MinimumExpanding + + + + 20 + 10 + + + + + + + + Choose Sync Folder Location + + + Qt::AlignmentFlag::AlignCenter + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Minimum + + + + 20 + 20 + + + + + + + + Select where you want your synced files to be stored on this computer. + + + Qt::AlignmentFlag::AlignCenter + + + true + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Minimum + + + + 20 + 20 + + + + + + + + + + true + + + + + + + ... + + + Browse for folder + + + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::MinimumExpanding + + + + 20 + 20 + + + + + + + + + diff --git a/src/gui/newwizard/setupwizardcontroller.cpp b/src/gui/newwizard/setupwizardcontroller.cpp index 9abdbc970a..180a4e65d0 100644 --- a/src/gui/newwizard/setupwizardcontroller.cpp +++ b/src/gui/newwizard/setupwizardcontroller.cpp @@ -7,6 +7,7 @@ #include "states/accountconfiguredsetupwizardstate.h" #include "states/oauthcredentialssetupwizardstate.h" #include "states/serverurlsetupwizardstate.h" +#include "states/syncfoldersetupwizardstate.h" #include "theme.h" using namespace std::chrono_literals; @@ -97,6 +98,10 @@ void SetupWizardController::changeStateTo(SetupWizardState nextState, ChangeReas } switch (nextState) { + case SetupWizardState::SyncFolderSetupState: { + _currentState = new SyncFolderSetupWizardState(_context); + break; + } case SetupWizardState::ServerUrlState: { _currentState = new ServerUrlSetupWizardState(_context); break; @@ -131,6 +136,10 @@ void SetupWizardController::changeStateTo(SetupWizardState nextState, ChangeReas connect(_currentState, &AbstractSetupWizardState::evaluationSuccessful, this, [this]() { switch (_currentState->state()) { + case SetupWizardState::SyncFolderSetupState: { + changeStateTo(SetupWizardState::ServerUrlState); + return; + } case SetupWizardState::ServerUrlState: { changeStateTo(SetupWizardState::CredentialsState); return; diff --git a/src/gui/newwizard/states/syncfoldersetupwizardstate.cpp b/src/gui/newwizard/states/syncfoldersetupwizardstate.cpp new file mode 100644 index 0000000000..2b7d694f0f --- /dev/null +++ b/src/gui/newwizard/states/syncfoldersetupwizardstate.cpp @@ -0,0 +1,38 @@ + + +#include "gui/newwizard/states/syncfoldersetupwizardstate.h" +#include "gui/newwizard/pages/syncfoldersetupwizardpage.h" +#include "gui/folderman.h" + +namespace OCC::Wizard { + +SyncFolderSetupWizardState::SyncFolderSetupWizardState(SetupWizardContext *context) + : AbstractSetupWizardState(context) +{ + const QString defaultSyncFolder = FolderMan::suggestSyncFolder(FolderMan::NewFolderType::SpacesSyncRoot, {}); + QString syncTargetDir = _context->accountBuilder().syncTargetDir(); + + if (syncTargetDir.isEmpty()) { + syncTargetDir = defaultSyncFolder; + } + + _page = new SyncFolderSetupWizardPage(syncTargetDir); +} + +SetupWizardState SyncFolderSetupWizardState::state() const +{ + return SetupWizardState::SyncFolderSetupState; +} + +void SyncFolderSetupWizardState::evaluatePage() +{ + auto *syncFolderPage = qobject_cast(_page); + Q_ASSERT(syncFolderPage != nullptr); + + const QString syncTargetDir = syncFolderPage->syncFolder(); + _context->accountBuilder().setSyncTargetDir(syncTargetDir); + + Q_EMIT evaluationSuccessful(); +} + +} // OCC::Wizard diff --git a/src/gui/newwizard/states/syncfoldersetupwizardstate.h b/src/gui/newwizard/states/syncfoldersetupwizardstate.h new file mode 100644 index 0000000000..cbf8ddf620 --- /dev/null +++ b/src/gui/newwizard/states/syncfoldersetupwizardstate.h @@ -0,0 +1,19 @@ + +#pragma once + +#include "gui/newwizard/states/abstractsetupwizardstate.h" + +namespace OCC::Wizard { + +class SyncFolderSetupWizardState : public AbstractSetupWizardState +{ + Q_OBJECT + +public: + explicit SyncFolderSetupWizardState(SetupWizardContext *context); + + SetupWizardState state() const override; + void evaluatePage() override; +}; + +} // OCC::Wizard