Don't allow to rescan paused directories from Dolphin integration
This commit is contained in:
parent
8e51e641ab
commit
f5b6c506c7
|
@ -63,6 +63,33 @@ QList<QAction *> SyncthingFileItemAction::actions(const KFileItemListProperties
|
||||||
return topLevelActions;
|
return topLevelActions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct DirStats {
|
||||||
|
explicit DirStats(const QList<const SyncthingDir *> &dirs);
|
||||||
|
|
||||||
|
QStringList ids;
|
||||||
|
bool anyPaused = false;
|
||||||
|
bool allPaused = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
DirStats::DirStats(const QList<const SyncthingDir *> &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<QAction *> SyncthingFileItemAction::createActions(const KFileItemListProperties &fileItemInfo, QObject *parent)
|
QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListProperties &fileItemInfo, QObject *parent)
|
||||||
{
|
{
|
||||||
QList<QAction *> actions;
|
QList<QAction *> actions;
|
||||||
|
@ -105,6 +132,10 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// compute dir stats
|
||||||
|
const auto detectedDirsStats = DirStats(detectedDirs);
|
||||||
|
const auto containingDirsStats = DirStats(containingDirs);
|
||||||
|
|
||||||
// add actions for the selected items itself
|
// add actions for the selected items itself
|
||||||
actions.reserve(32);
|
actions.reserve(32);
|
||||||
if (!detectedItems.isEmpty()) {
|
if (!detectedItems.isEmpty()) {
|
||||||
|
@ -115,7 +146,7 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
rescanLabel = tr("Rescan \"%1\"").arg(detectedItems.front().name);
|
rescanLabel = tr("Rescan \"%1\"").arg(detectedItems.front().name);
|
||||||
}
|
}
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("view-refresh")), rescanLabel, parent);
|
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)) {
|
for (const SyncthingItem &item : std::as_const(detectedItems)) {
|
||||||
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, item.dir->id, item.path));
|
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, item.dir->id, item.path));
|
||||||
}
|
}
|
||||||
|
@ -126,10 +157,11 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
|
|
||||||
// add actions for explicitely selected Syncthing dirs
|
// add actions for explicitely selected Syncthing dirs
|
||||||
if (!detectedDirs.isEmpty()) {
|
if (!detectedDirs.isEmpty()) {
|
||||||
|
|
||||||
// rescan item
|
// rescan item
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")),
|
||||||
detectedDirs.size() == 1 ? tr("Rescan \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Rescan selected directories"), parent);
|
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)) {
|
for (const SyncthingDir *dir : std::as_const(detectedDirs)) {
|
||||||
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString()));
|
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString()));
|
||||||
containingDirs.removeAll(dir);
|
containingDirs.removeAll(dir);
|
||||||
|
@ -139,17 +171,7 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
}
|
}
|
||||||
|
|
||||||
// pause/resume item
|
// pause/resume item
|
||||||
QStringList ids;
|
if (detectedDirsStats.anyPaused) {
|
||||||
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) {
|
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")),
|
||||||
detectedDirs.size() == 1 ? tr("Resume \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Resume selected directories"), parent);
|
detectedDirs.size() == 1 ? tr("Resume \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Resume selected directories"), parent);
|
||||||
} else {
|
} else {
|
||||||
|
@ -158,7 +180,8 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
}
|
}
|
||||||
if (connection.isConnected()) {
|
if (connection.isConnected()) {
|
||||||
connect(actions.back(), &QAction::triggered,
|
connect(actions.back(), &QAction::triggered,
|
||||||
bind(isPaused ? &SyncthingConnection::resumeDirectories : &SyncthingConnection::pauseDirectories, &connection, ids));
|
bind(detectedDirsStats.anyPaused ? &SyncthingConnection::resumeDirectories : &SyncthingConnection::pauseDirectories, &connection,
|
||||||
|
detectedDirsStats.ids));
|
||||||
} else {
|
} else {
|
||||||
actions.back()->setEnabled(false);
|
actions.back()->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
@ -170,7 +193,7 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")),
|
||||||
containingDirs.size() == 1 ? tr("Rescan \"%1\"").arg(containingDirs.front()->displayName()) : tr("Rescan containing directories"),
|
containingDirs.size() == 1 ? tr("Rescan \"%1\"").arg(containingDirs.front()->displayName()) : tr("Rescan containing directories"),
|
||||||
parent);
|
parent);
|
||||||
if (connection.isConnected()) {
|
if (connection.isConnected() && !containingDirsStats.allPaused) {
|
||||||
for (const SyncthingDir *dir : std::as_const(containingDirs)) {
|
for (const SyncthingDir *dir : std::as_const(containingDirs)) {
|
||||||
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString()));
|
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString()));
|
||||||
}
|
}
|
||||||
|
@ -179,17 +202,7 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
}
|
}
|
||||||
|
|
||||||
// pause/resume item
|
// pause/resume item
|
||||||
QStringList ids;
|
if (containingDirsStats.anyPaused) {
|
||||||
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) {
|
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")),
|
||||||
containingDirs.size() == 1 ? tr("Resume \"%1\"").arg(containingDirs.front()->displayName()) : tr("Resume containing directories"),
|
containingDirs.size() == 1 ? tr("Resume \"%1\"").arg(containingDirs.front()->displayName()) : tr("Resume containing directories"),
|
||||||
parent);
|
parent);
|
||||||
|
@ -200,7 +213,8 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
}
|
}
|
||||||
if (connection.isConnected()) {
|
if (connection.isConnected()) {
|
||||||
connect(actions.back(), &QAction::triggered,
|
connect(actions.back(), &QAction::triggered,
|
||||||
bind(isPaused ? &SyncthingConnection::resumeDirectories : &SyncthingConnection::pauseDirectories, &connection, ids));
|
bind(containingDirsStats.anyPaused ? &SyncthingConnection::resumeDirectories : &SyncthingConnection::pauseDirectories, &connection,
|
||||||
|
containingDirsStats.ids));
|
||||||
} else {
|
} else {
|
||||||
actions.back()->setEnabled(false);
|
actions.back()->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,11 @@ void SyncthingFileItemActionStaticData::logConnectionError(const QString &errorM
|
||||||
|
|
||||||
void SyncthingFileItemActionStaticData::rescanDir(const QString &dirId, const QString &relpath)
|
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()
|
void SyncthingFileItemActionStaticData::showAboutDialog()
|
||||||
|
|
Loading…
Reference in New Issue