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"