File indexing completed on 2024-04-28 15:40:13

0001 // SPDX-FileCopyrightText: 2003-2020 The KPhotoAlbum Development Team
0002 // SPDX-FileCopyrightText: 2021 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0003 // SPDX-FileCopyrightText: 2022 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0004 //
0005 // SPDX-License-Identifier: GPL-2.0-or-later
0006 
0007 #include "StatusBar.h"
0008 
0009 #include "DirtyIndicator.h"
0010 #include "ImageCounter.h"
0011 
0012 #include <BackgroundTaskManager/StatusIndicator.h>
0013 #include <DB/ImageDB.h>
0014 #ifdef KPA_ENABLE_REMOTECONTROL
0015 #include <RemoteControl/ConnectionIndicator.h>
0016 #endif
0017 #include <ThumbnailView/ThumbnailFacade.h>
0018 #include <kpabase/SettingsData.h>
0019 
0020 #include <KIconLoader>
0021 #include <KLocalizedString>
0022 #include <QApplication>
0023 #include <QElapsedTimer>
0024 #include <QHBoxLayout>
0025 #include <QIcon>
0026 #include <QLabel>
0027 #include <QProgressBar>
0028 #include <QSlider>
0029 #include <QTimer>
0030 #include <QToolButton>
0031 #include <QVBoxLayout>
0032 
0033 MainWindow::StatusBar::StatusBar()
0034     : QStatusBar()
0035 {
0036     setupGUI();
0037     m_pendingShowTimer = new QTimer(this);
0038     m_pendingShowTimer->setSingleShot(true);
0039     connect(m_pendingShowTimer, &QTimer::timeout, this, &StatusBar::showStatusBar);
0040 }
0041 
0042 void MainWindow::StatusBar::setupGUI()
0043 {
0044     setContentsMargins(7, 2, 7, 2);
0045 
0046     QWidget *indicators = new QWidget(this);
0047     QHBoxLayout *indicatorsHBoxLayout = new QHBoxLayout(indicators);
0048     indicatorsHBoxLayout->setContentsMargins(0, 0, 0, 0);
0049     indicatorsHBoxLayout->setSpacing(10);
0050     mp_dirtyIndicator = new DirtyIndicator(indicators);
0051     indicatorsHBoxLayout->addWidget(mp_dirtyIndicator);
0052     connect(DB::ImageDB::instance(), &DB::ImageDB::dirty, mp_dirtyIndicator, &DirtyIndicator::markDirtySlot);
0053 
0054 #ifdef KPA_ENABLE_REMOTECONTROL
0055     auto *remoteIndicator = new RemoteControl::ConnectionIndicator(indicators);
0056     indicatorsHBoxLayout->addWidget(remoteIndicator);
0057 #endif
0058 
0059     auto *jobIndicator = new BackgroundTaskManager::StatusIndicator(indicators);
0060     indicatorsHBoxLayout->addWidget(jobIndicator);
0061 
0062     m_progressBar = new QProgressBar(this);
0063     m_progressBar->setMinimumWidth(400);
0064     addPermanentWidget(m_progressBar, 0);
0065 
0066     m_cancel = new QToolButton(this);
0067     m_cancel->setIcon(QIcon::fromTheme(QString::fromLatin1("dialog-close")));
0068     m_cancel->setShortcut(Qt::Key_Escape);
0069     addPermanentWidget(m_cancel, 0);
0070     connect(m_cancel, &QToolButton::clicked, this, &StatusBar::cancelRequest);
0071     connect(m_cancel, &QToolButton::clicked, this, &StatusBar::hideStatusBar);
0072 
0073     m_lockedIndicator = new QLabel(indicators);
0074     indicatorsHBoxLayout->addWidget(m_lockedIndicator);
0075 
0076     addPermanentWidget(indicators, 0);
0077 
0078     mp_partial = new ImageCounter(this);
0079     addPermanentWidget(mp_partial, 0);
0080 
0081     mp_selected = new ImageCounter(this);
0082     addPermanentWidget(mp_selected, 0);
0083 
0084     ImageCounter *total = new ImageCounter(this);
0085     addPermanentWidget(total, 0);
0086     total->setTotal(DB::ImageDB::instance()->totalCount());
0087     connect(DB::ImageDB::instance(), &DB::ImageDB::totalChanged, total, &ImageCounter::setTotal);
0088 
0089     mp_pathIndicator = new BreadcrumbViewer;
0090     addWidget(mp_pathIndicator, 1);
0091 
0092     setProgressBarVisible(false);
0093 
0094     m_thumbnailSizeSlider = ThumbnailView::ThumbnailFacade::instance()->createResizeSlider();
0095     addPermanentWidget(m_thumbnailSizeSlider, 0);
0096     // prevent stretching:
0097     m_thumbnailSizeSlider->setMaximumSize(m_thumbnailSizeSlider->size());
0098     m_thumbnailSizeSlider->setMinimumSize(m_thumbnailSizeSlider->size());
0099     m_thumbnailSizeSlider->hide();
0100     m_thumbnailSizeSlider->setFocusPolicy(Qt::ClickFocus);
0101 
0102     m_thumbnailSettings = new QToolButton;
0103     m_thumbnailSettings->setIcon(QIcon::fromTheme(QString::fromUtf8("settings-configure")));
0104     m_thumbnailSettings->setToolTip(i18n("Thumbnail settings..."));
0105     addPermanentWidget(m_thumbnailSettings, 0);
0106     m_thumbnailSettings->hide();
0107     m_thumbnailSettings->setFocusPolicy(Qt::NoFocus);
0108     connect(m_thumbnailSettings, &QToolButton::clicked, this, &StatusBar::thumbnailSettingsRequested);
0109 }
0110 
0111 void MainWindow::StatusBar::setLocked(bool locked)
0112 {
0113     static QPixmap lockedPix = QIcon::fromTheme(QString::fromLatin1("object-locked"))
0114                                    .pixmap(KIconLoader::StdSizes::SizeSmall);
0115     m_lockedIndicator->setFixedWidth(lockedPix.width());
0116 
0117     if (locked)
0118         m_lockedIndicator->setPixmap(lockedPix);
0119     else
0120         m_lockedIndicator->setPixmap(QPixmap());
0121 }
0122 
0123 void MainWindow::StatusBar::startProgress(const QString &text, int total)
0124 {
0125     m_progressBar->setFormat(text + QString::fromLatin1(": %p%"));
0126     m_progressBar->setMaximum(total);
0127     m_progressBar->setValue(0);
0128     m_pendingShowTimer->start(1000); // To avoid flicker we will only show the statusbar after 1 second.
0129 }
0130 
0131 void MainWindow::StatusBar::setProgress(int progress)
0132 {
0133     if (progress == m_progressBar->maximum())
0134         hideStatusBar();
0135 
0136     // If progress comes in to fast, then the UI will freeze from all time spent on updating the progressbar.
0137     static QElapsedTimer time;
0138     if (!time.isValid() || time.elapsed() > 200) {
0139         m_progressBar->setValue(progress);
0140         time.restart();
0141     }
0142 }
0143 
0144 void MainWindow::StatusBar::setProgressBarVisible(bool show)
0145 {
0146     m_progressBar->setVisible(show);
0147     m_cancel->setVisible(show);
0148 }
0149 
0150 void MainWindow::StatusBar::showThumbnailSlider()
0151 {
0152     m_thumbnailSizeSlider->setVisible(true);
0153     m_thumbnailSettings->show();
0154 }
0155 
0156 void MainWindow::StatusBar::hideThumbnailSlider()
0157 {
0158     m_thumbnailSizeSlider->setVisible(false);
0159     m_thumbnailSettings->hide();
0160 }
0161 
0162 void MainWindow::StatusBar::enterEvent(QEvent *)
0163 {
0164     // make sure that breadcrumbs are not obscured by messages
0165     clearMessage();
0166 }
0167 
0168 void MainWindow::StatusBar::hideStatusBar()
0169 {
0170     setProgressBarVisible(false);
0171     m_pendingShowTimer->stop();
0172 }
0173 
0174 void MainWindow::StatusBar::showStatusBar()
0175 {
0176     setProgressBarVisible(true);
0177 }
0178 
0179 // vi:expandtab:tabstop=4 shiftwidth=4:
0180 
0181 #include "moc_StatusBar.cpp"