diff --git a/fileitemactionplugin/syncthingfileitemaction.cpp b/fileitemactionplugin/syncthingfileitemaction.cpp index 4b3ad08..e38f559 100644 --- a/fileitemactionplugin/syncthingfileitemaction.cpp +++ b/fileitemactionplugin/syncthingfileitemaction.cpp @@ -63,6 +63,33 @@ QList SyncthingFileItemAction::actions(const KFileItemListProperties return topLevelActions; } +struct DirStats { + explicit DirStats(const QList &dirs); + + QStringList ids; + bool anyPaused = false; + bool allPaused = true; +}; + +DirStats::DirStats(const QList &dirs) +{ + ids.reserve(dirs.size()); + for (const SyncthingDir *const dir : dirs) { + ids << dir->id; + if (dir->paused) { + anyPaused = true; + if (!allPaused) { + break; + } + } else { + allPaused = false; + if (anyPaused) { + break; + } + } + } +} + QList SyncthingFileItemAction::createActions(const KFileItemListProperties &fileItemInfo, QObject *parent) { QList actions; @@ -105,6 +132,10 @@ QList SyncthingFileItemAction::createActions(const KFileItemListPrope } } + // compute dir stats + const auto detectedDirsStats = DirStats(detectedDirs); + const auto containingDirsStats = DirStats(containingDirs); + // add actions for the selected items itself actions.reserve(32); if (!detectedItems.isEmpty()) { @@ -115,7 +146,7 @@ QList SyncthingFileItemAction::createActions(const KFileItemListPrope rescanLabel = tr("Rescan \"%1\"").arg(detectedItems.front().name); } actions << new QAction(QIcon::fromTheme(QStringLiteral("view-refresh")), rescanLabel, parent); - if (connection.isConnected()) { + if (connection.isConnected() && !containingDirsStats.allPaused) { for (const SyncthingItem &item : std::as_const(detectedItems)) { connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, item.dir->id, item.path)); } @@ -126,10 +157,11 @@ QList SyncthingFileItemAction::createActions(const KFileItemListPrope // add actions for explicitely selected Syncthing dirs if (!detectedDirs.isEmpty()) { + // rescan item actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")), detectedDirs.size() == 1 ? tr("Rescan \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Rescan selected directories"), parent); - if (connection.isConnected()) { + if (connection.isConnected() && !detectedDirsStats.allPaused) { for (const SyncthingDir *dir : std::as_const(detectedDirs)) { connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString())); containingDirs.removeAll(dir); @@ -139,17 +171,7 @@ QList SyncthingFileItemAction::createActions(const KFileItemListPrope } // pause/resume item - QStringList ids; - ids.reserve(detectedDirs.size()); - bool isPaused = false; - for (const SyncthingDir *const dir : std::as_const(detectedDirs)) { - ids << dir->id; - if (dir->paused) { - isPaused = true; - break; - } - } - if (isPaused) { + if (detectedDirsStats.anyPaused) { actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")), detectedDirs.size() == 1 ? tr("Resume \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Resume selected directories"), parent); } else { @@ -158,7 +180,8 @@ QList SyncthingFileItemAction::createActions(const KFileItemListPrope } if (connection.isConnected()) { connect(actions.back(), &QAction::triggered, - bind(isPaused ? &SyncthingConnection::resumeDirectories : &SyncthingConnection::pauseDirectories, &connection, ids)); + bind(detectedDirsStats.anyPaused ? &SyncthingConnection::resumeDirectories : &SyncthingConnection::pauseDirectories, &connection, + detectedDirsStats.ids)); } else { actions.back()->setEnabled(false); } @@ -170,7 +193,7 @@ QList SyncthingFileItemAction::createActions(const KFileItemListPrope actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")), containingDirs.size() == 1 ? tr("Rescan \"%1\"").arg(containingDirs.front()->displayName()) : tr("Rescan containing directories"), parent); - if (connection.isConnected()) { + if (connection.isConnected() && !containingDirsStats.allPaused) { for (const SyncthingDir *dir : std::as_const(containingDirs)) { connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString())); } @@ -179,17 +202,7 @@ QList SyncthingFileItemAction::createActions(const KFileItemListPrope } // pause/resume item - QStringList ids; - ids.reserve(containingDirs.size()); - bool isPaused = false; - for (const SyncthingDir *dir : std::as_const(containingDirs)) { - ids << dir->id; - if (dir->paused) { - isPaused = true; - break; - } - } - if (isPaused) { + if (containingDirsStats.anyPaused) { actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")), containingDirs.size() == 1 ? tr("Resume \"%1\"").arg(containingDirs.front()->displayName()) : tr("Resume containing directories"), parent); @@ -200,7 +213,8 @@ QList SyncthingFileItemAction::createActions(const KFileItemListPrope } if (connection.isConnected()) { connect(actions.back(), &QAction::triggered, - bind(isPaused ? &SyncthingConnection::resumeDirectories : &SyncthingConnection::pauseDirectories, &connection, ids)); + bind(containingDirsStats.anyPaused ? &SyncthingConnection::resumeDirectories : &SyncthingConnection::pauseDirectories, &connection, + containingDirsStats.ids)); } else { actions.back()->setEnabled(false); } diff --git a/fileitemactionplugin/syncthingfileitemactionstaticdata.cpp b/fileitemactionplugin/syncthingfileitemactionstaticdata.cpp index 277cf0f..d00d767 100644 --- a/fileitemactionplugin/syncthingfileitemactionstaticdata.cpp +++ b/fileitemactionplugin/syncthingfileitemactionstaticdata.cpp @@ -94,7 +94,11 @@ void SyncthingFileItemActionStaticData::logConnectionError(const QString &errorM void SyncthingFileItemActionStaticData::rescanDir(const QString &dirId, const QString &relpath) { - m_connection.rescan(dirId, relpath); + int row; + const auto *const dirInfo = m_connection.findDirInfo(dirId, row); + if (dirInfo && !dirInfo->paused) { + m_connection.rescan(dirId, relpath); + } } void SyncthingFileItemActionStaticData::showAboutDialog()