File indexing completed on 2024-04-28 04:21:22

0001 // SPDX-FileCopyrightText: 2015-2022 The KPhotoAlbum Development Team
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-or-later
0004 
0005 // Qt includes
0006 #include <QTimer>
0007 
0008 // KDE includes
0009 #include <KLocalizedString>
0010 #include <KMessageBox>
0011 #include <KSharedConfig>
0012 
0013 // Local includes
0014 #include "CellGeometry.h"
0015 #include "GridResizeSlider.h"
0016 #include "Logging.h"
0017 #include "ThumbnailModel.h"
0018 #include "ThumbnailWidget.h"
0019 
0020 #include <ImageManager/ThumbnailBuilder.h>
0021 #include <MainWindow/Window.h>
0022 #include <kpabase/SettingsData.h>
0023 
0024 ThumbnailView::GridResizeSlider::GridResizeSlider(ThumbnailFactory *factory)
0025     : QSlider(Qt::Horizontal)
0026     , ThumbnailComponent(factory)
0027 {
0028     Settings::SettingsData *settings = Settings::SettingsData::instance();
0029     setMinimum(settings->minimumThumbnailSize());
0030     setMaximum(settings->thumbnailSize());
0031     setValue(settings->actualThumbnailSize());
0032 
0033     // timer for event-timeout:
0034     m_timer = new QTimer(this);
0035     m_timer->setSingleShot(true);
0036 
0037     // we have no definitive leave event when using the mousewheel -> use a timeout
0038     connect(m_timer, &QTimer::timeout, this, &GridResizeSlider::leaveGridResizingMode);
0039 
0040     connect(settings, &Settings::SettingsData::actualThumbnailSizeChanged, this, &GridResizeSlider::setValue);
0041     connect(settings, &Settings::SettingsData::thumbnailSizeChanged, this, &GridResizeSlider::setMaximum);
0042 
0043     connect(this, &GridResizeSlider::sliderPressed, this, &GridResizeSlider::enterGridResizingMode);
0044     connect(this, &GridResizeSlider::valueChanged, this, &GridResizeSlider::setCellSize);
0045 
0046     // disable drawing of thumbnails while resizing:
0047     connect(this, SIGNAL(isResizing(bool)), widget(), SLOT(setExternallyResizing(bool)));
0048 }
0049 
0050 ThumbnailView::GridResizeSlider::~GridResizeSlider()
0051 {
0052     delete m_timer;
0053 }
0054 
0055 void ThumbnailView::GridResizeSlider::mousePressEvent(QMouseEvent *event)
0056 {
0057     qCDebug(ThumbnailViewLog) << "Mouse pressed";
0058     enterGridResizingMode();
0059     QSlider::mousePressEvent(event);
0060 }
0061 
0062 void ThumbnailView::GridResizeSlider::mouseReleaseEvent(QMouseEvent *event)
0063 {
0064     qCDebug(ThumbnailViewLog) << "Mouse released";
0065     leaveGridResizingMode();
0066     QSlider::mouseReleaseEvent(event);
0067 }
0068 
0069 void ThumbnailView::GridResizeSlider::wheelEvent(QWheelEvent *event)
0070 {
0071     // set (or reset) the timer to leave resizing mode:
0072     m_timer->start(200);
0073     qCDebug(ThumbnailViewLog) << "(Re)starting timer";
0074     if (!m_resizing) {
0075         enterGridResizingMode();
0076     }
0077     QSlider::wheelEvent(event);
0078 }
0079 
0080 void ThumbnailView::GridResizeSlider::enterGridResizingMode()
0081 {
0082     if (m_resizing)
0083         return; // already resizing
0084     m_resizing = true;
0085 
0086     qCDebug(ThumbnailViewLog) << "Entering grid resizing mode";
0087     ImageManager::ThumbnailBuilder::instance()->cancelRequests();
0088     Q_EMIT isResizing(true);
0089 }
0090 
0091 void ThumbnailView::GridResizeSlider::leaveGridResizingMode()
0092 {
0093     if (!m_resizing)
0094         return; // not resizing
0095     m_resizing = false;
0096     qCDebug(ThumbnailViewLog) << "Leaving grid resizing mode";
0097 
0098     model()->beginResetModel();
0099     cellGeometryInfo()->flushCache();
0100     model()->endResetModel();
0101     model()->updateVisibleRowInfo();
0102     Q_EMIT isResizing(false);
0103 }
0104 
0105 void ThumbnailView::GridResizeSlider::setCellSize(int size)
0106 {
0107     blockSignals(true);
0108     Settings::SettingsData::instance()->setActualThumbnailSize(size);
0109     blockSignals(false);
0110 
0111     model()->beginResetModel();
0112     cellGeometryInfo()->calculateCellSize();
0113     model()->endResetModel();
0114 }
0115 
0116 void ThumbnailView::GridResizeSlider::setMaximum(int size)
0117 {
0118     // QSlider::setMaximum() is not a slot, which is why we need this slot as workaround
0119     QSlider::setMaximum(size);
0120 }
0121 
0122 // vi:expandtab:tabstop=4 shiftwidth=4:
0123 
0124 #include "moc_GridResizeSlider.cpp"