mirror of
https://gitlab.com/pholy/OSCAR-code.git
synced 2025-04-04 18:20:42 +00:00
90 lines
2.7 KiB
C++
90 lines
2.7 KiB
C++
/* OSCAR C[onditional] Progress Bar
|
|
*
|
|
* Copyright (c) 2020-2024 The OSCAR Team
|
|
* Copyright (C) 2019 Guy Scharf
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of the source code
|
|
* for more details.
|
|
*
|
|
* The C[onditional] progress bar causes the progress bar window to show only if the task
|
|
* is not half done in two seconds (number of seconds is variable). The CProgressBar can
|
|
* thus be used in all situations in which a progress bar might be appropriate without
|
|
* determining ahead of time whether the task will take long enough to warrant use of a progress bar.
|
|
*
|
|
* This is especially useful when even though the number of iterations is known, the time required
|
|
* to perform each iteration is not known ahead of time. For example, reading summary files and
|
|
* discovering that some need to be updated but others do not.
|
|
*/
|
|
|
|
#include <QCoreApplication>
|
|
|
|
#include "cprogressbar.h"
|
|
|
|
CProgressBar::CProgressBar(QString title, QWidget * parent, long maxValue)
|
|
{
|
|
savedTitle = title;
|
|
maxSteps = maxValue;
|
|
progress = nullptr;
|
|
showProgress = false;
|
|
this->parent = parent;
|
|
}
|
|
|
|
void CProgressBar::start () {
|
|
timeChecked = false;
|
|
timer.start();
|
|
}
|
|
|
|
void CProgressBar::setMaximum (long value) {
|
|
maxSteps = value;
|
|
}
|
|
|
|
void CProgressBar::setTitle (QString title) {
|
|
savedTitle = title;
|
|
}
|
|
|
|
void CProgressBar::setWidth (int width) {
|
|
this->width = width;
|
|
}
|
|
|
|
void CProgressBar::add (long count) {
|
|
numDone += count;
|
|
|
|
// If timer not started, start it now.
|
|
if (!timer.isValid())
|
|
timer.start();
|
|
|
|
// See if timer limit has passed
|
|
if (!progress && !timeChecked && (timer.elapsed() > timerLimit)) {
|
|
maxSteps -= numDone; // maxSteps now is number of steps remaining
|
|
numDone = 1; // and we figure only one processed so far
|
|
|
|
progress = new QProgressDialog(savedTitle,
|
|
QString(), 0, maxSteps, parent,
|
|
Qt::WindowSystemMenuHint | Qt::WindowTitleHint);
|
|
progress->setWindowModality(Qt::WindowModal);
|
|
progress->setValue(0);
|
|
progress->setMinimumWidth(width);
|
|
progress->show();
|
|
|
|
QCoreApplication::processEvents();
|
|
showProgress = true;
|
|
}
|
|
|
|
// Update progress bar if one is displayed and more than 1% different from last display
|
|
if (showProgress) {
|
|
int pctDone = (100 * numDone) / maxSteps;
|
|
if (pctDone != lastPctDone) {
|
|
lastPctDone = pctDone;
|
|
progress->setValue(numDone);
|
|
QCoreApplication::processEvents();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CProgressBar::close () {
|
|
if (progress) {
|
|
progress->setValue(maxSteps);
|
|
}
|
|
}
|