diff --git a/imageringlist.cpp b/imageringlist.cpp index 2b9aa99..64f1fc5 100644 --- a/imageringlist.cpp +++ b/imageringlist.cpp @@ -1,4 +1,5 @@ #include "imageringlist.h" +#include #include #include #include @@ -124,21 +125,36 @@ ImageRingList::~ImageRingList() m_thumbPool->waitForDone(); } -bool ImageRingList::setDir(const QString path, const QString ¤tFile) +bool ImageRingList::setDir(const QString path, const QString ¤tFile, bool recursive) { QDir dir(path); if(dir.exists()) { - QDir::SortFlags sortFlags = m_liveMode ? QDir::Time : m_sort | QDir::IgnoreCase; - if(m_reversed)sortFlags |= QDir::Reversed; - QStringList list = dir.entryList(m_nameFilter, QDir::Files | QDir::Readable, sortFlags); QStringList absolutePaths; - foreach(const QString &file, list) + std::function scanDir = [&](const QString &path) { - absolutePaths.append(dir.absoluteFilePath(file)); - } - setFiles(absolutePaths, m_liveMode ? list.first() : currentFile); + QDir dir(path); + QDir::SortFlags sortFlags = m_liveMode ? QDir::Time : m_sort | QDir::IgnoreCase; + if(m_reversed)sortFlags |= QDir::Reversed; + + if(recursive) + { + QStringList dirs = dir.entryList(QDir::Readable | QDir::Dirs | QDir::NoDotAndDotDot, sortFlags); + for(const QString &subdir : dirs) + scanDir(dir.absoluteFilePath(subdir)); + } + + QStringList list = dir.entryList(m_nameFilter, QDir::Files | QDir::Readable, sortFlags); + for(const QString &file : list) + { + absolutePaths.append(dir.absoluteFilePath(file)); + } + }; + + scanDir(path); + qDebug() << absolutePaths.size(); + setFiles(absolutePaths, m_liveMode ? absolutePaths.first() : currentFile); m_fileSystemWatcher.removePaths(m_fileSystemWatcher.directories()); m_fileSystemWatcher.addPath(path); @@ -151,7 +167,7 @@ void ImageRingList::setFile(const QString &file) { QFileInfo info(file); if(info.isDir()) - setDir(file); + setDir(file, QString(), true); else setDir(info.absolutePath(), file); } diff --git a/imageringlist.h b/imageringlist.h index 49933d0..14eb886 100644 --- a/imageringlist.h +++ b/imageringlist.h @@ -69,7 +69,7 @@ class ImageRingList : public QAbstractItemModel public: explicit ImageRingList(Database *database, const QStringList &nameFilter, QObject *parent = 0); ~ImageRingList() override; - bool setDir(const QString path, const QString ¤tFile = QString()); + bool setDir(const QString path, const QString ¤tFile = QString(), bool recursive = false); void setFile(const QString &file); ImagePtr currentImage(); void setLiveMode(bool live); diff --git a/imagescrollareagl.cpp b/imagescrollareagl.cpp index dc1b54e..9def140 100644 --- a/imagescrollareagl.cpp +++ b/imagescrollareagl.cpp @@ -211,7 +211,7 @@ void ImageWidget::allocateThumbnails(const QStringList &paths) m_thumbnailTexture->create(); m_thumbnailTexture->setFormat(QOpenGLTexture::RGB16_UNorm); m_thumbnailTexture->setSize(THUMB_SIZE, THUMB_SIZE); - m_thumbnailTexture->setLayers(paths.size()); + m_thumbnailTexture->setLayers(std::min((int)paths.size(), m_maxArrayLayers)); m_thumbnailTexture->allocateStorage(); } @@ -301,6 +301,9 @@ QImage ImageWidget::renderToImage() void ImageWidget::thumbnailLoaded(const Image *image) { + if(image->number() >= m_maxArrayLayers) + return; + makeCurrent(); const RawImage *raw = image->thumbnail(); if(!raw || !raw->valid())return; diff --git a/mainwindow.cpp b/mainwindow.cpp index f478863..099c04c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -144,6 +144,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) QMenu *fileMenu = new QMenu(tr("File"), this); fileMenu->addAction(tr("Open"), this, SLOT(loadFile()), QKeySequence::Open); + fileMenu->addAction(tr("Open directory recursively"), this, &MainWindow::loadDir); fileMenu->addAction(tr("Save as"), this, SLOT(saveAs()), QKeySequence::Save); fileMenu->addSeparator(); fileMenu->addAction(tr("Copy marked files"), this, SLOT(copyMarked()), Qt::Key_F5); @@ -487,6 +488,20 @@ void MainWindow::loadFile(int row) m_ringList->loadFile(row); } +void MainWindow::loadDir() +{ + QString dir = QFileDialog::getExistingDirectory(this, + tr("Open directory recursively"), + _lastDir); + if(!dir.isEmpty()) + { + _lastDir = dir; + m_ringList->setDir(dir, QString(), true); + QSettings settings; + settings.setValue("mainwindow/lastdir", _lastDir); + } +} + void MainWindow::indexDir() { QString dir = QFileDialog::getExistingDirectory(this, tr("Index directory"), _lastDir, QFileDialog::ShowDirsOnly); diff --git a/mainwindow.h b/mainwindow.h index 5e766d0..b140eed 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -48,6 +48,7 @@ protected slots: void loadFile(); void loadFile(const QString &path); void loadFile(int row); + void loadDir(); void indexDir(); void indexDir(const QString &dir); void reindex();