#ifndef IMAGESELECTOR_H #define IMAGESELECTOR_H #include #include #include #include #include "imagestructs.h" class MainWindow; class PathTraverser; class ImageSelector { public: ImageSelector(std::unique_ptr& pathTraverser); ImageSelector(); // use case for when you don't own your own traverser virtual ~ImageSelector(); virtual const ImageDetails getNextImage(const ImageDisplayOptions &baseOptions) = 0; protected: ImageDetails populateImageDetails(const std::string&filename, const ImageDisplayOptions &baseOptions); bool imageValidForAspect(const ImageDetails& imageDetails); bool imageMatchesFilter(const ImageDetails& imageDetails); bool imageInsideTimeWindow(const QVector &timeWindows); std::unique_ptr pathTraverser; }; class RandomImageSelector : public ImageSelector { public: RandomImageSelector(std::unique_ptr& pathTraverser); virtual ~RandomImageSelector(); virtual const ImageDetails getNextImage(const ImageDisplayOptions &baseOptions); private: unsigned int selectRandom(const QStringList& images) const; }; class ShuffleImageSelector : public ImageSelector { public: ShuffleImageSelector(std::unique_ptr& pathTraverser); virtual ~ShuffleImageSelector(); virtual const ImageDetails getNextImage(const ImageDisplayOptions &baseOptions); private: void reloadImagesIfNoneLeft(); int current_image_shuffle; QStringList images; }; class SortedImageSelector : public ImageSelector { public: SortedImageSelector(std::unique_ptr& pathTraverser); virtual ~SortedImageSelector(); virtual const ImageDetails getNextImage(const ImageDisplayOptions &baseOptions); private: void reloadImagesIfEmpty(); QStringList images; }; class ListImageSelector : public ImageSelector { public: ListImageSelector(); virtual ~ListImageSelector(); virtual const ImageDetails getNextImage(const ImageDisplayOptions &baseOptions); void AddImageSelector(std::unique_ptr& selector, const bool exclusiveIn, const ImageDisplayOptions& baseDisplayOptionsIn); private: struct SelectoryEntry { std::unique_ptr selector; ImageDisplayOptions baseDisplayOptions; bool exclusive = false; }; std::vector imageSelectors; std::vector::iterator currentSelector; }; #endif // IMAGESELECTOR_H