[Pkg-owncloud-commits] [owncloud-client] 110/120: Folder Model: add an error item when one cannot fetch the list of folders #3524
Sandro Knauß
hefee-guest at moszumanska.debian.org
Mon Aug 24 00:02:54 UTC 2015
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit 38aa4cf3040cfe8b096ed4eec001b273622b8dd3
Author: Olivier Goffart <ogoffart at woboq.com>
Date: Tue Aug 18 13:21:02 2015 +0200
Folder Model: add an error item when one cannot fetch the list of folders #3524
---
src/gui/folderstatusmodel.cpp | 70 +++++++++++++++++++++++++++++--------------
src/gui/folderstatusmodel.h | 5 ++--
2 files changed, 50 insertions(+), 25 deletions(-)
diff --git a/src/gui/folderstatusmodel.cpp b/src/gui/folderstatusmodel.cpp
index 3e13c54..0aff6e9 100644
--- a/src/gui/folderstatusmodel.cpp
+++ b/src/gui/folderstatusmodel.cpp
@@ -86,6 +86,12 @@ Qt::ItemFlags FolderStatusModel::flags ( const QModelIndex &index ) const
}
return Qt::ItemIsEnabled | ret;
}
+ case ErrorLabel:
+ return Qt::ItemIsEnabled
+#if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0)
+ | Qt::ItemNeverHasChildren
+#endif
+ ;
case RootFolder:
return Qt::ItemIsEnabled;
case SubFolder:
@@ -141,6 +147,12 @@ QVariant FolderStatusModel::data(const QModelIndex &index, int role) const
}
}
return QVariant();
+ case ErrorLabel:
+ switch(role) {
+ case Qt::DisplayRole: return tr("Error while loading the list of folder from the server.");
+ case Qt::FontRole: { QFont f; f.setItalic(true); return f; }
+ default: return QVariant();
+ }
case RootFolder:
break;
}
@@ -277,17 +289,18 @@ int FolderStatusModel::rowCount(const QModelIndex& parent) const
if (!parent.isValid()) {
return _folders.count() + 1;
}
-
auto info = infoForIndex(parent);
if (!info)
return 0;
+ if (info->_hasError)
+ return 1;
return info->_subs.count();
}
FolderStatusModel::ItemType FolderStatusModel::classify(const QModelIndex& index) const
{
- if (index.internalPointer()) {
- return SubFolder;
+ if (auto sub = static_cast<SubFolderInfo*>(index.internalPointer())) {
+ return sub->_hasError ? ErrorLabel : SubFolder;
}
if (index.row() < _folders.count()) {
return RootFolder;
@@ -299,8 +312,12 @@ FolderStatusModel::SubFolderInfo* FolderStatusModel::infoForIndex(const QModelIn
{
if (!index.isValid())
return 0;
- if (auto parentInfo = index.internalPointer()) {
- return &static_cast<SubFolderInfo*>(parentInfo)->_subs[index.row()];
+ if (auto parentInfo = static_cast<SubFolderInfo*>(index.internalPointer())) {
+ if (parentInfo->_hasError) {
+ // Error label
+ return 0;
+ }
+ return &parentInfo->_subs[index.row()];
} else {
if (index.row() >= _folders.count()) {
// AddButton
@@ -317,18 +334,22 @@ QModelIndex FolderStatusModel::index(int row, int column, const QModelIndex& par
return createIndex(row, column/*, nullptr*/);
}
switch(classify(parent)) {
- case AddButton: return QModelIndex();
+ case AddButton:
+ case ErrorLabel:
+ return QModelIndex();
case RootFolder:
if (_folders.count() <= parent.row())
return QModelIndex(); // should not happen
return createIndex(row, column, const_cast<SubFolderInfo *>(&_folders[parent.row()]));
- case SubFolder:
- //return QModelIndex();
- if (static_cast<SubFolderInfo*>(parent.internalPointer())->_subs.count() <= parent.row())
+ case SubFolder: {
+ auto info = static_cast<SubFolderInfo*>(parent.internalPointer());
+ if (info->_subs.count() <= parent.row())
return QModelIndex(); // should not happen
- if (static_cast<SubFolderInfo*>(parent.internalPointer())->_subs.at(parent.row())._subs.count() <= row)
+ if (!info->_subs.at(parent.row())._hasError
+ && info->_subs.at(parent.row())._subs.count() <= row)
return QModelIndex(); // should not happen
- return createIndex(row, column, &static_cast<SubFolderInfo*>(parent.internalPointer())->_subs[parent.row()]);
+ return createIndex(row, column, &info->_subs[parent.row()]);
+ }
}
return QModelIndex();
}
@@ -343,17 +364,18 @@ QModelIndex FolderStatusModel::parent(const QModelIndex& child) const
case AddButton:
return QModelIndex();
case SubFolder:
+ case ErrorLabel:
break;
}
- auto pathIdx = static_cast<SubFolderInfo*>(child.internalPointer())->_subs[child.row()]._pathIdx;
+ auto pathIdx = static_cast<SubFolderInfo*>(child.internalPointer())->_pathIdx;
int i = 1;
Q_ASSERT(pathIdx.at(0) < _folders.count());
- if (pathIdx.count() == 2) {
+ if (pathIdx.count() == 1) {
return createIndex(pathIdx.at(0), 0/*, nullptr*/);
}
const SubFolderInfo *info = &_folders[pathIdx.at(0)];
- while (i < pathIdx.count() - 2) {
+ while (i < pathIdx.count() - 1) {
Q_ASSERT(pathIdx.at(i) < info->_subs.count());
info = &info->_subs[pathIdx.at(i)];
++i;
@@ -428,7 +450,13 @@ void FolderStatusModel::slotUpdateDirectories(const QStringList &list_)
auto list = list_;
list.removeFirst(); // remove the parent item
- beginInsertRows(idx, 0, list.count());
+ if (parentInfo->_hasError) {
+ beginRemoveRows(idx, 0 ,0);
+ parentInfo->_hasError = false;
+ endRemoveRows();
+ }
+
+ beginInsertRows(idx, 0, list.count() - 1);
QUrl url = parentInfo->_folder->remoteUrl();
QString pathToRemove = url.path();
@@ -495,14 +523,6 @@ void FolderStatusModel::slotUpdateDirectories(const QStringList &list_)
void FolderStatusModel::slotLscolFinishedWithError(QNetworkReply* r)
{
-/*
- if (r->error() == QNetworkReply::ContentNotFoundError) {
- _loading->setText(tr("No subfolders currently on the server."));
- } else {
- _loading->setText(tr("An error occured while loading the list of sub folders."));
- }
- _loading->resize(_loading->sizeHint()); // because it's not in a layout
-*/
auto job = qobject_cast<LsColJob *>(sender());
Q_ASSERT(job);
QModelIndex idx = qvariant_cast<QPersistentModelIndex>(job->property(propertyParentIndexC));
@@ -514,6 +534,10 @@ void FolderStatusModel::slotLscolFinishedWithError(QNetworkReply* r)
parentInfo->_fetching = false;
if (r->error() == QNetworkReply::ContentNotFoundError) {
parentInfo->_fetched = true;
+ } else if (!parentInfo->_hasError) {
+ beginInsertRows(idx, 0, 0);
+ parentInfo->_hasError = true;
+ endInsertRows();
}
}
}
diff --git a/src/gui/folderstatusmodel.h b/src/gui/folderstatusmodel.h
index 8279be3..d849ee2 100644
--- a/src/gui/folderstatusmodel.h
+++ b/src/gui/folderstatusmodel.h
@@ -53,7 +53,7 @@ public:
struct SubFolderInfo {
SubFolderInfo()
: _folder(0), _size(0), _fetched(false), _fetching(false), _isUndecided(false),
- _checked(Qt::Checked) {}
+ _hasError(false), _checked(Qt::Checked) {}
Folder *_folder;
QString _name;
QString _path;
@@ -63,6 +63,7 @@ public:
bool _fetched; // If we did the LSCOL for this folder already
bool _fetching;
bool _isUndecided; // undecided folder are the big folder that the user has not accepted yet
+ bool _hasError; // If the last fetching job ended in an error
Qt::CheckState _checked;
struct Progress {
@@ -79,7 +80,7 @@ public:
QVector<SubFolderInfo> _folders;
- enum ItemType { RootFolder, SubFolder, AddButton/*, SelectiveSyncText*/ };
+ enum ItemType { RootFolder, SubFolder, AddButton, ErrorLabel };
ItemType classify(const QModelIndex &index) const;
SubFolderInfo *infoForIndex(const QModelIndex &index) const;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list