Account settings: add the progress back on the new ui

This commit is contained in:
Olivier Goffart 2015-04-09 12:06:47 +02:00
parent 426d2338d9
commit 85ff245aef
4 changed files with 66 additions and 151 deletions

View file

@ -232,70 +232,6 @@ void AccountSettings::setGeneralErrors( const QStringList& errors )
} }
} }
void AccountSettings::folderToModelItem( QStandardItem *item, Folder *f, bool accountConnected )
{
if( ! item || !f ) return;
item->setData( f->nativePath(), FolderStatusDelegate::FolderPathRole );
item->setData( f->remotePath(), FolderStatusDelegate::FolderSecondPathRole );
item->setData( f->alias(), FolderStatusDelegate::FolderAliasRole );
item->setData( f->syncPaused(), FolderStatusDelegate::FolderSyncPaused );
item->setData( accountConnected, FolderStatusDelegate::FolderAccountConnected );
SyncResult res = f->syncResult();
SyncResult::Status status = res.status();
QStringList errorList = res.errorStrings();
Theme *theme = Theme::instance();
item->setData( theme->statusHeaderText( status ), Qt::ToolTipRole );
if ( accountConnected ) {
if( f->syncPaused() ) {
item->setData( theme->folderDisabledIcon( ), FolderStatusDelegate::FolderStatusIconRole ); // size 48 before
_wasDisabledBefore = false;
} else {
if( status == SyncResult::SyncPrepare ) {
if( _wasDisabledBefore ) {
// if the folder was disabled before, set the sync icon
item->setData( theme->syncStateIcon( SyncResult::SyncRunning), FolderStatusDelegate::FolderStatusIconRole );
} // we keep the previous icon for the SyncPrepare state.
} else if( status == SyncResult::Undefined ) {
// startup, the sync was never done.
qDebug() << "XXX FIRST time sync, setting icon to sync running!";
item->setData( theme->syncStateIcon( SyncResult::SyncRunning), FolderStatusDelegate::FolderStatusIconRole );
} else {
// kepp the previous icon for the prepare phase.
if( status == SyncResult::Problem) {
item->setData( theme->syncStateIcon( SyncResult::Success), FolderStatusDelegate::FolderStatusIconRole );
} else {
item->setData( theme->syncStateIcon( status ), FolderStatusDelegate::FolderStatusIconRole );
}
}
}
} else {
item->setData( theme->folderOfflineIcon(), FolderStatusDelegate::FolderStatusIconRole);
}
item->setData( theme->statusHeaderText( status ), FolderStatusDelegate::FolderStatus );
if( errorList.isEmpty() ) {
if( (status == SyncResult::Error ||
status == SyncResult::SetupError ||
status == SyncResult::SyncAbortRequested )) {
errorList << theme->statusHeaderText(status);
}
}
item->setData( errorList, FolderStatusDelegate::FolderErrorMsg);
bool ongoing = false;
item->setData( QVariant(res.warnCount()), FolderStatusDelegate::WarningCount );
if( status == SyncResult::SyncRunning ) {
ongoing = true;
}
item->setData( ongoing, FolderStatusDelegate::SyncRunning);
}
void AccountSettings::slotRemoveCurrentFolder() void AccountSettings::slotRemoveCurrentFolder()
{ {
QModelIndex selected = ui->_folderList->selectionModel()->currentIndex(); QModelIndex selected = ui->_folderList->selectionModel()->currentIndex();
@ -452,27 +388,13 @@ void AccountSettings::slotSyncCurrentFolderNow()
void AccountSettings::slotUpdateFolderState( Folder *folder ) void AccountSettings::slotUpdateFolderState( Folder *folder )
{ {
QStandardItem *item = 0;
int row = 0;
if( ! folder ) return; if( ! folder ) return;
#if 0
item = _model->item( row );
while( item ) { auto folderList = FolderMan::instance()->map().values();
if( item->data( FolderStatusDelegate::FolderAliasRole ) == folder->alias() ) { auto folderIndex = folderList.indexOf(folder);
// its the item to update! if (folderIndex < 0) { return; }
break; emit _model->dataChanged(_model->index(folderIndex), _model->index(folderIndex),
} QVector<int>() << FolderStatusDelegate::AddProgressSpace);
item = _model->item( ++row );
}
if( item ) {
folderToModelItem( item, folder, _accountState->isConnectedOrMaintenance() );
} else {
// the dialog is not visible.
}
#endif
} }
void AccountSettings::slotOpenOC() void AccountSettings::slotOpenOC()
@ -481,11 +403,6 @@ void AccountSettings::slotOpenOC()
QDesktopServices::openUrl( _OCUrl ); QDesktopServices::openUrl( _OCUrl );
} }
QStandardItem* AccountSettings::itemForFolder(const QString& folder)
{
return nullptr;
}
QString AccountSettings::shortenFilename( const QString& folder, const QString& file ) const QString AccountSettings::shortenFilename( const QString& folder, const QString& file ) const
{ {
// strip off the server prefix from the file name // strip off the server prefix from the file name
@ -508,26 +425,35 @@ QString AccountSettings::shortenFilename( const QString& folder, const QString&
void AccountSettings::slotSetProgress(const QString& folder, const Progress::Info &progress ) void AccountSettings::slotSetProgress(const QString& folder, const Progress::Info &progress )
{ {
#if 0
if (!isVisible()) { if (!isVisible()) {
return; // for https://github.com/owncloud/client/issues/2648#issuecomment-71377909 return; // for https://github.com/owncloud/client/issues/2648#issuecomment-71377909
} }
QStandardItem *item = itemForFolder( folder );
if( !item ) return;
// switch on extra space. Folder *f = FolderMan::instance()->folder(folder);
item->setData( QVariant(true), FolderStatusDelegate::AddProgressSpace ); if( !f ) { return; }
auto folderList = FolderMan::instance()->map().values();
auto folderIndex = folderList.indexOf(f);
if (folderIndex < 0) { return; }
if (_model->_progresses.size() <= folderIndex) {
_model->_progresses.resize(folderIndex + 1);
}
FolderStatusModel::ProgressInfo *progressInfo = &_model->_progresses[folderIndex];
QVector<int> roles;
roles << FolderStatusDelegate::AddProgressSpace << FolderStatusDelegate::SyncProgressItemString
<< FolderStatusDelegate::WarningCount;
if (!progress._currentDiscoveredFolder.isEmpty()) { if (!progress._currentDiscoveredFolder.isEmpty()) {
item->setData( tr("Discovering '%1'").arg(progress._currentDiscoveredFolder) , FolderStatusDelegate::SyncProgressItemString ); progressInfo->_progressString = tr("Discovering '%1'").arg(progress._currentDiscoveredFolder);
emit _model->dataChanged(_model->index(folderIndex), _model->index(folderIndex), roles);
return; return;
} }
if(!progress._lastCompletedItem.isEmpty() if(!progress._lastCompletedItem.isEmpty()
&& Progress::isWarningKind(progress._lastCompletedItem._status)) { && Progress::isWarningKind(progress._lastCompletedItem._status)) {
int warnCount = item->data(FolderStatusDelegate::WarningCount).toInt(); progressInfo->_warningCount++;
warnCount++;
item->setData( QVariant(warnCount), FolderStatusDelegate::WarningCount );
} }
// find the single item to display: This is going to be the bigger item, or the last completed // find the single item to display: This is going to be the bigger item, or the last completed
@ -571,7 +497,7 @@ void AccountSettings::slotSetProgress(const QString& folder, const Progress::Inf
//: Example text: "uploading foobar.png" //: Example text: "uploading foobar.png"
fileProgressString = tr("%1 %2").arg(kindString, itemFileName); fileProgressString = tr("%1 %2").arg(kindString, itemFileName);
} }
item->setData( fileProgressString,FolderStatusDelegate::SyncProgressItemString); progressInfo->_progressString = fileProgressString;
// overall progress // overall progress
quint64 completedSize = progress.completedSize(); quint64 completedSize = progress.completedSize();
@ -593,81 +519,56 @@ void AccountSettings::slotSetProgress(const QString& folder, const Progress::Inf
overallSyncString = tr("file %1 of %2") .arg(currentFile).arg(totalFileCount); overallSyncString = tr("file %1 of %2") .arg(currentFile).arg(totalFileCount);
} }
item->setData( overallSyncString, FolderStatusDelegate::SyncProgressOverallString ); progressInfo->_overallSyncString = overallSyncString;
int overallPercent = 0; int overallPercent = 0;
if( totalFileCount > 0 ) { if( totalFileCount > 0 ) {
// Add one 'byte' for each files so the percentage is moving when deleting or renaming files // Add one 'byte' for each files so the percentage is moving when deleting or renaming files
overallPercent = qRound(double(completedSize + progress._completedFileCount)/double(totalSize + totalFileCount) * 100.0); overallPercent = qRound(double(completedSize + progress._completedFileCount)/double(totalSize + totalFileCount) * 100.0);
} }
overallPercent = qBound(0, overallPercent, 100); progressInfo->_overallPercent = qBound(0, overallPercent, 100);
item->setData( overallPercent, FolderStatusDelegate::SyncProgressOverallPercent); emit _model->dataChanged(_model->index(folderIndex), _model->index(folderIndex), roles);
#endif
} }
void AccountSettings::slotHideProgress() void AccountSettings::slotHideProgress()
{ {
#if 0 auto folderIndex = sender()->property("owncloud_folderIndex").toInt();
QTimer *send_timer = qobject_cast<QTimer*>(this->sender()); if (folderIndex < 0) { return; }
QHash<QStandardItem*, QTimer*>::const_iterator i = _hideProgressTimers.constBegin();
while (i != _hideProgressTimers.constEnd()) {
if( i.value() == send_timer ) {
QStandardItem *item = i.key();
/* Check if this item is still existing */ if (_model->_progresses.size() <= folderIndex) {
bool ok = false; return;
for( int r = 0; !ok && r < _model->rowCount(); r++) {
if( item == _model->item(r,0) ) {
ok = true;
}
}
if( ok ) {
item->setData( false, FolderStatusDelegate::AddProgressSpace );
item->setData( QString(), FolderStatusDelegate::SyncProgressOverallString );
item->setData( QString(), FolderStatusDelegate::SyncProgressItemString );
item->setData( 0, FolderStatusDelegate::SyncProgressOverallPercent );
}
_hideProgressTimers.remove(item);
break;
}
++i;
} }
send_timer->deleteLater(); _model->_progresses[folderIndex] = FolderStatusModel::ProgressInfo();
#endif emit _model->dataChanged(_model->index(folderIndex), _model->index(folderIndex),
QVector<int>() << FolderStatusDelegate::AddProgressSpace);
} }
void AccountSettings::slotFolderSyncStateChange() void AccountSettings::slotFolderSyncStateChange()
{ {
#if 0
Folder* folder = qobject_cast<Folder *>(sender()); Folder* folder = qobject_cast<Folder *>(sender());
if (!folder) return; if (!folder) return;
auto folderList = FolderMan::instance()->map().values();
QStandardItem *item = itemForFolder( folder->alias() ); auto folderIndex = folderList.indexOf(folder);
if( !item ) return; if (folderIndex < 0) { return; }
SyncResult::Status state = folder->syncResult().status(); SyncResult::Status state = folder->syncResult().status();
if (state == SyncResult::SyncPrepare) { if (state == SyncResult::SyncPrepare) {
item->setData( QVariant(0), FolderStatusDelegate::WarningCount ); if (_model->_progresses.size() > folderIndex) {
_model->_progresses[folderIndex] = FolderStatusModel::ProgressInfo();
}
} else if (state == SyncResult::Success || state == SyncResult::Problem) { } else if (state == SyncResult::Success || state == SyncResult::Problem) {
// start a timer to stop the progress display // start a timer to stop the progress display
QTimer *timer; QTimer *timer;
if( _hideProgressTimers.contains(item) ) { timer = new QTimer(this);
timer = _hideProgressTimers[item]; connect(timer, SIGNAL(timeout()), this, SLOT(slotHideProgress()));
// there is already one timer running. connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()));
} else { timer->setSingleShot(true);
timer = new QTimer(this); timer->setProperty("owncloud_folderIndex", folderIndex);
connect(timer, SIGNAL(timeout()), this, SLOT(slotHideProgress()));
timer->setSingleShot(true);
_hideProgressTimers.insert(item, timer);
}
timer->start(5000); timer->start(5000);
} }
#endif
} }
void AccountSettings::slotUpdateQuota(qint64 total, qint64 used) void AccountSettings::slotUpdateQuota(qint64 total, qint64 used)
{ {
if( total > 0 ) { if( total > 0 ) {

View file

@ -19,14 +19,11 @@
#include <QPointer> #include <QPointer>
#include <QHash> #include <QHash>
#include <QTimer> #include <QTimer>
#include <QStandardItem>
#include "folder.h" #include "folder.h"
#include "progressdispatcher.h" #include "progressdispatcher.h"
class QStandardItemModel;
class QModelIndex; class QModelIndex;
class QStandardItem;
class QNetworkReply; class QNetworkReply;
class QListWidgetItem; class QListWidgetItem;
class QLabel; class QLabel;
@ -83,15 +80,12 @@ protected slots:
private: private:
QString shortenFilename( const QString& folder, const QString& file ) const; QString shortenFilename( const QString& folder, const QString& file ) const;
void folderToModelItem(QStandardItem *, Folder * , bool accountConnected);
QStandardItem* itemForFolder(const QString& );
void showConnectionLabel( const QString& message, const QString& tooltip = QString() ); void showConnectionLabel( const QString& message, const QString& tooltip = QString() );
Ui::AccountSettings *ui; Ui::AccountSettings *ui;
FolderStatusModel *_model; FolderStatusModel *_model;
QUrl _OCUrl; QUrl _OCUrl;
QHash<QStandardItem*, QTimer*> _hideProgressTimers;
QStringList _generalErrors; QStringList _generalErrors;
bool _wasDisabledBefore; bool _wasDisabledBefore;
AccountState *_accountState; AccountState *_accountState;

View file

@ -131,6 +131,16 @@ QVariant FolderStatusModel::data(const QModelIndex &index, int role) const
} else { } else {
return Theme::instance()->folderOfflineIcon(); return Theme::instance()->folderOfflineIcon();
} }
case FolderStatusDelegate::AddProgressSpace:
return !_progresses.value(index.row()).isNull();
case FolderStatusDelegate::SyncProgressItemString:
return _progresses.value(index.row())._progressString;
case FolderStatusDelegate::WarningCount:
return _progresses.value(index.row())._warningCount;
case FolderStatusDelegate::SyncProgressOverallPercent:
return _progresses.value(index.row())._overallPercent;
case FolderStatusDelegate::SyncProgressOverallString:
return _progresses.value(index.row())._overallSyncString;
} }
return QVariant(); return QVariant();
} }

View file

@ -48,7 +48,6 @@ public:
struct SubFolderInfo { struct SubFolderInfo {
// QWeakPointer<SubFolderInfo> parent;
QString _name; QString _name;
QString _path; QString _path;
QVector<int> _pathIdx; QVector<int> _pathIdx;
@ -68,6 +67,17 @@ public:
bool isDirty() { return _dirty; } bool isDirty() { return _dirty; }
struct ProgressInfo {
bool isNull() const
{ return _progressString.isEmpty() && _warningCount == 0 && _overallSyncString.isEmpty(); }
QString _progressString;
QString _overallSyncString;
int _warningCount = 0;
int _overallPercent = 0;
};
QVector<ProgressInfo> _progresses;
public slots: public slots:
void slotApplySelectiveSync(); void slotApplySelectiveSync();
void resetFolders(); void resetFolders();