Enable shuffle mode

Co-authored-by: data-dude92 <60513060+data-dude92@users.noreply.github.com>
This commit is contained in:
Manuel
2020-02-13 23:16:58 +01:00
parent db09dc43f2
commit d21677399d
3 changed files with 96 additions and 35 deletions

View File

@@ -8,7 +8,8 @@
#include <iostream>
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
#include <algorithm> // std::shuffle
#include <random> // std::default_random_engine
ImageSelector::ImageSelector(std::unique_ptr<PathTraverser>& pathTraverser):
pathTraverser(pathTraverser)
@@ -17,15 +18,15 @@ ImageSelector::ImageSelector(std::unique_ptr<PathTraverser>& pathTraverser):
ImageSelector::~ImageSelector(){}
DefaultImageSelector::DefaultImageSelector(std::unique_ptr<PathTraverser>& pathTraverser):
RandomImageSelector::RandomImageSelector(std::unique_ptr<PathTraverser>& pathTraverser):
ImageSelector(pathTraverser)
{
srand (time(NULL));
}
DefaultImageSelector::~DefaultImageSelector(){}
RandomImageSelector::~RandomImageSelector(){}
std::string DefaultImageSelector::getNextImage() const
std::string RandomImageSelector::getNextImage()
{
std:: string filename;
try
@@ -42,7 +43,7 @@ std::string DefaultImageSelector::getNextImage() const
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)
@@ -51,3 +52,36 @@ unsigned int DefaultImageSelector::selectRandom(const QStringList& images) const
}
return rand() % images.size();
}
ShuffleImageSelector::ShuffleImageSelector(std::unique_ptr<PathTraverser>& 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;
}

View File

@@ -13,21 +13,33 @@ class ImageSelector
public:
ImageSelector(std::unique_ptr<PathTraverser>& pathTraverser);
virtual ~ImageSelector();
virtual std::string getNextImage() const = 0;
virtual std::string getNextImage() = 0;
protected:
std::unique_ptr<PathTraverser>& pathTraverser;
};
class DefaultImageSelector : public ImageSelector
class RandomImageSelector : public ImageSelector
{
public:
DefaultImageSelector(std::unique_ptr<PathTraverser>& pathTraverser);
virtual ~DefaultImageSelector();
virtual std::string getNextImage() const;
RandomImageSelector(std::unique_ptr<PathTraverser>& 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>& pathTraverser);
virtual ~ShuffleImageSelector();
virtual std::string getNextImage();
private:
int current_image_shuffle;
QStringList images;
};
#endif // IMAGESELECTOR_H

View File

@@ -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<PathTraverser>(new RecursivePathTraverser(path));
} else {
}
else
{
pathTraverser = std::unique_ptr<PathTraverser>(new DefaultPathTraverser(path));
}
std::unique_ptr<ImageSelector> selector = std::unique_ptr<ImageSelector>(new DefaultImageSelector(pathTraverser));
std::unique_ptr<ImageSelector> selector;
if (shuffle)
{
selector = std::unique_ptr<ImageSelector>(new ShuffleImageSelector(pathTraverser));
}
else
{
selector = std::unique_ptr<ImageSelector>(new RandomImageSelector(pathTraverser));
}
w.show();