From 30f6fb00062b6cb9da106ccdc2dab600293fe927 Mon Sep 17 00:00:00 2001 From: Nils Fenner Date: Tue, 7 Apr 2015 19:14:23 +0200 Subject: [PATCH 1/7] Repository Module: reimplemented CloneDlg that inherits ExpandableDlg --- Modules/Repository/CMakeLists.txt | 11 +- Modules/Repository/CloneOptionsWdgt.cpp | 33 ---- Modules/Repository/CloneOptionsWdgt.hpp | 34 ---- Modules/Repository/CloneRepositoryDlg.cpp | 136 +++++++------ ...RepositoryDlg.h => CloneRepositoryDlg.hpp} | 77 ++++++-- Modules/Repository/CloneRepositoryDlg.ui | 183 +++++------------- Modules/Repository/RepositoryModule.cpp | 4 +- 7 files changed, 186 insertions(+), 292 deletions(-) rename Modules/Repository/{CloneRepositoryDlg.h => CloneRepositoryDlg.hpp} (53%) diff --git a/Modules/Repository/CMakeLists.txt b/Modules/Repository/CMakeLists.txt index 4960338b..4c5f64b8 100644 --- a/Modules/Repository/CMakeLists.txt +++ b/Modules/Repository/CMakeLists.txt @@ -16,9 +16,8 @@ SET( SRC_FILES RepoTreeView.cpp RepositoryContext.cpp - CreateRepositoryDlg.cpp CloneRepositoryDlg.cpp - CloneOptionsWdgt.cpp + CreateRepositoryDlg.cpp ProgressDlg.cpp ) @@ -30,18 +29,16 @@ SET( HDR_FILES RepoTreeView.hpp RepositoryContext.hpp + CloneRepositoryDlg.hpp CreateRepositoryDlg.h - CloneRepositoryDlg.h - CloneOptionsWdgt.hpp ProgressDlg.hpp ) SET( UI_FILES - CreateRepositoryDlg.ui - CloneRepositoryDlg.ui CloneOptionsWdgt.ui - ProgressDlg.ui + CloneRepositoryDlg.ui + CreateRepositoryDlg.ui ) SET( HID_FILES diff --git a/Modules/Repository/CloneOptionsWdgt.cpp b/Modules/Repository/CloneOptionsWdgt.cpp index f596a257..e69de29b 100644 --- a/Modules/Repository/CloneOptionsWdgt.cpp +++ b/Modules/Repository/CloneOptionsWdgt.cpp @@ -1,33 +0,0 @@ -#include "CloneOptionsWdgt.hpp" - -#include - - -CloneOptionsWdgt::CloneOptionsWdgt(QWidget *parent) : - QWidget(parent) -{ - setupUi(this); - - // margin is controlled by the parent widget's layout - layout()->setMargin(0); -} - -CloneOptionsWdgt::~CloneOptionsWdgt() -{ -} - -void CloneOptionsWdgt::on_txtCloneMode_currentIndexChanged(int index) -{ - // Note: clone modes are fixed - mCloneMode = static_cast( index ); - grpSubmodules->setEnabled( mCloneMode == cmCheckout ); -} - -void CloneOptionsWdgt::on_chkInitSubmodules_toggled(bool checked) -{ - chkSubmodulesRecursive->setEnabled( checked ); - if( !checked ) - { - chkSubmodulesRecursive->setChecked( false ); - } -} diff --git a/Modules/Repository/CloneOptionsWdgt.hpp b/Modules/Repository/CloneOptionsWdgt.hpp index c96d6594..8b137891 100644 --- a/Modules/Repository/CloneOptionsWdgt.hpp +++ b/Modules/Repository/CloneOptionsWdgt.hpp @@ -1,35 +1 @@ -#ifndef UICLONEOPTIONS_HPP -#define UICLONEOPTIONS_HPP -#include - -#include "ui_CloneOptionsWdgt.h" - - -class CloneOptionsWdgt : public QWidget, Ui::CloneOptionsWdgt -{ - Q_OBJECT - - friend class CloneRepositoryDlg; - -public: - enum CloneMode { - cmCheckout = 0, - cmBare, - cmMirror - }; - -public: - explicit CloneOptionsWdgt(QWidget *parent = 0); - ~CloneOptionsWdgt(); - -private slots: - void on_txtCloneMode_currentIndexChanged(int index); - - void on_chkInitSubmodules_toggled(bool checked); - -private: - CloneMode mCloneMode; -}; - -#endif // UICLONEOPTIONS_HPP diff --git a/Modules/Repository/CloneRepositoryDlg.cpp b/Modules/Repository/CloneRepositoryDlg.cpp index ed59a40e..0ba9dec6 100644 --- a/Modules/Repository/CloneRepositoryDlg.cpp +++ b/Modules/Repository/CloneRepositoryDlg.cpp @@ -1,6 +1,9 @@ /* * MacGitver - * Copyright (C) 2012 Sascha Cunz + * Copyright (C) 2015 The MacGitver-Developers + * + * (C) Sascha Cunz + * (C) Nils Fenner * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License (Version 2) as published by the Free Software Foundation. @@ -14,8 +17,7 @@ * */ -#include -#include +#include "CloneRepositoryDlg.hpp" #include "libMacGitverCore/Config/Config.h" @@ -23,22 +25,42 @@ #include "libMacGitverCore/App/MacGitver.hpp" -#include "CloneRepositoryDlg.h" -#include "CloneOptionsWdgt.hpp" +#include +#include #include "ProgressDlg.hpp" -CloneRepositoryDlg::CloneRepositoryDlg() - : mProgress( NULL ) + +CloneOptionsWdgt::CloneOptionsWdgt() { - setupUi( this ); + setupUi(this); +} - connect( btnBrowseTo, SIGNAL(clicked()), SLOT(onBrowse()) ); - connect( txtPath, SIGNAL(textChanged(QString)), SLOT(checkValid()) ); +void CloneOptionsWdgt::on_txtCloneMode_currentIndexChanged(int index) +{ + // Note: clone modes are fixed + mCloneMode = static_cast( index ); + grpSubmodules->setEnabled( mCloneMode == cmCheckout ); +} - checkValid(); +void CloneOptionsWdgt::on_chkInitSubmodules_toggled(bool checked) +{ + chkSubmodulesRecursive->setEnabled( checked ); + if( !checked ) + { + chkSubmodulesRecursive->setChecked( false ); + } } -void CloneRepositoryDlg::onBrowse() + +CloneWdgt::CloneWdgt() +{ + setupUi( this ); + + connect(btnBrowseTo, &QAbstractButton::clicked, + this, &CloneWdgt::onBrowse); +} + +void CloneWdgt::onBrowse() { QString fn = txtPath->text(); if( fn.isEmpty() ) @@ -59,7 +81,7 @@ void CloneRepositoryDlg::onBrowse() fd->open( this, SLOT(onBrowseHelper(QString)) ); } -void CloneRepositoryDlg::onBrowseHelper( const QString& directory ) +void CloneWdgt::onBrowseHelper( const QString& directory ) { if( directory.isEmpty() ) { @@ -70,12 +92,30 @@ void CloneRepositoryDlg::onBrowseHelper( const QString& directory ) txtPath->setText( directory ); } -void CloneRepositoryDlg::checkValid() + +CloneDlg::CloneDlg() + : mCloneWdgt(new CloneWdgt) + , mCloneOptsWdgt(new CloneOptionsWdgt) { - bool okay = !txtPath->text().isEmpty() && - !txtUrl->text().isEmpty(); + setDialogWidgets(mCloneWdgt, mCloneOptsWdgt); + + connect(mCloneWdgt->txtPath, &QLineEdit::textChanged, + this, &CloneDlg::checkValid); - QDir wanted( QDir::toNativeSeparators( txtPath->text() ) ); + checkValid(); +} + +void CloneDlg::checkValid() +{ + if (!mCloneWdgt) { + setAcceptable(false); + return; + } + + bool okay = !mCloneWdgt->txtPath->text().isEmpty() && + !mCloneWdgt->txtUrl->text().isEmpty(); + + QDir wanted( QDir::toNativeSeparators( mCloneWdgt->txtPath->text() ) ); if( wanted.exists() ) { QStringList sl = wanted.entryList( QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot ); @@ -85,16 +125,20 @@ void CloneRepositoryDlg::checkValid() } } - buttonBox->button( QDialogButtonBox::Ok )->setEnabled( okay ); + setAcceptable( okay ); } -void CloneRepositoryDlg::accept() +void CloneDlg::accept() { Git::CloneOperation* clone = new Git::CloneOperation( this ); - QString repoName = QUrl( txtUrl->text() ).adjusted( QUrl::NormalizePathSegments | QUrl::StripTrailingSlash ).toString(); - QString targetDir = QUrl( txtPath->text() ).adjusted( QUrl::NormalizePathSegments | QUrl::StripTrailingSlash ).toString(); - - if ( chkAppendRepoName->isChecked() ) + QString repoName = QUrl(mCloneWdgt->txtUrl->text() ) + .adjusted(QUrl::NormalizePathSegments | + QUrl::StripTrailingSlash ).toString(); + QString targetDir = QUrl(mCloneWdgt->txtPath->text() ) + .adjusted(QUrl::NormalizePathSegments | + QUrl::StripTrailingSlash ).toString(); + + if ( mCloneWdgt->chkAppendRepoName->isChecked() ) { targetDir += QString::fromUtf8("/%1") .arg( QUrl( repoName ).fileName() ); @@ -103,13 +147,13 @@ void CloneRepositoryDlg::accept() clone->setBackgroundMode( true ); clone->setUrl( repoName ); clone->setPath( targetDir ); - clone->setRemoteAlias( txtRemoteAlias->text() ); + clone->setRemoteAlias( mCloneWdgt->txtRemoteAlias->text() ); - if ( mCloneOpts ) + if ( mCloneOptsWdgt ) { - clone->setBare( mCloneOpts->mCloneMode == CloneOptionsWdgt::cmBare ); - clone->setReference( mCloneOpts->txtBranch->text() ); - clone->setDepth( mCloneOpts->txtCloneDepth->value() ); + clone->setBare( mCloneOptsWdgt->mCloneMode == CloneOptionsWdgt::cmBare ); + clone->setReference( mCloneOptsWdgt->txtBranch->text() ); + clone->setDepth( mCloneOptsWdgt->txtCloneDepth->value() ); } mProgress = new ProgressDlg; @@ -140,7 +184,7 @@ void CloneRepositoryDlg::accept() clone->execute(); } -void CloneRepositoryDlg::beginDownloading() +void CloneDlg::beginDownloading() { disconnect( sender(), SIGNAL(transportProgress(quint32,quint32,quint32,quint64)), this, SLOT(beginDownloading()) ); @@ -151,13 +195,13 @@ void CloneRepositoryDlg::beginDownloading() updateAction(); } -void CloneRepositoryDlg::doneDownload() +void CloneDlg::doneDownload() { mStates[ Download ] = Done; updateAction(); } -void CloneRepositoryDlg::doneIndexing() +void CloneDlg::doneIndexing() { mStates[ Index ] = Done; @@ -167,13 +211,13 @@ void CloneRepositoryDlg::doneIndexing() updateAction(); } -void CloneRepositoryDlg::doneCheckout() +void CloneDlg::doneCheckout() { mStates[ Checkout ] = Done; updateAction(); } -void CloneRepositoryDlg::rootCloneFinished() +void CloneDlg::rootCloneFinished() { Git::BaseOperation* operation = static_cast( sender() ); Q_ASSERT( operation ); @@ -189,7 +233,7 @@ void CloneRepositoryDlg::rootCloneFinished() mProgress->reject(); } -void CloneRepositoryDlg::updateAction() +void CloneDlg::updateAction() { QStringList open, current, done; @@ -213,27 +257,3 @@ void CloneRepositoryDlg::updateAction() mProgress->setAction( mAction, open, current, done ); } - -void CloneRepositoryDlg::on_btnCloneopts_toggled(bool checked) -{ - if ( checked ) - { - if ( !mCloneOpts ) - { - mCloneOpts = new CloneOptionsWdgt(); - } - - optsLayout->addWidget( mCloneOpts ); - mCloneOpts->show(); - } - else - { - optsLayout->removeWidget( mCloneOpts ); - if ( mCloneOpts ) - { - mCloneOpts->hide(); - } - layout()->activate(); - resize( width(), minimumSizeHint().height() ); - } -} diff --git a/Modules/Repository/CloneRepositoryDlg.h b/Modules/Repository/CloneRepositoryDlg.hpp similarity index 53% rename from Modules/Repository/CloneRepositoryDlg.h rename to Modules/Repository/CloneRepositoryDlg.hpp index 0599c13e..4d569422 100644 --- a/Modules/Repository/CloneRepositoryDlg.h +++ b/Modules/Repository/CloneRepositoryDlg.hpp @@ -1,6 +1,9 @@ /* * MacGitver - * Copyright (C) 2012 Sascha Cunz + * Copyright (C) 2015 The MacGitver-Developers + * + * (C) Sascha Cunz + * (C) Nils Fenner * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License (Version 2) as published by the Free Software Foundation. @@ -14,28 +17,70 @@ * */ -#ifndef CLONE_REPOSITORY_DLG_H -#define CLONE_REPOSITORY_DLG_H +#pragma once + +#include "libMacGitverCore/Widgets/ExpandableDlg.hpp" -#include "ui_CloneRepositoryDlg.h" +#include "ui_CloneWdgt.h" +#include "ui_CloneOptionsWdgt.h" #include class ProgressDlg; -class CloneOptionsWdgt; -class CloneRepositoryDlg : public QDialog, Ui::CloneRepositoryDlg +class CloneOptionsWdgt : public QWidget, Ui::CloneOptionsWdgt { Q_OBJECT + + friend class CloneDlg; + public: - CloneRepositoryDlg(); + enum CloneMode { + cmCheckout = 0, + cmBare, + cmMirror + }; -protected: - void accept(); +public: + CloneOptionsWdgt(); + +private slots: + void on_txtCloneMode_currentIndexChanged(int index); + void on_chkInitSubmodules_toggled(bool checked); + +private: + CloneMode mCloneMode; +}; + +class CloneWdgt : public QWidget, Ui::CloneWdgt +{ + Q_OBJECT + + friend class CloneDlg; + +public: + CloneWdgt(); private slots: void onBrowse(); void onBrowseHelper( const QString& directory ); +}; + +class CloneDlg : public ExpandableDlg +{ + Q_OBJECT + +private: + enum State { Unused, Open, Done, Current }; + enum Tasks { Prepare, Download, Index, Checkout }; + +public: + CloneDlg(); + +protected: + void accept(); + +private slots: void checkValid(); void beginDownloading(); @@ -44,22 +89,14 @@ private slots: void doneCheckout(); void rootCloneFinished(); - void on_btnCloneopts_toggled(bool checked); - -private: - enum State { Unused, Open, Done, Current }; - enum Tasks { Prepare, Download, Index, Checkout }; - private: void updateAction(); private: - QPointer mCloneOpts; - - ProgressDlg* mProgress; + ProgressDlg* mProgress = nullptr; QString mAction; QHash< Tasks, State > mStates; + QPointer mCloneWdgt; + QPointer mCloneOptsWdgt; }; - -#endif diff --git a/Modules/Repository/CloneRepositoryDlg.ui b/Modules/Repository/CloneRepositoryDlg.ui index 79b596c8..6e5b7d24 100644 --- a/Modules/Repository/CloneRepositoryDlg.ui +++ b/Modules/Repository/CloneRepositoryDlg.ui @@ -1,44 +1,44 @@ - CloneRepositoryDlg - + CloneWdgt + 0 0 - 602 - 107 + 518 + 70 - Clone repository - - - true + Form - - + + + + + 0 + 0 + + - Clone Options + From: - - true + + txtUrl - - - - Append repository name - - + + + true - - + + 0 @@ -46,48 +46,34 @@ - To: + Alias: - txtPath + txtRemoteAlias - - + + - + 0 0 - - true - - - - - - ... + - - - - - - - 0 - 0 - + + origin true - - + + 0 @@ -95,78 +81,37 @@ - From: + To: - txtUrl + txtPath - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + true - - - - 0 - - - - - - - - 0 - 0 - - + + - Alias: - - - txtRemoteAlias + ... - - - - - 0 - 0 - - + + - - - - origin + Append repository name - + true - - - - Qt::Horizontal - - - - 40 - 20 - - - - @@ -176,44 +121,6 @@
libMacGitverCore/Widgets/LineEdit.h
- - txtUrl - txtPath - chkAppendRepoName - - - - buttonBox - accepted() - CloneRepositoryDlg - accept() - - - 222 - 342 - - - 157 - 274 - - - - - buttonBox - rejected() - CloneRepositoryDlg - reject() - - - 290 - 348 - - - 286 - 274 - - - - +
diff --git a/Modules/Repository/RepositoryModule.cpp b/Modules/Repository/RepositoryModule.cpp index a77bd736..21a135b7 100644 --- a/Modules/Repository/RepositoryModule.cpp +++ b/Modules/Repository/RepositoryModule.cpp @@ -28,7 +28,7 @@ #include "RepositoryModule.h" #include "RepoTreeView.hpp" -#include "CloneRepositoryDlg.h" +#include "CloneRepositoryDlg.hpp" #include "CreateRepositoryDlg.h" RepositoryModule::RepositoryModule() @@ -132,7 +132,7 @@ void RepositoryModule::onRepositoryOpenHelper() void RepositoryModule::onRepositoryClone() { - CloneRepositoryDlg().exec(); + CloneDlg().exec(); } void RepositoryModule::onRecentRepositoryOpen( const QVariant& path ) From dea78a60cd95ece6c3ac24b56be3385a1f407d37 Mon Sep 17 00:00:00 2001 From: Nils Fenner Date: Mon, 6 Apr 2015 17:29:55 +0200 Subject: [PATCH 2/7] moved progress dialog (ProgressDlg) to libMacGitverCore with required minor changes The progress dialog can now be called from the MGV-Core API. --- Libs/libMacGitverCore/CMakeLists.txt | 3 ++ .../libMacGitverCore/Widgets}/ProgressDlg.cpp | 36 +++++++++++-------- .../libMacGitverCore/Widgets}/ProgressDlg.hpp | 20 ++++++----- .../libMacGitverCore/Widgets}/ProgressDlg.ui | 31 +++++++++++----- Modules/Repository/CMakeLists.txt | 4 --- Modules/Repository/CloneRepositoryDlg.cpp | 2 +- 6 files changed, 59 insertions(+), 37 deletions(-) rename {Modules/Repository => Libs/libMacGitverCore/Widgets}/ProgressDlg.cpp (82%) rename {Modules/Repository => Libs/libMacGitverCore/Widgets}/ProgressDlg.hpp (78%) rename {Modules/Repository => Libs/libMacGitverCore/Widgets}/ProgressDlg.ui (86%) diff --git a/Libs/libMacGitverCore/CMakeLists.txt b/Libs/libMacGitverCore/CMakeLists.txt index c038c1a4..a15f7921 100644 --- a/Libs/libMacGitverCore/CMakeLists.txt +++ b/Libs/libMacGitverCore/CMakeLists.txt @@ -61,6 +61,7 @@ SET( SRC_FILES Widgets/FlatTreeComboBox.cpp Widgets/FlatTreeModel.cpp Widgets/FlatTreeDelegate.cpp + Widgets/ProgressDlg.cpp Widgets/SHA1Input.cpp Widgets/ShortCommitModel.cpp Widgets/RepoStateWidget.cpp @@ -114,6 +115,7 @@ SET( PUB_HDR_FILES Widgets/FlatTreeComboBox.h Widgets/FlatTreeModel.h Widgets/FlatTreeDelegate.h + Widgets/ProgressDlg.hpp Widgets/SHA1Input.h Widgets/ShortCommitModel.h Widgets/TreeViewCtxMenu.hpp @@ -161,6 +163,7 @@ SET( UI_FILES RepoMan/Config/RepoManConfigPage.ui Widgets/ExpandableDlg.ui + Widgets/ProgressDlg.ui ) SET( HID_FILES diff --git a/Modules/Repository/ProgressDlg.cpp b/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp similarity index 82% rename from Modules/Repository/ProgressDlg.cpp rename to Libs/libMacGitverCore/Widgets/ProgressDlg.cpp index 832e0862..3bbeb34e 100644 --- a/Modules/Repository/ProgressDlg.cpp +++ b/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp @@ -1,28 +1,34 @@ +#include "ProgressDlg.hpp" +#include "ui_ProgressDlg.h" + #include #include #include #include #include -#include "ProgressDlg.hpp" - ProgressDlg::ProgressDlg() : BlueSky::Dialog() + , ui( new Ui::ProgressDlg ) , mDone( false ) { - setupUi( this ); + ui->setupUi( this ); - QPushButton* close = buttonBox->button( QDialogButtonBox::Close ); + QPushButton* close = ui->buttonBox->button( QDialogButtonBox::Close ); close->setEnabled( false ); - connect( close, SIGNAL(clicked()), this, SLOT(close ()) ); + connect( close, &QPushButton::clicked, this, &ProgressDlg::close ); QPalette p; p.setColor( QPalette::Base, p.color( QPalette::Window ) ); p.setColor( QPalette::Text, p.color( QPalette::WindowText ) ); - txtLog->setPalette( p ); + ui->txtLog->setPalette( p ); +} +ProgressDlg::~ProgressDlg() +{ + delete ui; } void ProgressDlg::setAction( const QString& action, @@ -47,7 +53,7 @@ void ProgressDlg::setAction( const QString& action, act += QStringLiteral( " (" ) % s % QStringLiteral( ")" ); } - lblAction->setText( act ); + ui->lblAction->setText( act ); } void ProgressDlg::setCurrent(QObject* current) @@ -93,10 +99,10 @@ void ProgressDlg::transportProgress( quint32 totalObjects, { recv = QString::number( receivedBytes ); } - lblTransferSize->setText( recv ); + ui->lblTransferSize->setText( recv ); - progressBar->setRange( 0, totalObjects * 2 ); - progressBar->setValue( indexedObjects + receivedObjects ); + ui->progressBar->setRange( 0, totalObjects * 2 ); + ui->progressBar->setValue( indexedObjects + receivedObjects ); } void ProgressDlg::remoteMessage( const QString& msg ) @@ -133,25 +139,25 @@ void ProgressDlg::remoteMessage( const QString& msg ) QString log = mBaseLog % QStringLiteral( "
" ) % output.replace( QChar( L'\n' ), QLatin1String("
") ).simplified(); - txtLog->setHtml( log ); + ui->txtLog->setHtml( log ); } void ProgressDlg::beginStep( const QString& step ) { mBaseLog += tr( "%1
" ).arg( step ); - txtLog->setHtml( mBaseLog ); + ui->txtLog->setHtml( mBaseLog ); } void ProgressDlg::finalizeStep() { - mBaseLog = txtLog->toHtml() % QStringLiteral( "
" ); + mBaseLog = ui->txtLog->toHtml() % QStringLiteral( "
" ); mRawRemoteMessage = QString(); - txtLog->setHtml( mBaseLog ); + ui->txtLog->setHtml( mBaseLog ); } void ProgressDlg::setDone() { mDone = true; - buttonBox->button( QDialogButtonBox::Close )->setEnabled( true ); + ui->buttonBox->button( QDialogButtonBox::Close )->setEnabled( true ); } diff --git a/Modules/Repository/ProgressDlg.hpp b/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp similarity index 78% rename from Modules/Repository/ProgressDlg.hpp rename to Libs/libMacGitverCore/Widgets/ProgressDlg.hpp index 7b1ecd69..12354d9e 100644 --- a/Modules/Repository/ProgressDlg.hpp +++ b/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp @@ -1,19 +1,20 @@ -#ifndef MODREPO_PROGRESS_DLG_HPP -#define MODREPO_PROGRESS_DLG_HPP +#pragma once +#include "libMacGitverCore/MacGitverApi.hpp" #include "libBlueSky/Dialog.hpp" -#include "ui_ProgressDlg.h" - +namespace Ui +{ + class ProgressDlg; +}; -class ProgressDlg - : public BlueSky::Dialog - , private Ui::ProgressDlg +class MGV_CORE_API ProgressDlg : public BlueSky::Dialog { Q_OBJECT public: ProgressDlg(); + ~ProgressDlg(); public: void setAction( const QString& action, const QStringList& open, @@ -33,11 +34,12 @@ private slots: protected: void closeEvent( QCloseEvent* ev ); +private: + Ui::ProgressDlg* ui; + private: bool mDone; QString mBaseLog; QObject* mCurrent; QString mRawRemoteMessage; }; - -#endif diff --git a/Modules/Repository/ProgressDlg.ui b/Libs/libMacGitverCore/Widgets/ProgressDlg.ui similarity index 86% rename from Modules/Repository/ProgressDlg.ui rename to Libs/libMacGitverCore/Widgets/ProgressDlg.ui index c2670eb4..19bf883d 100644 --- a/Modules/Repository/ProgressDlg.ui +++ b/Libs/libMacGitverCore/Widgets/ProgressDlg.ui @@ -22,9 +22,6 @@ Progress - - false - true @@ -57,7 +54,16 @@ QLayout::SetDefaultConstraint - + + 0 + + + 0 + + + 0 + + 0 @@ -85,15 +91,24 @@ Current operation + + 3 + + + 3 + + + 3 + + + 3 + - -1 + 6 2 - - 3 - diff --git a/Modules/Repository/CMakeLists.txt b/Modules/Repository/CMakeLists.txt index 4c5f64b8..4c5cde03 100644 --- a/Modules/Repository/CMakeLists.txt +++ b/Modules/Repository/CMakeLists.txt @@ -18,7 +18,6 @@ SET( SRC_FILES CloneRepositoryDlg.cpp CreateRepositoryDlg.cpp - ProgressDlg.cpp ) SET( HDR_FILES @@ -31,13 +30,11 @@ SET( HDR_FILES CloneRepositoryDlg.hpp CreateRepositoryDlg.h - ProgressDlg.hpp ) SET( UI_FILES CloneOptionsWdgt.ui - CloneRepositoryDlg.ui CreateRepositoryDlg.ui ) @@ -60,4 +57,3 @@ ADD_MGV_MODULE( ${UIC_FILES} ${UI_FILES} ${HIC_FILES} ${HID_FILES} ) - diff --git a/Modules/Repository/CloneRepositoryDlg.cpp b/Modules/Repository/CloneRepositoryDlg.cpp index 0ba9dec6..dd6dfd7f 100644 --- a/Modules/Repository/CloneRepositoryDlg.cpp +++ b/Modules/Repository/CloneRepositoryDlg.cpp @@ -24,10 +24,10 @@ #include "libGitWrap/Operations/CloneOperation.hpp" #include "libMacGitverCore/App/MacGitver.hpp" +#include "libMacGitverCore/Widgets/ProgressDlg.hpp" #include #include -#include "ProgressDlg.hpp" CloneOptionsWdgt::CloneOptionsWdgt() From c6bf612d7981ed970a04ba7f2a148abfb63f2c47 Mon Sep 17 00:00:00 2001 From: Nils Fenner Date: Wed, 8 Apr 2015 16:00:13 +0200 Subject: [PATCH 3/7] Remotes Module / Repository Module: moved clone action to "Remotes" module --- Libs/libMacGitverCore/App/MgvPrimaryWindowActions.hid | 2 ++ Modules/Remotes/CMakeLists.txt | 5 ++++- Modules/{Repository => Remotes}/CloneOptionsWdgt.ui | 0 Modules/{Repository => Remotes}/CloneRepositoryDlg.cpp | 0 Modules/{Repository => Remotes}/CloneRepositoryDlg.hpp | 0 .../CloneRepositoryDlg.ui => Remotes/CloneWdgt.ui} | 0 Modules/Remotes/RemotesModule.cpp | 7 +++++++ Modules/Remotes/RemotesModule.h | 4 ++++ Modules/Remotes/RemotesModuleActions.hid | 9 +++++++++ Modules/Repository/CMakeLists.txt | 3 --- Modules/Repository/CloneOptionsWdgt.cpp | 0 Modules/Repository/CloneOptionsWdgt.hpp | 1 - Modules/Repository/RepositoryModule.cpp | 6 ------ Modules/Repository/RepositoryModule.h | 1 - Modules/Repository/RepositoryModule.hid | 8 +------- 15 files changed, 27 insertions(+), 19 deletions(-) rename Modules/{Repository => Remotes}/CloneOptionsWdgt.ui (100%) rename Modules/{Repository => Remotes}/CloneRepositoryDlg.cpp (100%) rename Modules/{Repository => Remotes}/CloneRepositoryDlg.hpp (100%) rename Modules/{Repository/CloneRepositoryDlg.ui => Remotes/CloneWdgt.ui} (100%) delete mode 100644 Modules/Repository/CloneOptionsWdgt.cpp delete mode 100644 Modules/Repository/CloneOptionsWdgt.hpp diff --git a/Libs/libMacGitverCore/App/MgvPrimaryWindowActions.hid b/Libs/libMacGitverCore/App/MgvPrimaryWindowActions.hid index 11a375b5..059a9ef6 100644 --- a/Libs/libMacGitverCore/App/MgvPrimaryWindowActions.hid +++ b/Libs/libMacGitverCore/App/MgvPrimaryWindowActions.hid @@ -26,7 +26,9 @@ Ui MgvPrimaryWindowActions { StatusToolTip "Repository related functions."; MergePlace RepositoryMenuMP; + Separator; + MergePlace CloneMP; Separator; Action RepositoryQuit { diff --git a/Modules/Remotes/CMakeLists.txt b/Modules/Remotes/CMakeLists.txt index f76cf72a..180ea75d 100644 --- a/Modules/Remotes/CMakeLists.txt +++ b/Modules/Remotes/CMakeLists.txt @@ -10,7 +10,7 @@ INCLUDE_DIRECTORIES( BEFORE SET( SRC_FILES - RemotesModule.cpp + CloneRepositoryDlg.cpp RemotesView.cpp RemotesViewContext.cpp RemoteCreateEditDlg.cpp @@ -18,6 +18,7 @@ SET( SRC_FILES SET( HDR_FILES + CloneRepositoryDlg.hpp RemotesModule.h RemotesView.h RemotesViewContext.h @@ -27,6 +28,8 @@ SET( HDR_FILES SET( UI_FILES RemoteCreateEditDlg.ui + CloneOptionsWdgt.ui + CloneWdgt.ui ) SET( HID_FILES diff --git a/Modules/Repository/CloneOptionsWdgt.ui b/Modules/Remotes/CloneOptionsWdgt.ui similarity index 100% rename from Modules/Repository/CloneOptionsWdgt.ui rename to Modules/Remotes/CloneOptionsWdgt.ui diff --git a/Modules/Repository/CloneRepositoryDlg.cpp b/Modules/Remotes/CloneRepositoryDlg.cpp similarity index 100% rename from Modules/Repository/CloneRepositoryDlg.cpp rename to Modules/Remotes/CloneRepositoryDlg.cpp diff --git a/Modules/Repository/CloneRepositoryDlg.hpp b/Modules/Remotes/CloneRepositoryDlg.hpp similarity index 100% rename from Modules/Repository/CloneRepositoryDlg.hpp rename to Modules/Remotes/CloneRepositoryDlg.hpp diff --git a/Modules/Repository/CloneRepositoryDlg.ui b/Modules/Remotes/CloneWdgt.ui similarity index 100% rename from Modules/Repository/CloneRepositoryDlg.ui rename to Modules/Remotes/CloneWdgt.ui diff --git a/Modules/Remotes/RemotesModule.cpp b/Modules/Remotes/RemotesModule.cpp index 05e7d295..1a9ff351 100644 --- a/Modules/Remotes/RemotesModule.cpp +++ b/Modules/Remotes/RemotesModule.cpp @@ -19,6 +19,7 @@ #include "libMacGitverCore/App/MacGitver.hpp" +#include "CloneRepositoryDlg.hpp" #include "RemoteCreateEditDlg.h" #include "RemotesModule.h" #include "RemotesView.h" @@ -35,6 +36,7 @@ BlueSky::View* RemotesModule::createRemotesView() void RemotesModule::initialize() { setupActions( this ); + acCloneAC->mergeInto( "CloneMP" ); acRemotesAC->mergeInto( "RemotesMP" ); MacGitver::self().registerView( "Remotes", tr( "Remotes" ), @@ -46,6 +48,11 @@ void RemotesModule::deinitialize() MacGitver::self().unregisterView( "Remotes" ); } +void RemotesModule::onClone() +{ + CloneDlg().exec(); +} + void RemotesModule::onRemoteCreate() { RemoteCreateEditDlg().exec(); diff --git a/Modules/Remotes/RemotesModule.h b/Modules/Remotes/RemotesModule.h index fd72b521..c1aefc09 100644 --- a/Modules/Remotes/RemotesModule.h +++ b/Modules/Remotes/RemotesModule.h @@ -37,6 +37,10 @@ class RemotesModule : public Module, public RemotesModuleActions private: static BlueSky::View* createRemotesView(); +private slots: + // CloneAC + void onClone(); + private slots: void onRemoteCreate(); }; diff --git a/Modules/Remotes/RemotesModuleActions.hid b/Modules/Remotes/RemotesModuleActions.hid index 4f7ffe4a..26987603 100644 --- a/Modules/Remotes/RemotesModuleActions.hid +++ b/Modules/Remotes/RemotesModuleActions.hid @@ -19,6 +19,15 @@ Ui RemotesModuleActions { Container RemotesAC { Menu Remotes { + Container CloneAC { + + Action Clone { + Text "&Clone..."; + _ConnectTo onClone(); + }; + + }; + Text "R&emotes"; diff --git a/Modules/Repository/CMakeLists.txt b/Modules/Repository/CMakeLists.txt index 4c5cde03..f7bb8142 100644 --- a/Modules/Repository/CMakeLists.txt +++ b/Modules/Repository/CMakeLists.txt @@ -16,7 +16,6 @@ SET( SRC_FILES RepoTreeView.cpp RepositoryContext.cpp - CloneRepositoryDlg.cpp CreateRepositoryDlg.cpp ) @@ -28,13 +27,11 @@ SET( HDR_FILES RepoTreeView.hpp RepositoryContext.hpp - CloneRepositoryDlg.hpp CreateRepositoryDlg.h ) SET( UI_FILES - CloneOptionsWdgt.ui CreateRepositoryDlg.ui ) diff --git a/Modules/Repository/CloneOptionsWdgt.cpp b/Modules/Repository/CloneOptionsWdgt.cpp deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/Repository/CloneOptionsWdgt.hpp b/Modules/Repository/CloneOptionsWdgt.hpp deleted file mode 100644 index 8b137891..00000000 --- a/Modules/Repository/CloneOptionsWdgt.hpp +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Modules/Repository/RepositoryModule.cpp b/Modules/Repository/RepositoryModule.cpp index 21a135b7..df1b7e5e 100644 --- a/Modules/Repository/RepositoryModule.cpp +++ b/Modules/Repository/RepositoryModule.cpp @@ -28,7 +28,6 @@ #include "RepositoryModule.h" #include "RepoTreeView.hpp" -#include "CloneRepositoryDlg.hpp" #include "CreateRepositoryDlg.h" RepositoryModule::RepositoryModule() @@ -130,11 +129,6 @@ void RepositoryModule::onRepositoryOpenHelper() // repo.isBare() ? repoDir : repo.basePath() ); } -void RepositoryModule::onRepositoryClone() -{ - CloneDlg().exec(); -} - void RepositoryModule::onRecentRepositoryOpen( const QVariant& path ) { QString repoPath = path.toString(); diff --git a/Modules/Repository/RepositoryModule.h b/Modules/Repository/RepositoryModule.h index ac7086b2..d0799ca4 100644 --- a/Modules/Repository/RepositoryModule.h +++ b/Modules/Repository/RepositoryModule.h @@ -57,7 +57,6 @@ class RepositoryModule private slots: void onRepositoryCreate(); - void onRepositoryClone(); void onRepositoryOpen(); void onRecentRepositoryOpen( const QVariant& path ); diff --git a/Modules/Repository/RepositoryModule.hid b/Modules/Repository/RepositoryModule.hid index 96b7a472..92778f6f 100644 --- a/Modules/Repository/RepositoryModule.hid +++ b/Modules/Repository/RepositoryModule.hid @@ -25,11 +25,6 @@ Ui RepositoryActions { ConnectTo onRepositoryOpen(); }; - Action RepositoryClone { - Text "&Clone..."; - ConnectTo onRepositoryClone(); - }; - Action RepositoryCreate { Text "&New..."; Shortcut "Ctrl+N"; @@ -45,11 +40,10 @@ Ui RepositoryActions { Container RepositoryMenuAC { + Action RepositoryCreate; Action RepositoryOpen; Menu RepoOpenRecent; Separator; - Action RepositoryCreate; - Action RepositoryClone; }; From 58985c3eb4437a061b917c8de6538edccac0dd1b Mon Sep 17 00:00:00 2001 From: Nils Fenner Date: Tue, 21 Apr 2015 14:41:48 +0200 Subject: [PATCH 4/7] add ProgressWdgt, preparing for unified progress dialog The ProgressWdgt is going to be used internally by ProgressDlg to represent a single activity or step. --- Libs/libMacGitverCore/CMakeLists.txt | 2 + Libs/libMacGitverCore/Widgets/ProgressDlg.cpp | 29 ++++++++++++++ Libs/libMacGitverCore/Widgets/ProgressDlg.hpp | 12 ++++++ Libs/libMacGitverCore/Widgets/ProgressWdgt.ui | 38 +++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 Libs/libMacGitverCore/Widgets/ProgressWdgt.ui diff --git a/Libs/libMacGitverCore/CMakeLists.txt b/Libs/libMacGitverCore/CMakeLists.txt index a15f7921..84c86ad9 100644 --- a/Libs/libMacGitverCore/CMakeLists.txt +++ b/Libs/libMacGitverCore/CMakeLists.txt @@ -164,6 +164,8 @@ SET( UI_FILES Widgets/ExpandableDlg.ui Widgets/ProgressDlg.ui + + Widgets/ProgressWdgt.ui ) SET( HID_FILES diff --git a/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp b/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp index 3bbeb34e..2539d18d 100644 --- a/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp +++ b/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp @@ -1,6 +1,7 @@ #include "ProgressDlg.hpp" #include "ui_ProgressDlg.h" +#include "ui_ProgressWdgt.h" #include #include @@ -8,6 +9,34 @@ #include #include +namespace Private +{ + + class ProgressWdgt : public QWidget, public Ui::ProgressWdgt + { + public: + typedef QMap< QString, QPointer > Steps; + + enum Status { Running = 0, Stopped }; + + public: + ProgressWdgt(const QString& description) + { + setupUi(this); + progressBar->setMinimum(0); + progressBar->setMaximum(100); + txtHeader->setText( description ); + } + + public: + Steps mSteps; + Status mStatus = Running; + + qreal mPercentage = 0.; + }; + +} + ProgressDlg::ProgressDlg() : BlueSky::Dialog() diff --git a/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp b/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp index 12354d9e..b1e02a2e 100644 --- a/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp +++ b/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp @@ -4,6 +4,14 @@ #include "libMacGitverCore/MacGitverApi.hpp" #include "libBlueSky/Dialog.hpp" +#include +#include + +namespace Private +{ + class ProgressWdgt; +}; + namespace Ui { class ProgressDlg; @@ -12,6 +20,10 @@ namespace Ui class MGV_CORE_API ProgressDlg : public BlueSky::Dialog { Q_OBJECT + +public: + typedef QMap< QPointer, QPointer > Activities; + public: ProgressDlg(); ~ProgressDlg(); diff --git a/Libs/libMacGitverCore/Widgets/ProgressWdgt.ui b/Libs/libMacGitverCore/Widgets/ProgressWdgt.ui new file mode 100644 index 00000000..3b780075 --- /dev/null +++ b/Libs/libMacGitverCore/Widgets/ProgressWdgt.ui @@ -0,0 +1,38 @@ + + + ProgressWdgt + + + + 0 + 0 + 448 + 83 + + + + Progress + + + + + + Progress: + + + + + + + + + + Not started... + + + + + + + + From c412acccace1c4c5a78312ebfb3eda76c3f62a71 Mon Sep 17 00:00:00 2001 From: Nils Fenner Date: Tue, 21 Apr 2015 14:58:26 +0200 Subject: [PATCH 5/7] Clone: removed incompatible code to unified ProgressDlg --- Libs/libMacGitverCore/Widgets/ProgressDlg.hpp | 12 ---- Modules/Remotes/CloneRepositoryDlg.cpp | 56 +------------------ Modules/Remotes/CloneRepositoryDlg.hpp | 4 -- 3 files changed, 1 insertion(+), 71 deletions(-) diff --git a/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp b/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp index b1e02a2e..c767db57 100644 --- a/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp +++ b/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp @@ -29,19 +29,8 @@ class MGV_CORE_API ProgressDlg : public BlueSky::Dialog ~ProgressDlg(); public: - void setAction( const QString& action, const QStringList& open, - const QStringList& current, const QStringList& done ); - void setCurrent(QObject* current); -private slots: - void transportProgress( quint32 totalObjects, quint32 indexedObjects, - quint32 receivedObjects, quint64 receivedBytes ); - void remoteMessage( const QString& msg ); -public: - void setDone(); - void beginStep( const QString& step ); - void finalizeStep(); protected: void closeEvent( QCloseEvent* ev ); @@ -52,6 +41,5 @@ private slots: private: bool mDone; QString mBaseLog; - QObject* mCurrent; QString mRawRemoteMessage; }; diff --git a/Modules/Remotes/CloneRepositoryDlg.cpp b/Modules/Remotes/CloneRepositoryDlg.cpp index dd6dfd7f..09e1c7e4 100644 --- a/Modules/Remotes/CloneRepositoryDlg.cpp +++ b/Modules/Remotes/CloneRepositoryDlg.cpp @@ -158,7 +158,6 @@ void CloneDlg::accept() mProgress = new ProgressDlg; mProgress->show(); - mProgress->setCurrent( clone ); if( repoName.endsWith( QLatin1String( ".git" ) ) ) repoName = repoName.left( repoName.length() - 4 ); @@ -166,55 +165,21 @@ void CloneDlg::accept() if( repoName.lastIndexOf( QChar( L'/' ) ) != -1 ) repoName.remove( 0, repoName.lastIndexOf( QChar( L'/' ) ) + 1 ); - mAction = tr( "Cloning %1" ).arg( repoName ); - mProgress->beginStep( mAction ); - mStates.clear(); - mStates[ Prepare ] = Current; - mStates[ Download ] = Open; - mStates[ Index ] = Open; - mStates[ Checkout ] = Open; - updateAction(); - - connect( clone, SIGNAL(finished()), this, SLOT(rootCloneFinished()) ); - connect( clone, SIGNAL(transportProgress(quint32,quint32,quint32,quint64)), - this, SLOT(beginDownloading()) ); - connect( clone, SIGNAL(doneDownloading()), this, SLOT(doneDownload()) ); - connect( clone, SIGNAL(doneIndexing()), this, SLOT(doneIndexing()) ); - connect( clone, SIGNAL(doneCheckout()), this, SLOT(doneCheckout()) ); - clone->execute(); -} -void CloneDlg::beginDownloading() -{ - disconnect( sender(), SIGNAL(transportProgress(quint32,quint32,quint32,quint64)), - this, SLOT(beginDownloading()) ); - mStates[ Prepare ] = Done; - mStates[ Download ] = Current; - mStates[ Index ] = Current; - updateAction(); + clone->execute(); } void CloneDlg::doneDownload() { - mStates[ Download ] = Done; - updateAction(); } void CloneDlg::doneIndexing() { - mStates[ Index ] = Done; - - if( mStates.contains( Checkout ) ) - mStates[ Checkout ] = Current; - - updateAction(); } void CloneDlg::doneCheckout() { - mStates[ Checkout ] = Done; - updateAction(); } void CloneDlg::rootCloneFinished() @@ -224,7 +189,6 @@ void CloneDlg::rootCloneFinished() if ( operation->result() ) { - mProgress->setDone(); return; } @@ -233,27 +197,9 @@ void CloneDlg::rootCloneFinished() mProgress->reject(); } -void CloneDlg::updateAction() { - QStringList open, current, done; - - QHash< Tasks, QString > t; - t.insert( Prepare, tr( "Prepare" ) ); - t.insert( Index, tr( "Indexing" ) ); - t.insert( Download, tr( "Downloading" ) ); - t.insert( Checkout, tr( "Check out" ) ); - foreach( Tasks task, mStates.keys() ) { - QStringList* sl = NULL; - - if( mStates[ task ] == Open ) sl = &open; - else if( mStates[ task ] == Done ) sl = &done; - else if( mStates[ task ] == Current ) sl = ¤t; - - if( sl ) - sl->append( t[ task ] ); } - mProgress->setAction( mAction, open, current, done ); } diff --git a/Modules/Remotes/CloneRepositoryDlg.hpp b/Modules/Remotes/CloneRepositoryDlg.hpp index 4d569422..0d744122 100644 --- a/Modules/Remotes/CloneRepositoryDlg.hpp +++ b/Modules/Remotes/CloneRepositoryDlg.hpp @@ -89,13 +89,9 @@ private slots: void doneCheckout(); void rootCloneFinished(); -private: - void updateAction(); private: ProgressDlg* mProgress = nullptr; - QString mAction; - QHash< Tasks, State > mStates; QPointer mCloneWdgt; QPointer mCloneOptsWdgt; From 51785737a55e93b9a599063ea93ad44729322711 Mon Sep 17 00:00:00 2001 From: Nils Fenner Date: Tue, 21 Apr 2015 15:11:36 +0200 Subject: [PATCH 6/7] redesign ProgressDlg to visualize the progress of multiple activities An activity must contain at least one step to be processed. Note: There's no logging available yet. --- Libs/libMacGitverCore/Widgets/ProgressDlg.cpp | 144 +++++++------ Libs/libMacGitverCore/Widgets/ProgressDlg.hpp | 29 +++ Libs/libMacGitverCore/Widgets/ProgressDlg.ui | 201 +++++++----------- 3 files changed, 188 insertions(+), 186 deletions(-) diff --git a/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp b/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp index 2539d18d..e6679df8 100644 --- a/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp +++ b/Libs/libMacGitverCore/Widgets/ProgressDlg.cpp @@ -5,9 +5,7 @@ #include #include -#include #include -#include namespace Private { @@ -53,6 +51,9 @@ ProgressDlg::ProgressDlg() p.setColor( QPalette::Base, p.color( QPalette::Window ) ); p.setColor( QPalette::Text, p.color( QPalette::WindowText ) ); ui->txtLog->setPalette( p ); + + connect(&mUpdater, &QTimer::timeout, this, &ProgressDlg::updateActivities); + mUpdater.start(250); } ProgressDlg::~ProgressDlg() @@ -60,39 +61,54 @@ ProgressDlg::~ProgressDlg() delete ui; } -void ProgressDlg::setAction( const QString& action, - const QStringList& open, - const QStringList& current, - const QStringList& done ) +int ProgressDlg::updateInterval() const { - QString act = action; + return mUpdater.interval(); +} - foreach( QString s, done ) - { - act += QStringLiteral( " (" ) % s % QStringLiteral( ")" ); - } +void ProgressDlg::setUpdateInterval(int msec) +{ + mUpdater.setInterval(msec); +} - foreach( QString s, current ) - { - act += QStringLiteral( " (" ) % s % QStringLiteral( ")" ); - } +void ProgressDlg::addActivity(const QString& description, QObject* activity, + const StepInfo::List& steps) +{ + Q_ASSERT(activity); - foreach( QString s, open ) - { - act += QStringLiteral( " (" ) % s % QStringLiteral( ")" ); + Private::ProgressWdgt* a( new Private::ProgressWdgt(description) ); + mActivities[activity] = a; + + QTreeWidgetItem* activityItem(new QTreeWidgetItem); + ui->treeProgress->addTopLevelItem(activityItem); + ui->treeProgress->setItemWidget(activityItem, 0, a); + + foreach (const StepInfo& sir, steps) { + Private::ProgressWdgt* s = new Private::ProgressWdgt(sir.desc); + a->mSteps[sir.name] = s; + + QTreeWidgetItem* stepItem(new QTreeWidgetItem); + activityItem->addChild(stepItem); + ui->treeProgress->setItemWidget(stepItem, 0, s); } +} + +void ProgressDlg::setStatusInfo(QObject* activity, const QString& step, + const QString& text) +{ + Q_ASSERT(activity && !step.isEmpty()); - ui->lblAction->setText( act ); + Private::ProgressWdgt* s = findStep(activity, step); + s->txtStatusInfo->setText(text); } -void ProgressDlg::setCurrent(QObject* current) +void ProgressDlg::setPercentage(QObject* activity, const QString& step, + qreal percent) { - mCurrent = current; + Q_ASSERT(activity && !step.isEmpty()); - connect( mCurrent, SIGNAL(remoteMessage(QString)), - this, SLOT(remoteMessage(QString)) ); - connect( mCurrent, SIGNAL(transportProgress(quint32, quint32, quint32, quint64)), - this, SLOT(transportProgress(quint32, quint32, quint32, quint64)) ); + Private::ProgressWdgt* s = findStep(activity, step); + s->mPercentage = qMin( qMax(percent, 0.), 1. ) * 100.; } void ProgressDlg::closeEvent( QCloseEvent* ev ) @@ -106,35 +122,7 @@ void ProgressDlg::closeEvent( QCloseEvent* ev ) QDialog::closeEvent( ev ); } -void ProgressDlg::transportProgress( quint32 totalObjects, - quint32 indexedObjects, - quint32 receivedObjects, - quint64 receivedBytes ) -{ - QString recv; - if( receivedBytes > 1024 * 1024 * 950 ) /* 950 is so we get 0.9 gb */ - { - recv = QString::number( receivedBytes / (1024*1024*1024.0), 'f', 2 ) % QStringLiteral( " Gb" ); - } - else if( receivedBytes > 1024 * 950 ) - { - recv = QString::number( receivedBytes / (1024*1024.0), 'f', 2 ) % QStringLiteral( " Mb" ); - } - else if( receivedBytes > 950 ) - { - recv = QString::number( receivedBytes / 1024.0, 'f', 2 ) % QStringLiteral( " Kb" ); - } - else - { - recv = QString::number( receivedBytes ); - } - ui->lblTransferSize->setText( recv ); - - ui->progressBar->setRange( 0, totalObjects * 2 ); - ui->progressBar->setValue( indexedObjects + receivedObjects ); -} - -void ProgressDlg::remoteMessage( const QString& msg ) +void ProgressDlg::remoteMessage(const QString& msg) { mRawRemoteMessage += msg; @@ -166,27 +154,53 @@ void ProgressDlg::remoteMessage( const QString& msg ) output += QString( outputBuffer, outBufLen ); QString log = mBaseLog % QStringLiteral( "
" ) % - output.replace( QChar( L'\n' ), QLatin1String("
") ).simplified(); + output.replace( QChar( L'\n' ), QStringLiteral("
") ).simplified(); ui->txtLog->setHtml( log ); } -void ProgressDlg::beginStep( const QString& step ) +void ProgressDlg::finished(QObject* activity) { - mBaseLog += tr( "%1
" ).arg( step ); - ui->txtLog->setHtml( mBaseLog ); + mActivities[activity]->mStatus = Private::ProgressWdgt::Stopped; + + bool done = true; + foreach (Private::ProgressWdgt* a, mActivities) { + done &= (a->mStatus == Private::ProgressWdgt::Stopped); + if (!done) { + break; + } + } + + if (done) { + mDone = true; + ui->buttonBox->button( QDialogButtonBox::Close )->setEnabled( true ); + } } -void ProgressDlg::finalizeStep() +void ProgressDlg::finished(QObject* activity, const QString& step) { - mBaseLog = ui->txtLog->toHtml() % QStringLiteral( "
" ); - mRawRemoteMessage = QString(); + Q_ASSERT(activity && !step.isEmpty()); + + Private::ProgressWdgt* a = mActivities[activity]; + a->mSteps[step]->mStatus = Private::ProgressWdgt::Stopped; +} - ui->txtLog->setHtml( mBaseLog ); +void ProgressDlg::updateActivities() +{ + foreach(Private::ProgressWdgt* a, mActivities) { + a->mPercentage = 0; + foreach (Private::ProgressWdgt* s, a->mSteps) { + s->progressBar->setValue(qRound(s->mPercentage)); + qreal stepPercent = s->mPercentage / a->mSteps.size(); + a->mPercentage += qMin( qMax(stepPercent, 0.), 100.); + } + + a->progressBar->setValue(qRound(a->mPercentage)); + } } -void ProgressDlg::setDone() +Private::ProgressWdgt* ProgressDlg::findStep(QObject* activity, const QString& step) const { - mDone = true; - ui->buttonBox->button( QDialogButtonBox::Close )->setEnabled( true ); + Private::ProgressWdgt* a = mActivities[activity]; + return step.isEmpty() || !a ? nullptr : a->mSteps[step]; } diff --git a/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp b/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp index c767db57..c1d458a0 100644 --- a/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp +++ b/Libs/libMacGitverCore/Widgets/ProgressDlg.hpp @@ -6,6 +6,7 @@ #include #include +#include namespace Private { @@ -22,6 +23,14 @@ class MGV_CORE_API ProgressDlg : public BlueSky::Dialog Q_OBJECT public: + struct StepInfo + { + typedef QVector List; + + QString name; + QString desc; + }; + typedef QMap< QPointer, QPointer > Activities; public: @@ -29,12 +38,29 @@ class MGV_CORE_API ProgressDlg : public BlueSky::Dialog ~ProgressDlg(); public: + int updateInterval() const; + void setUpdateInterval(int msec); + + void addActivity(const QString& description, QObject* activity, + const StepInfo::List& steps); + + void setStatusInfo(QObject* activity, const QString& step, + const QString& text); + void setPercentage(QObject* activity, const QString& step, qreal percent); + void remoteMessage(const QString& msg); + void finished(QObject* activity); + void finished(QObject* activity, const QString& step); +private slots: + void updateActivities(); protected: void closeEvent( QCloseEvent* ev ); +private: + Private::ProgressWdgt* findStep(QObject* activity, const QString& step) const; + private: Ui::ProgressDlg* ui; @@ -42,4 +68,7 @@ class MGV_CORE_API ProgressDlg : public BlueSky::Dialog bool mDone; QString mBaseLog; QString mRawRemoteMessage; + Activities mActivities; + + QTimer mUpdater; }; diff --git a/Libs/libMacGitverCore/Widgets/ProgressDlg.ui b/Libs/libMacGitverCore/Widgets/ProgressDlg.ui index 19bf883d..f5cce393 100644 --- a/Libs/libMacGitverCore/Widgets/ProgressDlg.ui +++ b/Libs/libMacGitverCore/Widgets/ProgressDlg.ui @@ -9,16 +9,10 @@ 0 0 - 484 - 291 + 603 + 332
- - - 0 - 0 - - Progress @@ -26,128 +20,93 @@ true - - - - QDialogButtonBox::Close - - - - - - - - 0 - 0 - - - - - 0 - 60 - + + + + Qt::Vertical - - Log - - - - QLayout::SetDefaultConstraint + + + + 0 + 2 + + + + QAbstractItemView::ScrollPerPixel - - 0 + + true - - 0 + + true - - 0 + + false + + + + 1 + + + + + + + 0 + 1 + - - 0 + + + 0 + 60 + - - - - - 0 - 0 - - - - QFrame::NoFrame - - - QFrame::Plain - - - - + + Details: + + + + QLayout::SetDefaultConstraint + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + + + - - - - Current operation + + + + QDialogButtonBox::Close - - - 3 - - - 3 - - - 3 - - - 3 - - - 6 - - - 2 - - - - - - 0 - 0 - - - - - - - - - - - - - - - <b>Progress</(b> - - - - - - - <b>Action</b> - - - - - - - - - - - From 4a28a6ee6a309a972b2feb2c7d15d57fc1860ea0 Mon Sep 17 00:00:00 2001 From: Nils Fenner Date: Tue, 21 Apr 2015 15:13:55 +0200 Subject: [PATCH 7/7] Use the reimplemented ProgressDlg in CloneDlg, making it functional again. --- Modules/Remotes/CloneRepositoryDlg.cpp | 76 ++++++++++++++++++++++++++ Modules/Remotes/CloneRepositoryDlg.hpp | 8 +++ 2 files changed, 84 insertions(+) diff --git a/Modules/Remotes/CloneRepositoryDlg.cpp b/Modules/Remotes/CloneRepositoryDlg.cpp index 09e1c7e4..e0e27598 100644 --- a/Modules/Remotes/CloneRepositoryDlg.cpp +++ b/Modules/Remotes/CloneRepositoryDlg.cpp @@ -157,6 +157,8 @@ void CloneDlg::accept() } mProgress = new ProgressDlg; + + // TODO: implement a ProgressDlg::minimumDuration mProgress->show(); if( repoName.endsWith( QLatin1String( ".git" ) ) ) @@ -165,21 +167,47 @@ void CloneDlg::accept() if( repoName.lastIndexOf( QChar( L'/' ) ) != -1 ) repoName.remove( 0, repoName.lastIndexOf( QChar( L'/' ) ) + 1 ); + ProgressDlg::StepInfo::List steps; + steps << ProgressDlg::StepInfo{ QStringLiteral("transfer"), tr("Download Git objects.") } + << ProgressDlg::StepInfo{ QStringLiteral("index"), tr("Add objects to Git index.") }; + + if (!clone->bare()) { + steps << ProgressDlg::StepInfo{ QStringLiteral("checkout"), + tr("Checkout the worktree.") }; + connect( clone, &Git::CloneOperation::doneCheckout, + this, &CloneDlg::doneCheckout ); + } + + mProgress->addActivity(tr("Cloning %1 to %2") + .arg(repoName).arg(targetDir), clone, steps); + connect( clone, &Git::CloneOperation::finished, + this, &CloneDlg::rootCloneFinished ); + connect( clone, &Git::CloneOperation::transportProgress, + this, &CloneDlg::onTransportProgress ); + connect( clone, &Git::CloneOperation::checkoutProgress, + this, &CloneDlg::onCheckoutProgress ); + connect( clone, &Git::CloneOperation::doneDownloading, + this, &CloneDlg::doneDownload ); + connect( clone, &Git::CloneOperation::doneIndexing, + this, &CloneDlg::doneIndexing ); clone->execute(); } void CloneDlg::doneDownload() { + mProgress->finished(sender(), QStringLiteral("transfer")); } void CloneDlg::doneIndexing() { + mProgress->finished(sender(), QStringLiteral("index")); } void CloneDlg::doneCheckout() { + mProgress->finished(sender(), QStringLiteral("checkout")); } void CloneDlg::rootCloneFinished() @@ -189,6 +217,7 @@ void CloneDlg::rootCloneFinished() if ( operation->result() ) { + mProgress->finished(sender()); return; } @@ -197,9 +226,56 @@ void CloneDlg::rootCloneFinished() mProgress->reject(); } +void CloneDlg::onCheckoutProgress(const QString& fileName, quint64 totalFiles, + quint64 completedFiles) { + QObject* s = sender(); + + const QString stepCheckout( QStringLiteral("checkout") ); + mProgress->setPercentage( s, stepCheckout, + (qreal)completedFiles / totalFiles ); + mProgress->setStatusInfo( s, stepCheckout, + tr("Checked out %1 of %2 files (last file: %3).") + .arg(completedFiles).arg(totalFiles).arg(fileName) ); +} +void CloneDlg::onTransportProgress(quint32 totalObjects, + quint32 indexedObjects, + quint32 receivedObjects, + quint64 receivedBytes) +{ + QString recv; + if( receivedBytes > 1024 * 1024 * 950 ) /* 950 is so we get 0.9 gb */ + { + recv = QString::number( receivedBytes / (1024*1024*1024.0), 'f', 2 ) + QStringLiteral(" Gb"); + } + else if( receivedBytes > 1024 * 950 ) + { + recv = QString::number( receivedBytes / (1024*1024.0), 'f', 2 ) + QStringLiteral(" Mb"); + } + else if( receivedBytes > 950 ) + { + recv = QString::number( receivedBytes / 1024.0, 'f', 2 ) + QStringLiteral(" Kb"); + } + else { + recv = QString::number( receivedBytes ); } + QObject* s = sender(); + const QString stepTransfer(QStringLiteral("transfer")); + mProgress->setPercentage( s, stepTransfer, + (qreal)receivedObjects / totalObjects ); + mProgress->setStatusInfo( s, stepTransfer, + tr("Received %1 of %2 objects (%3).") + .arg(receivedObjects) + .arg(totalObjects) + .arg(recv) ); + + const QString stepIndex(QStringLiteral("index")); + mProgress->setPercentage( s, stepIndex, + (qreal)indexedObjects / totalObjects ); + mProgress->setStatusInfo( s, stepIndex, tr("Indexed %1 of %2 objects.") + .arg(indexedObjects) + .arg(totalObjects) ); } diff --git a/Modules/Remotes/CloneRepositoryDlg.hpp b/Modules/Remotes/CloneRepositoryDlg.hpp index 0d744122..6f48ed0e 100644 --- a/Modules/Remotes/CloneRepositoryDlg.hpp +++ b/Modules/Remotes/CloneRepositoryDlg.hpp @@ -89,6 +89,14 @@ private slots: void doneCheckout(); void rootCloneFinished(); + void onCheckoutProgress(const QString& fileName, + quint64 totalFiles, + quint64 completedFiles); + + void onTransportProgress(quint32 totalObjects, + quint32 indexedObjects, + quint32 receivedObjects, + quint64 receivedBytes); private: ProgressDlg* mProgress = nullptr;