diff --git a/src/imageselector.cpp b/src/imageselector.cpp index c9e1b9d..b3dc3c0 100644 --- a/src/imageselector.cpp +++ b/src/imageselector.cpp @@ -8,46 +8,80 @@ #include #include /* srand, rand */ #include /* time */ - +#include // std::shuffle +#include // std::default_random_engine ImageSelector::ImageSelector(std::unique_ptr& pathTraverser): - pathTraverser(pathTraverser) + pathTraverser(pathTraverser) { } ImageSelector::~ImageSelector(){} -DefaultImageSelector::DefaultImageSelector(std::unique_ptr& pathTraverser): - ImageSelector(pathTraverser) +RandomImageSelector::RandomImageSelector(std::unique_ptr& pathTraverser): + ImageSelector(pathTraverser) { - srand (time(NULL)); + srand (time(NULL)); } -DefaultImageSelector::~DefaultImageSelector(){} +RandomImageSelector::~RandomImageSelector(){} -std::string DefaultImageSelector::getNextImage() const +std::string RandomImageSelector::getNextImage() { - std:: string filename; - try - { - QStringList images = pathTraverser->getImages(); - unsigned int selectedImage = selectRandom(images); - filename = pathTraverser->getImagePath(images.at(selectedImage).toStdString()); - } - catch(const std::string& err) - { - std::cerr << "Error: " << err << std::endl; - } - std::cout << "updating image: " << filename << std::endl; - return filename; + std:: string filename; + try + { + QStringList images = pathTraverser->getImages(); + unsigned int selectedImage = selectRandom(images); + filename = pathTraverser->getImagePath(images.at(selectedImage).toStdString()); + } + catch(const std::string& err) + { + std::cerr << "Error: " << err << std::endl; + } + std::cout << "updating image: " << filename << std::endl; + return filename; } -unsigned int DefaultImageSelector::selectRandom(const QStringList& images) const +unsigned int RandomImageSelector::selectRandom(const QStringList& images) const { - std::cout << "images: " << images.size() << std::endl; - if (images.size() == 0) - { - throw std::string("No jpg images found in given folder"); - } - return rand() % images.size(); + std::cout << "images: " << images.size() << std::endl; + if (images.size() == 0) + { + throw std::string("No jpg images found in given folder"); + } + return rand() % images.size(); +} + +ShuffleImageSelector::ShuffleImageSelector(std::unique_ptr& pathTraverser): + ImageSelector(pathTraverser), + current_image_shuffle(-1), + images() +{ + srand (time(NULL)); +} + +ShuffleImageSelector::~ShuffleImageSelector() +{ +} + +std::string ShuffleImageSelector::getNextImage() +{ + if (images.size() == 0 || current_image_shuffle == images.size()) + { + current_image_shuffle = 0; + images = pathTraverser->getImages(); + std::cout << "Shuffling " << images.size() << " images." << std::endl; + std::random_device rd; + std::mt19937 randomizer(rd()); + std::shuffle(images.begin(), images.end(), randomizer); + } + if (images.size() == 0) + { + return ""; + } + std::string filename = pathTraverser->getImagePath(images.at(current_image_shuffle).toStdString()); + std::cout << "updating image: " << filename << std::endl; + current_image_shuffle = current_image_shuffle + 1; + return filename; } diff --git a/src/imageselector.h b/src/imageselector.h index beea8c9..b01d662 100644 --- a/src/imageselector.h +++ b/src/imageselector.h @@ -13,21 +13,33 @@ class ImageSelector public: ImageSelector(std::unique_ptr& pathTraverser); virtual ~ImageSelector(); - virtual std::string getNextImage() const = 0; + virtual std::string getNextImage() = 0; protected: std::unique_ptr& pathTraverser; }; -class DefaultImageSelector : public ImageSelector +class RandomImageSelector : public ImageSelector { public: - DefaultImageSelector(std::unique_ptr& pathTraverser); - virtual ~DefaultImageSelector(); - virtual std::string getNextImage() const; + RandomImageSelector(std::unique_ptr& pathTraverser); + virtual ~RandomImageSelector(); + virtual std::string getNextImage(); private: unsigned int selectRandom(const QStringList& images) const; }; +class ShuffleImageSelector : public ImageSelector +{ +public: + ShuffleImageSelector(std::unique_ptr& pathTraverser); + virtual ~ShuffleImageSelector(); + virtual std::string getNextImage(); + +private: + int current_image_shuffle; + QStringList images; +}; + #endif // IMAGESELECTOR_H diff --git a/src/main.cpp b/src/main.cpp index 8757bc4..e7c0a7e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,7 +26,8 @@ int main(int argc, char *argv[]) MainWindow w; int opt; bool recursive = false; - while ((opt = getopt(argc, argv, "b:p:t:o:r")) != -1) { + bool shuffle = false; + while ((opt = getopt(argc, argv, "b:p:t:o:rs")) != -1) { switch (opt) { case 'p': path = optarg; @@ -43,6 +44,10 @@ int main(int argc, char *argv[]) case 'r': recursive = true; break; + case 's': + shuffle = true; + std::cout << "Shuffle mode is on." << std::endl; + break; default: /* '?' */ usage(argv[0]); return 1; @@ -60,11 +65,21 @@ int main(int argc, char *argv[]) if (recursive) { pathTraverser = std::unique_ptr(new RecursivePathTraverser(path)); - } else { + } + else + { pathTraverser = std::unique_ptr(new DefaultPathTraverser(path)); } - std::unique_ptr selector = std::unique_ptr(new DefaultImageSelector(pathTraverser)); + std::unique_ptr selector; + if (shuffle) + { + selector = std::unique_ptr(new ShuffleImageSelector(pathTraverser)); + } + else + { + selector = std::unique_ptr(new RandomImageSelector(pathTraverser)); + } w.show();