diff options
| author | Felix Ernst <[email protected]> | 2024-06-13 16:38:41 +0200 |
|---|---|---|
| committer | Felix Ernst <[email protected]> | 2024-06-20 09:45:32 +0000 |
| commit | 9108534ce07fbdc5e8f037826049c37cf226d2e6 (patch) | |
| tree | a95995578c1691fa19a19bbcbc6659e4dc3a59b8 /src/statusbar | |
| parent | 15eff9f5ada404632eb014ca3c00337592851b47 (diff) | |
Prevent inconsistent status bar progress reporting states
Merge setting title and progress percent into one method. This
makes sure that the method can be called from all over the place
and will still always show a consistent state instead of partially
showing the progress percent for one progress but the label for
a different one.
This is to enable various tasks reporting progress at the same time
in a way that doesn't lead to a confusing mess for users. Usually
multiple tasks do not show progress at the same time, but when it
happens this commit should make sure that the user experience is
at least bearable.
Allow not having a "Stop" button next to the progress report for
tasks that cannot be stopped.
Diffstat (limited to 'src/statusbar')
| -rw-r--r-- | src/statusbar/dolphinstatusbar.cpp | 41 | ||||
| -rw-r--r-- | src/statusbar/dolphinstatusbar.h | 28 |
2 files changed, 39 insertions, 30 deletions
diff --git a/src/statusbar/dolphinstatusbar.cpp b/src/statusbar/dolphinstatusbar.cpp index 50f4cd3ea..5a3aa5857 100644 --- a/src/statusbar/dolphinstatusbar.cpp +++ b/src/statusbar/dolphinstatusbar.cpp @@ -164,37 +164,42 @@ QString DolphinStatusBar::text() const return m_text; } -void DolphinStatusBar::setProgressText(const QString &text) +void DolphinStatusBar::showProgress(const QString ¤tlyRunningTaskTitle, int progressPercent, CancelLoading cancelLoading) { - m_progressTextLabel->setText(text); -} + m_cancelLoading = cancelLoading; -QString DolphinStatusBar::progressText() const -{ - return m_progressTextLabel->text(); -} - -void DolphinStatusBar::setProgress(int percent) -{ // Show a busy indicator if a value < 0 is provided: - m_progressBar->setMaximum((percent < 0) ? 0 : 100); + m_progressBar->setMaximum((progressPercent < 0) ? 0 : 100); - percent = qBound(0, percent, 100); - const bool progressRestarted = (percent < 100) && (percent < m_progress); - m_progress = percent; - if (progressRestarted && !m_progressBar->isVisible()) { + progressPercent = qBound(0, progressPercent, 100); + if (!m_progressBar->isVisible()) { // Show the progress bar delayed: In the case if 100 % are reached within // a short time, no progress bar will be shown at all. - m_showProgressBarTimer->start(); + if (!m_showProgressBarTimer->isActive()) { + m_showProgressBarTimer->start(); + } else { + // The timer is already running. Should we restart it or keep it running? + if (m_progressTextLabel->text() != currentlyRunningTaskTitle || (progressPercent < 100 && progressPercent < m_progress)) { + m_showProgressBarTimer->start(); + } + } } + m_progress = progressPercent; m_progressBar->setValue(m_progress); - if (percent == 100) { + if (progressPercent == 100) { // The end of the progress has been reached. Assure that the progress bar // gets hidden and the extensions widgets get visible again. m_showProgressBarTimer->stop(); updateProgressInfo(); } + + m_progressTextLabel->setText(currentlyRunningTaskTitle); +} + +QString DolphinStatusBar::progressText() const +{ + return m_progressTextLabel->text(); } int DolphinStatusBar::progress() const @@ -302,7 +307,7 @@ void DolphinStatusBar::updateProgressInfo() { if (m_progress < 100) { // Show the progress information and hide the extensions - m_stopButton->show(); + m_stopButton->setVisible(m_cancelLoading == CancelLoading::Allowed); m_progressTextLabel->show(); m_progressBar->show(); setExtensionsVisible(false); diff --git a/src/statusbar/dolphinstatusbar.h b/src/statusbar/dolphinstatusbar.h index 75a2cdc6f..8abbed66b 100644 --- a/src/statusbar/dolphinstatusbar.h +++ b/src/statusbar/dolphinstatusbar.h @@ -37,21 +37,23 @@ public: QString text() const; + enum class CancelLoading { Allowed, Disallowed }; /** - * Sets the text for the progress information. - * DolphinStatusBar::setProgress() should be invoked - * afterwards each time the progress changes. + * Shows progress for a task on the status bar. + * + * Allows us to inform the user about various tasks progressing in the background. + * This method can be called from various places in any order but only the most recent call will be displayed. + * @param currentlyRunningTaskTitle The task that is currently progressing. + * @param progressPercent The percent value shown in a progress bar next to the @p currentlyRunningTaskTitle. + * A negative @p progressPercent value will be interpreted as indeterminate/unknown progress. + * The progress is shown delayed by 500 milliseconds: If the progress does reach 100 % within 500 milliseconds, + * the progress is not shown at all. + * @param cancelLoading Whether a "Stop" button for cancelling the task should be available next to the progress reporting. + * + * @note Make sure you also hide the progress information by calling this with a @p progressPercent equal or greater than 100. */ - void setProgressText(const QString &text); + void showProgress(const QString ¤tlyRunningTaskTitle, int progressPercent, CancelLoading cancelLoading = CancelLoading::Allowed); QString progressText() const; - - /** - * Sets the progress in percent (0 - 100). The - * progress is shown delayed by 500 milliseconds: - * If the progress does reach 100 % within 500 milliseconds, - * the progress is not shown at all. - */ - void setProgress(int percent); int progress() const; /** @@ -100,6 +102,7 @@ protected: private Q_SLOTS: void showZoomSliderToolTip(int zoomLevel); + void updateProgressInfo(); /** @@ -138,6 +141,7 @@ private: QSlider *m_zoomSlider; QLabel *m_progressTextLabel; + CancelLoading m_cancelLoading = CancelLoading::Allowed; QProgressBar *m_progressBar; QToolButton *m_stopButton; int m_progress; |
