From da9b38940949451ca5bd923b7fe86a156861a6c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Fri, 5 Jan 2024 13:36:06 +0100 Subject: [PATCH] Add slideshow --- imageringlist.cpp | 22 ++++++++++++++++++++++ imageringlist.h | 6 ++++-- mainwindow.cpp | 2 ++ settingsdialog.cpp | 11 ++++++++++- settingsdialog.h | 1 + 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/imageringlist.cpp b/imageringlist.cpp index 3aeeca5..689ca38 100644 --- a/imageringlist.cpp +++ b/imageringlist.cpp @@ -1,6 +1,8 @@ #include "imageringlist.h" #include #include +#include +#include #include "loadrunable.h" #include "rawimage.h" #include "database.h" @@ -108,6 +110,9 @@ ImageRingList::ImageRingList(Database *database, const QStringList &nameFilter, connect(&m_fileSystemWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(dirChanged(QString))); m_nameFilter.replaceInStrings(QRegularExpression("^"), "*."); m_thumbPool = new QThreadPool(this); + + m_slideShowTimer = new QTimer(this); + connect(m_slideShowTimer, &QTimer::timeout, this, static_cast(&ImageRingList::increment)); } ImageRingList::~ImageRingList() @@ -295,11 +300,13 @@ void ImageRingList::clearThumbnails() QModelIndex ImageRingList::index(int row, int column, const QModelIndex &parent) const { + Q_UNUSED(parent); return createIndex(row, column, m_images.at(row).get()); } QModelIndex ImageRingList::parent(const QModelIndex &child) const { + Q_UNUSED(child); return QModelIndex(); } @@ -313,6 +320,7 @@ int ImageRingList::rowCount(const QModelIndex &parent) const int ImageRingList::columnCount(const QModelIndex &parent) const { + Q_UNUSED(parent); return 1; } @@ -398,6 +406,20 @@ void ImageRingList::reverseSort() } } +void ImageRingList::toggleSlideshow(bool start) +{ + if(start) + { + QSettings settings; + int time = settings.value("settings/slideshowtime", 1.0).toDouble() * 1000; + m_slideShowTimer->start(time); + } + else + { + m_slideShowTimer->stop(); + } +} + void ImageRingList::setFiles(const QStringList files, const QString ¤tFile) { QThreadPool::globalInstance()->clear(); diff --git a/imageringlist.h b/imageringlist.h index 95cbc18..49933d0 100644 --- a/imageringlist.h +++ b/imageringlist.h @@ -65,14 +65,13 @@ class ImageRingList : public QAbstractItemModel QThreadPool *m_thumbPool; Database *m_database; QStringList m_nameFilter; + QTimer *m_slideShowTimer; public: explicit ImageRingList(Database *database, const QStringList &nameFilter, QObject *parent = 0); ~ImageRingList() override; bool setDir(const QString path, const QString ¤tFile = QString()); void setFile(const QString &file); ImagePtr currentImage(); - void increment(); - void decrement(); void setLiveMode(bool live); void setCalculateStats(bool stats); void setFindPeaks(bool findPeaks); @@ -96,6 +95,9 @@ public slots: void setPreload(int width); void setSort(QDir::SortFlag sort); void reverseSort(); + void toggleSlideshow(bool start); + void increment(); + void decrement(); protected: void setFiles(const QStringList files, const QString ¤tFile = QString()); QList::iterator increment(QList::iterator iter); diff --git a/mainwindow.cpp b/mainwindow.cpp index 4beb4cb..7c0f3e8 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -181,6 +181,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) else m_ringList->stopLoading(); }, Qt::Key_F2); thumbnailsAction->setCheckable(true); + QAction *slideshowAction = viewMenu->addAction(tr("Slideshow"), m_ringList, &ImageRingList::toggleSlideshow, Qt::Key_F3); + slideshowAction->setCheckable(true); menuBar()->addMenu(viewMenu); QMenu *selectMenu = new QMenu(tr("Select"), this); diff --git a/settingsdialog.cpp b/settingsdialog.cpp index 3e8f870..cb20160 100644 --- a/settingsdialog.cpp +++ b/settingsdialog.cpp @@ -57,6 +57,13 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) m_saturation->setValue(settings.value("settings/saturation", SATURATION * 100.0).toDouble()); m_saturation->setToolTip(tr("Set threshold value that is considered saturated when showing statistics.\nFor RAW files you may set 22%")); + m_slideShowTime = new QDoubleSpinBox(this); + m_slideShowTime->setMinimum(0.01); + m_slideShowTime->setMaximum(10); + m_slideShowTime->setSuffix(" s"); + m_slideShowTime->setValue(settings.value("settings/slideshowtime", 1.0).toDouble()); + m_slideShowTime->setSingleStep(0.1); + //m_slideShowTime->setStepType(QAbstractSpinBox::AdaptiveDecimalStepType); m_useNativeDialog = new QCheckBox(tr("Don't use native file dialog"), this); m_useNativeDialog->setChecked(QApplication::testAttribute(Qt::AA_DontUseNativeDialogs)); @@ -67,8 +74,9 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) layout->addRow(tr("Image preload count"), m_preloadImages); layout->addRow(tr("Thumbnails size"), m_thumSize); layout->addRow(tr("Saturation"), m_saturation); - layout->addRow(m_useNativeDialog); + layout->addRow(tr("Slideshow interval"), m_slideShowTime); layout->addRow(tr("Image filtering"), m_filtering); + layout->addRow(m_useNativeDialog); //layout->addRow(new QLabel(tr("Changes in settings will take effect after program restart."))); QDialogButtonBox *buttonBox = new QDialogButtonBox(this); @@ -109,6 +117,7 @@ void SettingsDialog::saveSettings() settings.setValue("settings/preloadimagecount", m_preloadImages->value()); settings.setValue("settings/dontusenativedialogs", m_useNativeDialog->isChecked()); settings.setValue("settings/saturation", m_saturation->value()); + settings.setValue("settings/slideshowtime", m_slideShowTime->value()); FILTERING = m_filtering->currentIndex(); settings.setValue("settings/filtering", FILTERING); SATURATION = m_saturation->value() / 100.0; diff --git a/settingsdialog.h b/settingsdialog.h index 7fb4f9f..972536e 100644 --- a/settingsdialog.h +++ b/settingsdialog.h @@ -20,6 +20,7 @@ private: QSpinBox *m_preloadImages; QSpinBox *m_thumSize; + QDoubleSpinBox *m_slideShowTime; QDoubleSpinBox *m_saturation; QCheckBox *m_useNativeDialog; QComboBox *m_filtering;