55
66#include < QStringBuilder>
77#include < QCloseEvent>
8- #include < QDebug>
98#include < QPushButton>
10- #include < QString>
119
1210namespace 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
5859ProgressDlg::~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
98114void 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}
0 commit comments