diff --git a/src/mirall/accountsettings.cpp b/src/mirall/accountsettings.cpp index 02ad7901d..45cda01bb 100644 --- a/src/mirall/accountsettings.cpp +++ b/src/mirall/accountsettings.cpp @@ -479,8 +479,8 @@ void AccountSettings::slotSetOverallProgress( const QString& folder, const QStri item->setData( fileNo, FolderStatusDelegate::OverallFileNo); item->setData( fileCnt, FolderStatusDelegate::OverallFileCount); item->setData( file, FolderStatusDelegate::OverallCurrentFile); - } + _lastOverallProgress = p1; } void AccountSettings::slotSetProgress( Progress::Kind kind, const QString& folder, const QString& file, long p1, long p2 ) @@ -489,70 +489,72 @@ void AccountSettings::slotSetProgress( Progress::Kind kind, const QString& folde QStandardItem *item = itemForFolder( folder ); - if( item ) { - if( p1 == p2 ) { // File upload finished. - item->setData( 100, FolderStatusDelegate::SyncProgressPercent1); - item->setData( 100, FolderStatusDelegate::SyncProgressPercent2); - if( p1 == 0 ) { - item->setData( (qlonglong) _lastSyncProgress, FolderStatusDelegate::SyncProgressBytes1); - item->setData( (qlonglong) _lastSyncProgress, FolderStatusDelegate::SyncProgressBytes2); - } else { - item->setData( (qlonglong) p1, FolderStatusDelegate::SyncProgressBytes1); - item->setData( (qlonglong) p2, FolderStatusDelegate::SyncProgressBytes2); - } - // item->setData( QVariant(QString::null), FolderStatusDelegate::SyncFileName ); + if( item == NULL ) { + return; + } + // Set the verb if up- or download + if( kind != Progress::Context ) { + _kindContext = Progress::asString(kind); + } + QString kindString = _kindContext; + item->setData( kindString, FolderStatusDelegate::SyncFileKind ); - // start a timer to stop the progress display - QTimer *timer; - if( _hideProgressTimers.contains(item) ) { - timer = _hideProgressTimers[item]; - // there is already one timer running. - } else { - timer = new QTimer; - connect(timer, SIGNAL(timeout()), this, SLOT(slotHideProgress())); - timer->setSingleShot(true); - _hideProgressTimers.insert(item, timer); - } - timer->start(5000); - } else if( p1 == 0 ) { // File upload starts. - if( _hideProgressTimers.contains(item) ) { - // The timer is still running. - QTimer *t = _hideProgressTimers.take(item); - t->stop(); - t->deleteLater(); - } - // calculate the normalization factor and set the min and max - // _progressFactor = 100.0/p2; - item->setData( QVariant(true), FolderStatusDelegate::AddProgressSpace ); - item->setData( 0, FolderStatusDelegate::SyncProgressPercent1); - item->setData( 100, FolderStatusDelegate::SyncProgressPercent2); - item->setData( (qlonglong) 0, FolderStatusDelegate::SyncProgressBytes1); - item->setData( (qlonglong) p2, FolderStatusDelegate::SyncProgressBytes2); - - // strip off the server prefix from the file name - QString shortFile(file); - if(shortFile.startsWith(QLatin1String("ownclouds://")) || - shortFile.startsWith(QLatin1String("owncloud://")) ) { - // rip off the whole ownCloud URL. - Folder *f = FolderMan::instance()->folder(folder); - if( f ) { - QString regexp = QString("^owncloud[s]*://.*/remote.php/webdav/%1/").arg(f->secondPath()); - QRegExp re( regexp ); - re.setMinimal(true); - shortFile.remove(re); - } - } - // Set the verb if up- or download - QString kindString = Progress::asString(kind); - - shortFile = kindString + QLatin1String(" ") + shortFile; - item->setData( shortFile, FolderStatusDelegate::SyncFileName ); - } else { // File progress - // item->setData( int(_progressFactor * p1), FolderStatusDelegate::SyncProgressPercent1); - item->setData( (qlonglong) p1, FolderStatusDelegate::SyncProgressBytes1); - _lastSyncProgress = p1; + if( kind == Progress::EndDownload || + kind == Progress::EndUpload ) { // File upload/download finished. + item->setData( 100, FolderStatusDelegate::SyncProgressPercent1); + item->setData( 100, FolderStatusDelegate::SyncProgressPercent2); + item->setData( (qlonglong) _lastSyncProgress, FolderStatusDelegate::SyncProgressBytes1); + item->setData( (qlonglong) _lastSyncProgress, FolderStatusDelegate::SyncProgressBytes2); + item->setData( tr("Finished"), FolderStatusDelegate::SyncFileProgressString); + // start a timer to stop the progress display + QTimer *timer; + if( _hideProgressTimers.contains(item) ) { + timer = _hideProgressTimers[item]; + // there is already one timer running. + } else { + timer = new QTimer; + connect(timer, SIGNAL(timeout()), this, SLOT(slotHideProgress())); + timer->setSingleShot(true); + _hideProgressTimers.insert(item, timer); } + timer->start(5000); + } else if( kind == Progress::StartDownload || + kind == Progress::StartUpload ) { // File upload starts. + if( _hideProgressTimers.contains(item) ) { + // The timer is still running. + QTimer *t = _hideProgressTimers.take(item); + t->stop(); + t->deleteLater(); + } + item->setData( QVariant(true), FolderStatusDelegate::AddProgressSpace ); + item->setData( 0, FolderStatusDelegate::SyncProgressPercent1); + item->setData( 100, FolderStatusDelegate::SyncProgressPercent2); + item->setData( (qlonglong) 0, FolderStatusDelegate::SyncProgressBytes1); + item->setData( (qlonglong) p2, FolderStatusDelegate::SyncProgressBytes2); + + // strip off the server prefix from the file name + QString shortFile(file); + if(shortFile.startsWith(QLatin1String("ownclouds://")) || + shortFile.startsWith(QLatin1String("owncloud://")) ) { + // rip off the whole ownCloud URL. + Folder *f = FolderMan::instance()->folder(folder); + if( f ) { + QString regexp = QString("^owncloud[s]*://.*/remote.php/webdav/%1/").arg(f->secondPath()); + QRegExp re( regexp ); + re.setMinimal(true); + shortFile.remove(re); + } + } + item->setData( shortFile, FolderStatusDelegate::SyncFileName ); + item->setData( tr("Start"), FolderStatusDelegate::SyncFileProgressString); + } else { // File progress + item->setData( (qlonglong) p1, FolderStatusDelegate::SyncProgressBytes1); + item->setData( (qlonglong) p2, FolderStatusDelegate::SyncProgressBytes2); + item->setData( (qlonglong) _lastOverallProgress+p1, FolderStatusDelegate::OverallProgress1 ); + item->setData( tr("Currently"), FolderStatusDelegate::SyncFileProgressString); + + _lastSyncProgress = p1; } ui->_folderList->repaint(); diff --git a/src/mirall/accountsettings.h b/src/mirall/accountsettings.h index 8cae35622..012890509 100644 --- a/src/mirall/accountsettings.h +++ b/src/mirall/accountsettings.h @@ -97,6 +97,8 @@ private: QHash _hideProgressTimers; QTimer *_timer; long _lastSyncProgress; + QString _kindContext; + qlonglong _lastOverallProgress; }; } // namespace Mirall diff --git a/src/mirall/folder.cpp b/src/mirall/folder.cpp index 87bbcd5f6..e2a0cd80d 100644 --- a/src/mirall/folder.cpp +++ b/src/mirall/folder.cpp @@ -635,19 +635,7 @@ void Folder::slotCSyncFinished() void Folder::slotFileTransmissionProgress(Progress::Kind kind, const QString& file ,long p1, long p2) { - if( kind == Progress::StartDownload ) { - _progressKind = Progress::Download; - } - if( kind == Progress::StartUpload ) { - _progressKind = Progress::Upload; - } - - // qDebug() << "Upload Progress: " << file << p1 << p2; - ProgressDispatcher::instance()->setFolderProgress( _progressKind, alias(), file, p1, p2 ); - - if( kind == Progress::EndDownload || kind == Progress::EndUpload ) { - _progressKind = Progress::Inactive; - } + ProgressDispatcher::instance()->setFolderProgress( kind, alias(), file, p1, p2 ); } void Folder::slotOverallTransmissionProgress( const QString& fileName, int fileNo, int fileCnt, diff --git a/src/mirall/folderstatusmodel.cpp b/src/mirall/folderstatusmodel.cpp index df2e78b97..e352bf36c 100644 --- a/src/mirall/folderstatusmodel.cpp +++ b/src/mirall/folderstatusmodel.cpp @@ -113,23 +113,24 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem & QFontMetrics subFm( subFont ); QFontMetrics aliasFm( aliasFont ); + QFontMetrics progressFm( progressFont ); int aliasMargin = aliasFm.height()/2; int margin = subFm.height()/4; - QIcon statusIcon = qvariant_cast(index.data(FolderStatusIconRole)); - QString aliasText = qvariant_cast(index.data(FolderAliasRole)); - QString pathText = qvariant_cast(index.data(FolderPathRole)); - QString remotePath = qvariant_cast(index.data(FolderSecondPathRole)); - QString errorText = qvariant_cast(index.data(FolderErrorMsg)); - QString syncFile = qvariant_cast(index.data(SyncFileName)); - int progressPercent1 = qvariant_cast(index.data(SyncProgressPercent1)); - int progressPercent2 = qvariant_cast(index.data(SyncProgressPercent2)); - qlonglong fileBytes1 = qvariant_cast(index.data(SyncProgressBytes1)); - qlonglong fileBytes2 = qvariant_cast(index.data(SyncProgressBytes2)); + QIcon statusIcon = qvariant_cast(index.data(FolderStatusIconRole)); + QString aliasText = qvariant_cast(index.data(FolderAliasRole)); + QString pathText = qvariant_cast(index.data(FolderPathRole)); + QString remotePath = qvariant_cast(index.data(FolderSecondPathRole)); + QString errorText = qvariant_cast(index.data(FolderErrorMsg)); + QString syncFile = qvariant_cast(index.data(SyncFileName)); + QString syncFileKind = qvariant_cast(index.data(SyncFileKind)); + QString syncFileProgress = qvariant_cast(index.data(SyncFileProgressString)); + qlonglong fileBytes1 = qvariant_cast(index.data(SyncProgressBytes1)); + qlonglong fileBytes2 = qvariant_cast(index.data(SyncProgressBytes2)); - qlonglong overallBytes1 = qvariant_cast(index.data(OverallProgress1)); - qlonglong overallBytes2 = qvariant_cast(index.data(OverallProgress2)); + qlonglong overallBytes1 = qvariant_cast(index.data(OverallProgress1)); + qlonglong overallBytes2 = qvariant_cast(index.data(OverallProgress2)); int currentFileCount = qvariant_cast(index.data(OverallFileNo)); int overallFileCount = qvariant_cast(index.data(OverallFileCount)); @@ -233,31 +234,30 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem & } h += aliasMargin; + // Sync File Progress Bar: Show it if syncFile is not empty. if( !syncFile.isEmpty()) { int fileNameTextHeight = subFm.boundingRect(tr("File")).height(); int barHeight = fileNameTextHeight; int overallWidth = option.rect.width()-2*aliasMargin; painter->save(); - // painter->setBrush( option.palette.brightText() ); - // painter->drawRoundedRect( progressRect, 2, 2 ); // do not draw the box. // Sizes-Text - QString s1 = Utility::octetsToString( overallBytes1+fileBytes1 ); + QString s1 = Utility::octetsToString( overallBytes1 ); QString s2 = Utility::octetsToString( overallBytes2 ); QString overallSyncString = tr("%1 of %2, file %3 of %4").arg(s1).arg(s2).arg(currentFileCount).arg(overallFileCount); QRect octetRect = subFm.boundingRect( overallSyncString ); int progressTextWidth = octetRect.width(); - // Overall Bar. + // Overall Progress Bar. QRect pBRect; pBRect.setTop( h ); pBRect.setLeft( iconRect.left()); pBRect.setHeight(barHeight); pBRect.setWidth( overallWidth - progressTextWidth - margin ); - int overallPercent = (overallBytes1+fileBytes1) *100.0/overallBytes2; + int overallPercent = (overallBytes1) *100.0/overallBytes2; QStyleOptionProgressBarV2 pBarOpt; pBarOpt.state = option.state | QStyle::State_Horizontal; pBarOpt.minimum = 0; @@ -278,93 +278,23 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem & painter->setFont(progressFont); painter->drawText( overallProgressRect, Qt::AlignRight+Qt::AlignVCenter, overallSyncString); - s1 = Utility::octetsToString( fileBytes2); - octetRect = subFm.boundingRect( tr("%1 of %2").arg(s1).arg(s1) ); - progressTextWidth = octetRect.width()+20; + // Individual File Progress + s1 = Utility::octetsToString( fileBytes1); + s2 = Utility::octetsToString( fileBytes2); QRect fileRect; fileRect.setTop( pBRect.bottom() + margin); fileRect.setLeft( iconRect.left()); - fileRect.setWidth( overallWidth - margin - progressTextWidth ); + fileRect.setWidth(overallWidth); fileRect.setHeight(fileNameTextHeight); - painter->drawText( fileRect, syncFile ); - QRect fileProgressRect; - fileProgressRect.setTop(pBRect.bottom()+margin); - fileProgressRect.setLeft(fileRect.right()+margin); - fileProgressRect.setWidth(progressTextWidth); - fileProgressRect.setHeight(fileNameTextHeight); - s1 = Utility::octetsToString(fileBytes1); - s2 = Utility::octetsToString(fileBytes2); - QString fileProgressString = tr("%1 of %2").arg(s1).arg(s2); - painter->drawText( fileProgressRect, Qt::AlignRight+Qt::AlignVCenter, fileProgressString ); - } -#if 0 - /* Display the sync progress. */ - if( !syncFile.isEmpty() ) { - int fileNameTextHeight = subFm.boundingRect(tr("File")).height(); - int barHeight = fileNameTextHeight; + QString fileProgressString = tr("%1 %2 %3 (%4 of %5)").arg(syncFileProgress).arg(syncFileKind).arg(syncFile).arg(s1).arg(s2); + QString elidedProgress = progressFm.elidedText(fileProgressString, Qt::ElideLeft, fileRect.width()); + painter->drawText( fileRect, Qt::AlignLeft+Qt::AlignVCenter, elidedProgress); - QRect progressRect; - progressRect.setLeft( iconRect.left()); - progressRect.setTop( localPathRect.bottom()+margin ); - progressRect.setHeight( 3 * margin + fileNameTextHeight + barHeight ); - progressRect.setRight( option.rect.right()-aliasMargin); - - painter->save(); - // painter->setBrush( option.palette.brightText() ); - // painter->drawRoundedRect( progressRect, 2, 2 ); // do not draw the box. - - painter->setFont(progressFont); - - QRect fileNameRect; - fileNameRect.setTop(progressRect.top() + margin); - fileNameRect.setLeft(progressRect.left() + margin); - fileNameRect.setWidth( progressRect.width() - 2*margin ); - fileNameRect.setHeight(fileNameTextHeight); - - QString pText = subFm.elidedText( tr("File %1: ").arg(syncFile), Qt::ElideLeft, fileNameRect.width()); - painter->drawText(fileNameRect, pText); - - // Sizes-Text - QString s1 = Utility::octetsToString( progressBytes2 ); - QRect octetRect = subFm.boundingRect( tr("%1 of %2").arg(s1).arg(s1) ); - int progressTextWidth = octetRect.width()+20; - - QRect pBRect; - pBRect.setTop( fileNameRect.bottom() + margin ); - pBRect.setLeft( fileNameRect.left()); - pBRect.setHeight(barHeight); - pBRect.setWidth( fileNameRect.width() - progressTextWidth - margin ); - - QStyleOptionProgressBarV2 pBarOpt; - pBarOpt.state = option.state | QStyle::State_Horizontal; - pBarOpt.minimum = 0; - pBarOpt.maximum = progressPercent2; - pBarOpt.progress = progressPercent1; - pBarOpt.orientation = Qt::Horizontal; - pBarOpt.palette = option.palette; - pBarOpt.rect = pBRect; - - QApplication::style()->drawControl( QStyle::CE_ProgressBar, &pBarOpt, painter ); - - QRect sizeRect; - sizeRect.setTop(pBRect.top()); - sizeRect.setHeight(pBRect.height()); - - sizeRect.setLeft(pBRect.right() + margin); - sizeRect.setWidth( progressTextWidth ); - QString ps1 = Utility::octetsToString( progressBytes1 ); - QString ps2 = Utility::octetsToString( progressBytes2 ); - - painter->drawText(sizeRect, tr("%1 of %2").arg(ps1).arg(ps2)); painter->restore(); - } -#endif - // painter->drawText(lastSyncRect, tr("Last Sync: %1").arg( statusText )); - // painter->drawText(statusRect, tr("Sync Status: %1").arg( syncStatus )); - painter->restore(); + } bool FolderStatusDelegate::editorEvent ( QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index ) diff --git a/src/mirall/folderstatusmodel.h b/src/mirall/folderstatusmodel.h index ac99556a9..6cbbfd163 100644 --- a/src/mirall/folderstatusmodel.h +++ b/src/mirall/folderstatusmodel.h @@ -45,6 +45,8 @@ class FolderStatusDelegate : public QStyledItemDelegate FolderSyncEnabled, FolderStatusIconRole, SyncFileName, + SyncFileKind, + SyncFileProgressString, // stuff like Currently ... or Finished... SyncProgressPercent1, SyncProgressPercent2, SyncProgressBytes1,