Improve handling folder errors

This commit is contained in:
Martchus 2016-10-05 22:33:10 +02:00
parent 7b0dd785c2
commit 9b92b72bfd
4 changed files with 17 additions and 4 deletions

View File

@ -1163,7 +1163,12 @@ void SyncthingConnection::readDirEvent(DateTime eventTime, const QString &eventT
if(find(errors.cbegin(), errors.cend(), dirError) == errors.cend()) { if(find(errors.cbegin(), errors.cend(), dirError) == errors.cend()) {
errors.emplace_back(move(dirError)); errors.emplace_back(move(dirError));
dirInfo->assignStatus(SyncthingDirStatus::OutOfSync, eventTime); dirInfo->assignStatus(SyncthingDirStatus::OutOfSync, eventTime);
emitNotification(eventTime, dirInfo->errors.back().message);
// emit newNotification() for new errors
auto &previousErrors = dirInfo->previousErrors;
if(find(previousErrors.cbegin(), previousErrors.cend(), dirInfo->errors.back()) == previousErrors.cend()) {
emitNotification(eventTime, dirInfo->errors.back().message);
}
} }
} }
} }

View File

@ -28,10 +28,14 @@ bool SyncthingDir::assignStatus(const QString &statusStr, ChronoUtilities::DateT
} else if(statusStr == QLatin1String("scanning")) { } else if(statusStr == QLatin1String("scanning")) {
newStatus = SyncthingDirStatus::Scanning; newStatus = SyncthingDirStatus::Scanning;
} else if(statusStr == QLatin1String("syncing")) { } else if(statusStr == QLatin1String("syncing")) {
// ensure status changed signal is emitted
if(!errors.empty()) { if(!errors.empty()) {
errors.clear(); // errors become obsolete status = SyncthingDirStatus::Unknown;
status = SyncthingDirStatus::Unknown; // ensure status changed signal is emitted
} }
// errors become obsolete; however errors must be kept as previous errors to be able
// to identify new errors occuring during this sync attempt as known errors
previousErrors.clear();
previousErrors.swap(errors);
newStatus = SyncthingDirStatus::Synchronizing; newStatus = SyncthingDirStatus::Synchronizing;
} else if(statusStr == QLatin1String("error")) { } else if(statusStr == QLatin1String("error")) {
progressPercentage = 0; progressPercentage = 0;

View File

@ -73,6 +73,7 @@ struct LIB_SYNCTHING_CONNECTOR_EXPORT SyncthingDir
int progressPercentage = 0; int progressPercentage = 0;
int progressRate = 0; int progressRate = 0;
std::vector<SyncthingDirError> errors; std::vector<SyncthingDirError> errors;
std::vector<SyncthingDirError> previousErrors;
int globalBytes = 0, globalDeleted = 0, globalFiles = 0; int globalBytes = 0, globalDeleted = 0, globalFiles = 0;
int localBytes = 0, localDeleted = 0, localFiles = 0; int localBytes = 0, localDeleted = 0, localFiles = 0;
int neededByted = 0, neededFiles = 0; int neededByted = 0, neededFiles = 0;

View File

@ -127,6 +127,8 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const
return QColor(Qt::red); return QColor(Qt::red);
} }
break; break;
case 7:
return dir.errors.empty() ? QColor(Qt::gray) : QColor(Qt::red);
} }
} }
break; break;
@ -229,7 +231,7 @@ int SyncthingDirectoryModel::rowCount(const QModelIndex &parent) const
if(!parent.isValid()) { if(!parent.isValid()) {
return static_cast<int>(m_dirs.size()); return static_cast<int>(m_dirs.size());
} else if(!parent.parent().isValid()) { } else if(!parent.parent().isValid()) {
return parent.parent().row() >= 0 && static_cast<size_t>(parent.parent().row()) < m_dirs.size() && m_dirs[static_cast<size_t>(parent.parent().row())].errors.empty() ? 6 : 7; return 8;
} else { } else {
return 0; return 0;
} }
@ -262,6 +264,7 @@ void SyncthingDirectoryModel::dirStatusChanged(const SyncthingDir &, int index)
emit dataChanged(modelIndex1, modelIndex1, QVector<int>() << Qt::DecorationRole); emit dataChanged(modelIndex1, modelIndex1, QVector<int>() << Qt::DecorationRole);
const QModelIndex modelIndex2(this->index(index, 1, QModelIndex())); const QModelIndex modelIndex2(this->index(index, 1, QModelIndex()));
emit dataChanged(modelIndex2, modelIndex2, QVector<int>() << Qt::DisplayRole << Qt::ForegroundRole); emit dataChanged(modelIndex2, modelIndex2, QVector<int>() << Qt::DisplayRole << Qt::ForegroundRole);
emit dataChanged(this->index(0, 1, modelIndex1), this->index(7, 1, modelIndex1), QVector<int>() << Qt::DisplayRole);
} }
} // namespace Data } // namespace Data