diff --git a/src/imageselector.cpp b/src/imageselector.cpp index f4cf6b2..7d5cb13 100644 --- a/src/imageselector.cpp +++ b/src/imageselector.cpp @@ -1,5 +1,6 @@ #include "imageselector.h" #include "mainwindow.h" +#include #include #include #include @@ -7,11 +8,12 @@ #include /* srand, rand */ #include /* time */ -ImageSelector::ImageSelector(MainWindow& w, unsigned int timeout, std::string path): +ImageSelector::ImageSelector(MainWindow& w, unsigned int timeout, std::string path, bool recursive): QObject::QObject(), window(w), timeout(timeout), path(path), + recursive(recursive), timer(this) { srand (time(NULL)); @@ -20,15 +22,41 @@ ImageSelector::ImageSelector(MainWindow& w, unsigned int timeout, std::string pa void ImageSelector::updateImage() { QDir directory(path.c_str()); - QStringList images = directory.entryList(QStringList() << "*.jpg" << "*.JPG",QDir::Files); + QStringList images; + if (recursive) + { + images = listImagesRecursive(); + } + else + { + images = directory.entryList(QStringList() << "*.jpg" << "*.JPG", QDir::Files); + } + std::cout << "images: " << images.size() << std::endl; + if (images.size() == 0) + { + std::cerr << "No jpg images found in folder " << path << std::endl; + return; + } unsigned int selectedImage = rand() % images.size(); std::string filename = directory.filePath(images.at(selectedImage)).toStdString(); std::cout << "updating image: " << filename << std::endl; window.setImage(filename); } -void ImageSelector::start(){ +void ImageSelector::start() +{ updateImage(); connect(&timer, SIGNAL(timeout()), this, SLOT(updateImage())); timer.start(timeout); } + +QStringList ImageSelector::listImagesRecursive() +{ + QDirIterator it(QString(path.c_str()), QStringList() << "*.jpg" << "*.JPG", QDir::Files, QDirIterator::Subdirectories); + QStringList files; + while (it.hasNext()) + { + files.append(it.next()); + } + return files; +} diff --git a/src/imageselector.h b/src/imageselector.h index f9bffd4..c3b498b 100644 --- a/src/imageselector.h +++ b/src/imageselector.h @@ -9,15 +9,17 @@ class ImageSelector : public QObject { Q_OBJECT public: - ImageSelector(MainWindow& w, unsigned int timeout, std::string path); + ImageSelector(MainWindow& w, unsigned int timeout, std::string path, bool recursive); void start(); public slots: void updateImage(); private: + QStringList listImagesRecursive(); MainWindow& window; unsigned int timeout; std::string path; + bool recursive; QTimer timer; }; diff --git a/src/main.cpp b/src/main.cpp index dbc66d7..6b2e342 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,7 +10,7 @@ #include void usage(std::string programName) { - std::cerr << "Usage: " << programName << " [-t rotation_seconds] [-o background_opacity(0..255)] [-b blur_radius] -p image_folder" << std::endl; + std::cerr << "Usage: " << programName << " [-t rotation_seconds] [-o background_opacity(0..255)] [-b blur_radius] -p image_folder -r" << std::endl; } int main(int argc, char *argv[]) @@ -22,7 +22,8 @@ int main(int argc, char *argv[]) MainWindow w; int opt; - while ((opt = getopt(argc, argv, "b:p:t:o:")) != -1) { + bool recursive = false; + while ((opt = getopt(argc, argv, "b:p:t:o:r")) != -1) { switch (opt) { case 'p': path = optarg; @@ -36,6 +37,9 @@ int main(int argc, char *argv[]) case 'o': w.setBackgroundOpacity(atoi(optarg)); break; + case 'r': + recursive = true; + break; default: /* '?' */ usage(argv[0]); return 1; @@ -49,7 +53,7 @@ int main(int argc, char *argv[]) } w.show(); - ImageSelector is(w, rotationSeconds * 1000, path); + ImageSelector is(w, rotationSeconds * 1000, path, recursive); is.start(); return a.exec(); }