Skip to content
This repository was archived by the owner on Jun 3, 2024. It is now read-only.

Commit 42cdc5b

Browse files
committed
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.
1 parent eae5656 commit 42cdc5b

File tree

3 files changed

+188
-198
lines changed

3 files changed

+188
-198
lines changed

Libs/libMacGitverCore/Widgets/ProgressDlg.cpp

Lines changed: 79 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55

66
#include <QStringBuilder>
77
#include <QCloseEvent>
8-
#include <QDebug>
98
#include <QPushButton>
10-
#include <QString>
119

1210
namespace Private
1311
{
@@ -53,46 +51,64 @@ ProgressDlg::ProgressDlg()
5351
p.setColor( QPalette::Base, p.color( QPalette::Window ) );
5452
p.setColor( QPalette::Text, p.color( QPalette::WindowText ) );
5553
ui->txtLog->setPalette( p );
54+
55+
connect(&mUpdater, &QTimer::timeout, this, &ProgressDlg::updateActivities);
56+
mUpdater.start(250);
5657
}
5758

5859
ProgressDlg::~ProgressDlg()
5960
{
6061
delete ui;
6162
}
6263

63-
void ProgressDlg::setAction( const QString& action,
64-
const QStringList& open,
65-
const QStringList& current,
66-
const QStringList& done )
64+
int ProgressDlg::updateInterval() const
6765
{
68-
QString act = action;
66+
return mUpdater.interval();
67+
}
6968

70-
foreach( QString s, done )
71-
{
72-
act += QStringLiteral( " (<font color=\"green\">" ) % s % QStringLiteral( "</font>)" );
73-
}
69+
void ProgressDlg::setUpdateInterval(int msec)
70+
{
71+
mUpdater.setInterval(msec);
72+
}
7473

75-
foreach( QString s, current )
76-
{
77-
act += QStringLiteral( " (<font color=\"blue\">" ) % s % QStringLiteral( "</font>)" );
78-
}
74+
void ProgressDlg::addActivity(const QString& description, QObject* activity,
75+
const StepInfo::List& steps)
76+
{
77+
Q_ASSERT(activity);
7978

80-
foreach( QString s, open )
81-
{
82-
act += QStringLiteral( " (<font color=\"red\">" ) % s % QStringLiteral( "</font>)" );
79+
Private::ProgressWdgt* a( new Private::ProgressWdgt(description) );
80+
mActivities[activity] = a;
81+
82+
QTreeWidgetItem* activityItem(new QTreeWidgetItem);
83+
ui->treeProgress->addTopLevelItem(activityItem);
84+
ui->treeProgress->setItemWidget(activityItem, 0, a);
85+
86+
foreach (const StepInfo& sir, steps) {
87+
Private::ProgressWdgt* s = new Private::ProgressWdgt(sir.desc);
88+
a->mSteps[sir.name] = s;
89+
90+
QTreeWidgetItem* stepItem(new QTreeWidgetItem);
91+
activityItem->addChild(stepItem);
92+
ui->treeProgress->setItemWidget(stepItem, 0, s);
8393
}
94+
}
95+
96+
void ProgressDlg::setStatusInfo(QObject* activity, const QString& step,
97+
const QString& text)
98+
{
99+
Q_ASSERT(activity && !step.isEmpty());
84100

85-
ui->lblAction->setText( act );
101+
Private::ProgressWdgt* s = findStep(activity, step);
102+
s->txtStatusInfo->setText(text);
86103
}
87104

88-
void ProgressDlg::setCurrent(QObject* current)
105+
void ProgressDlg::setPercentage(QObject* activity, const QString& step,
106+
qreal percent)
89107
{
90-
mCurrent = current;
108+
Q_ASSERT(activity && !step.isEmpty());
91109

92-
connect( mCurrent, SIGNAL(remoteMessage(QString)),
93-
this, SLOT(remoteMessage(QString)) );
94-
connect( mCurrent, SIGNAL(transportProgress(quint32, quint32, quint32, quint64)),
95-
this, SLOT(transportProgress(quint32, quint32, quint32, quint64)) );
110+
Private::ProgressWdgt* s = findStep(activity, step);
111+
s->mPercentage = qMin( qMax(percent, 0.), 1. ) * 100.;
96112
}
97113

98114
void ProgressDlg::closeEvent( QCloseEvent* ev )
@@ -106,35 +122,7 @@ void ProgressDlg::closeEvent( QCloseEvent* ev )
106122
QDialog::closeEvent( ev );
107123
}
108124

109-
void ProgressDlg::transportProgress( quint32 totalObjects,
110-
quint32 indexedObjects,
111-
quint32 receivedObjects,
112-
quint64 receivedBytes )
113-
{
114-
QString recv;
115-
if( receivedBytes > 1024 * 1024 * 950 ) /* 950 is so we get 0.9 gb */
116-
{
117-
recv = QString::number( receivedBytes / (1024*1024*1024.0), 'f', 2 ) % QStringLiteral( " Gb" );
118-
}
119-
else if( receivedBytes > 1024 * 950 )
120-
{
121-
recv = QString::number( receivedBytes / (1024*1024.0), 'f', 2 ) % QStringLiteral( " Mb" );
122-
}
123-
else if( receivedBytes > 950 )
124-
{
125-
recv = QString::number( receivedBytes / 1024.0, 'f', 2 ) % QStringLiteral( " Kb" );
126-
}
127-
else
128-
{
129-
recv = QString::number( receivedBytes );
130-
}
131-
ui->lblTransferSize->setText( recv );
132-
133-
ui->progressBar->setRange( 0, totalObjects * 2 );
134-
ui->progressBar->setValue( indexedObjects + receivedObjects );
135-
}
136-
137-
void ProgressDlg::remoteMessage( const QString& msg )
125+
void ProgressDlg::remoteMessage(const QString& msg)
138126
{
139127
mRawRemoteMessage += msg;
140128

@@ -166,27 +154,53 @@ void ProgressDlg::remoteMessage( const QString& msg )
166154
output += QString( outputBuffer, outBufLen );
167155

168156
QString log = mBaseLog % QStringLiteral( "<br/>" ) %
169-
output.replace( QChar( L'\n' ), QLatin1String("<br/>") ).simplified();
157+
output.replace( QChar( L'\n' ), QStringLiteral("<br/>") ).simplified();
170158

171159
ui->txtLog->setHtml( log );
172160
}
173161

