From 1d915034c1bd1fbddc8fb33ed89738fe508ee372 Mon Sep 17 00:00:00 2001 From: Hannah von Reth Date: Thu, 7 Jul 2022 10:03:55 +0200 Subject: Implement flag for deployed folders Fixes: #9881 --- src/gui/accountsettings.cpp | 33 ++++++++++++++++++--------------- src/gui/folder.cpp | 17 +++++++++++++++++ src/gui/folder.h | 15 +++++++++++++++ src/gui/folderstatusmodel.cpp | 6 ++++++ src/gui/folderstatusmodel.h | 1 + 5 files changed, 57 insertions(+), 15 deletions(-) diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp index 40024701d..1955be31a 100644 --- a/src/gui/accountsettings.cpp +++ b/src/gui/accountsettings.cpp @@ -241,9 +241,6 @@ void AccountSettings::doExpand() void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) { - const auto removeFolderAction = [this](QMenu *menu) { - return menu->addAction(tr("Remove folder sync connection"), this, &AccountSettings::slotRemoveCurrentFolder); - }; QTreeView *tv = ui->_folderList; QModelIndex index = tv->indexAt(pos); @@ -251,6 +248,11 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) return; } + const auto removeFolderAction = [index, this](QMenu *menu) { + Q_ASSERT(!_model->folder(index)->isDeployed()); + return menu->addAction(tr("Remove folder sync connection"), this, &AccountSettings::slotRemoveCurrentFolder); + }; + auto classification = _model->classify(index); if (classification != FolderStatusModel::RootFolder && classification != FolderStatusModel::SubFolder) { return; @@ -258,7 +260,7 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) // Only allow removal if the item isn't in "ready" state. - if (classification == FolderStatusModel::RootFolder && !_model->data(index, FolderStatusDelegate::IsReady).toBool()) { + if (classification == FolderStatusModel::RootFolder && !_model->data(index, FolderStatusDelegate::IsReady).toBool() && !_model->folder(index)->isDeployed()) { QMenu *menu = new QMenu(tv); menu->setAttribute(Qt::WA_DeleteOnClose); removeFolderAction(menu); @@ -348,22 +350,23 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) QAction *ac = menu->addAction(folderPaused ? tr("Resume sync") : tr("Pause sync")); connect(ac, &QAction::triggered, this, &AccountSettings::slotEnableCurrentFolder); - removeFolderAction(menu); + if (!_model->folder(index)->isDeployed()) { + removeFolderAction(menu); - if (folder->virtualFilesEnabled() && !Theme::instance()->forceVirtualFilesOption()) { - menu->addAction(tr("Disable virtual file support..."), this, &AccountSettings::slotDisableVfsCurrentFolder); - } + if (folder->virtualFilesEnabled() && !Theme::instance()->forceVirtualFilesOption()) { + menu->addAction(tr("Disable virtual file support..."), this, &AccountSettings::slotDisableVfsCurrentFolder); + } - if (Theme::instance()->showVirtualFilesOption() - && !folder->virtualFilesEnabled() && FolderMan::instance()->checkVfsAvailability(folder->path())) { - const auto mode = bestAvailableVfsMode(); - if (mode == Vfs::WindowsCfApi || Theme::instance()->enableExperimentalFeatures()) { - ac = menu->addAction(tr("Enable virtual file support%1...").arg(mode == Vfs::WindowsCfApi ? QString() : tr(" (experimental)"))); - connect(ac, &QAction::triggered, this, &AccountSettings::slotEnableVfsCurrentFolder); + if (Theme::instance()->showVirtualFilesOption() + && !folder->virtualFilesEnabled() && FolderMan::instance()->checkVfsAvailability(folder->path())) { + const auto mode = bestAvailableVfsMode(); + if (mode == Vfs::WindowsCfApi || Theme::instance()->enableExperimentalFeatures()) { + ac = menu->addAction(tr("Enable virtual file support%1...").arg(mode == Vfs::WindowsCfApi ? QString() : tr(" (experimental)"))); + connect(ac, &QAction::triggered, this, &AccountSettings::slotEnableVfsCurrentFolder); + } } } - menu->popup(QCursor::pos()); } diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index 1d78a6ca1..f28c98bca 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -59,6 +59,11 @@ auto versionC() return QStringLiteral("version"); } +auto deployedC() +{ + return QStringLiteral("deployed"); +} + constexpr int WinVfsSettingsVersion = 4; constexpr int SettingsVersion = 2; } @@ -752,6 +757,11 @@ bool Folder::supportsSelectiveSync() const return !virtualFilesEnabled() && !isVfsOnOffSwitchPending(); } +bool Folder::isDeployed() const +{ + return _definition.isDeployed(); +} + void Folder::saveToSettings() const { // Remove first to make sure we don't get duplicates @@ -1345,6 +1355,7 @@ void FolderDefinition::save(QSettings &settings, const FolderDefinition &folder) settings.setValue(QLatin1String("targetPath"), folder.targetPath); settings.setValue(QLatin1String("paused"), folder.paused); settings.setValue(QLatin1String("ignoreHiddenFiles"), folder.ignoreHiddenFiles); + settings.setValue(deployedC(), folder.isDeployed()); settings.setValue(QStringLiteral("virtualFilesMode"), Vfs::modeToString(folder.virtualFilesMode)); @@ -1369,6 +1380,7 @@ bool FolderDefinition::load(QSettings &settings, const QString &alias, folder->targetPath = settings.value(QLatin1String("targetPath")).toString(); folder->paused = settings.value(QLatin1String("paused")).toBool(); folder->ignoreHiddenFiles = settings.value(QLatin1String("ignoreHiddenFiles"), QVariant(true)).toBool(); + folder->_deployed = settings.value(deployedC(), false).toBool(); folder->navigationPaneClsid = settings.value(QLatin1String("navigationPaneClsid")).toUuid(); folder->virtualFilesMode = Vfs::Off; @@ -1424,4 +1436,9 @@ QString FolderDefinition::absoluteJournalPath() const return QDir(localPath).filePath(journalPath); } +bool FolderDefinition::isDeployed() const +{ + return _deployed; +} + } // namespace OCC diff --git a/src/gui/folder.h b/src/gui/folder.h index 4fbc81f82..c152fac18 100644 --- a/src/gui/folder.h +++ b/src/gui/folder.h @@ -102,6 +102,15 @@ public: /// journalPath relative to localPath. QString absoluteJournalPath() const; + + /** + * The folder is deployed by an admin + * We will hide the remove option and the disable/enable vfs option. + */ + bool isDeployed() const; + +private: + bool _deployed; }; /** @@ -312,6 +321,12 @@ public: /** Whether this folder should show selective sync ui */ bool supportsSelectiveSync() const; + /** + * The folder is deployed by an admin + * We will hide the remove option and the disable/enable vfs option. + */ + bool isDeployed() const; + signals: void syncStateChange(); void syncStarted(); diff --git a/src/gui/folderstatusmodel.cpp b/src/gui/folderstatusmodel.cpp index 0cbf64355..5b49fc37e 100644 --- a/src/gui/folderstatusmodel.cpp +++ b/src/gui/folderstatusmodel.cpp @@ -287,6 +287,12 @@ QVariant FolderStatusModel::data(const QModelIndex &index, int role) const return QVariant(); } +Folder *FolderStatusModel::folder(const QModelIndex &index) const +{ + Q_ASSERT(checkIndex(index, QAbstractItemModel::CheckIndexOption::IndexIsValid)); + return _folders.at(index.row())._folder; +} + bool FolderStatusModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (role == Qt::CheckStateRole) { diff --git a/src/gui/folderstatusmodel.h b/src/gui/folderstatusmodel.h index e58018958..f168edd2a 100644 --- a/src/gui/folderstatusmodel.h +++ b/src/gui/folderstatusmodel.h @@ -46,6 +46,7 @@ public: Qt::ItemFlags flags(const QModelIndex &) const override; QVariant data(const QModelIndex &index, int role) const override; + Folder *folder(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; -- cgit v1.2.3