174-
void ProgressDlg::beginStep( const QString& step )
162+
void ProgressDlg::finished(QObject* activity)
175163
{
176-
mBaseLog += tr( "<font color=\"blue\">%1</font><br/>" ).arg( step );
177-
ui->txtLog->setHtml( mBaseLog );
164+
mActivities[activity]->mStatus = Private::ProgressWdgt::Stopped;
165+
166+
bool done = true;
167+
foreach (Private::ProgressWdgt* a, mActivities) {
168+
done &= (a->mStatus == Private::ProgressWdgt::Stopped);
169+
if (!done) {
170+
break;
171+
}
172+
}
173+
174+
if (done) {
175+
mDone = true;
176+
ui->buttonBox->button( QDialogButtonBox::Close )->setEnabled( true );
177+
}
178178
}
179179

180-
void ProgressDlg::finalizeStep()
180+
void ProgressDlg::finished(QObject* activity, const QString& step)
181181
{
182-
mBaseLog = ui->txtLog->toHtml() % QStringLiteral( "<br/>" );
183-
mRawRemoteMessage = QString();
182+
Q_ASSERT(activity && !step.isEmpty());
183+
184+
Private::ProgressWdgt* a = mActivities[activity];
185+
a->mSteps[step]->mStatus = Private::ProgressWdgt::Stopped;
186+
}
184187

185-
ui->txtLog->setHtml( mBaseLog );
188+
void ProgressDlg::updateActivities()
189+
{
190+
foreach(Private::ProgressWdgt* a, mActivities) {
191+
a->mPercentage = 0;
192+
foreach (Private::ProgressWdgt* s, a->mSteps) {
193+
s->progressBar->setValue(qRound(s->mPercentage));
194+
qreal stepPercent = s->mPercentage / a->mSteps.size();
195+
a->mPercentage += qMin( qMax(stepPercent, 0.), 100.);
196+
}
197+
198+
a->progressBar->setValue(qRound(a->mPercentage));
199+
}
186200
}
187201

188-
void ProgressDlg::setDone()
202+
Private::ProgressWdgt* ProgressDlg::findStep(QObject* activity, const QString& step) const
189203
{
190-
mDone = true;
191-
ui->buttonBox->button( QDialogButtonBox::Close )->setEnabled( true );
204+
Private::ProgressWdgt* a = mActivities[activity];
205+
return step.isEmpty() || !a ? nullptr : a->mSteps[step];
192206
}

Libs/libMacGitverCore/Widgets/ProgressDlg.hpp

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <QMap>
88
#include <QPointer>
9+
#include <QTimer>
910

1011
namespace Private
1112
{
@@ -22,36 +23,52 @@ class MGV_CORE_API ProgressDlg : public BlueSky::Dialog
2223
Q_OBJECT
2324

2425
public:
26+
struct StepInfo
27+
{
28+
typedef QVector<StepInfo> List;
29+
30+
QString name;
31+
QString desc;
32+
};
33+
2534
typedef QMap< QPointer<QObject>, QPointer<Private::ProgressWdgt> > Activities;
2635

2736
public:
2837
ProgressDlg();
2938
~ProgressDlg();
3039

3140
public:
32-
void setAction( const QString& action, const QStringList& open,
33-
const QStringList& current, const QStringList& done );
34-
void setCurrent(QObject* current);
41+
int updateInterval() const;
42+
void setUpdateInterval(int msec);
3543

36-
private slots:
37-
void transportProgress( quint32 totalObjects, quint32 indexedObjects,
38-
quint32 receivedObjects, quint64 receivedBytes );
39-
void remoteMessage( const QString& msg );
44+
void addActivity(const QString& description, QObject* activity,
45+
const StepInfo::List& steps);
4046

41-
public:
42-
void setDone();
43-
void beginStep( const QString& step );
44-
void finalizeStep();
47+
void setStatusInfo(QObject* activity, const QString& step,
48+
const QString& text);
49+
void setPercentage(QObject* activity, const QString& step, qreal percent);
50+
void remoteMessage(const QString& msg);
51+
52+
void finished(QObject* activity);
53+
void finished(QObject* activity, const QString& step);
54+
55+
private slots:
56+
void updateActivities();
4557

4658
protected:
4759
void closeEvent( QCloseEvent* ev );
4860

61+
private:
62+
Private::ProgressWdgt* findStep(QObject* activity, const QString& step) const;
63+
4964
private:
5065
Ui::ProgressDlg* ui;
5166

5267
private:
5368
bool mDone;
5469
QString mBaseLog;
55-
QObject* mCurrent;
5670
QString mRawRemoteMessage;
71+
Activities mActivities;
72+
73+
QTimer mUpdater;
5774
};

0 commit comments

Comments
 (0)