From 8bb97ed926e4bd267bdcf94809a06eb57c10a139 Mon Sep 17 00:00:00 2001 From: Alfred Reynolds Date: Wed, 8 Sep 2021 11:56:47 +1200 Subject: [PATCH] - Split ImageAspect into 2 types, ImageAspect for images and ImageAspectScreenFilter for screens - Change ImageDetails into a class and add some accessors for the filtering logic for screen aspect and image aspect --- src/appconfig.cpp | 10 ++++---- src/appconfig.h | 2 +- src/imageselector.cpp | 10 +------- src/imagestructs.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++ src/imagestructs.h | 15 ++++++++---- src/main.cpp | 2 +- src/mainwindow.cpp | 18 ++++----------- src/slide.pro | 1 + 8 files changed, 79 insertions(+), 33 deletions(-) create mode 100644 src/imagestructs.cpp diff --git a/src/appconfig.cpp b/src/appconfig.cpp index 724700a..a9fb920 100644 --- a/src/appconfig.cpp +++ b/src/appconfig.cpp @@ -14,21 +14,21 @@ const std::string AppConfig::valid_aspects = "alpm"; // all, landscape, portait, monitor -ImageAspect parseAspectFromString(char aspect) { +ImageAspectScreenFilter parseAspectFromString(char aspect) { switch(aspect) { case 'l': - return ImageAspect_Landscape; + return ImageAspectScreenFilter_Landscape; break; case 'p': - return ImageAspect_Portrait; + return ImageAspectScreenFilter_Portrait; break; case 'm': - return ImageAspect_Monitor; + return ImageAspectScreenFilter_Monitor; break; default: case 'a': - return ImageAspect_Any; + return ImageAspectScreenFilter_Any; break; } } diff --git a/src/appconfig.h b/src/appconfig.h index fce2c20..c5b3df1 100644 --- a/src/appconfig.h +++ b/src/appconfig.h @@ -79,7 +79,7 @@ struct AppConfig : public Config { AppConfig loadAppConfiguration(const AppConfig &commandLineConfig); Config getConfigurationForFolder(const std::string &folderPath, const Config ¤tConfig); -ImageAspect parseAspectFromString(char aspect); +ImageAspectScreenFilter parseAspectFromString(char aspect); QString getAppConfigFilePath(const std::string &configPath); #endif \ No newline at end of file diff --git a/src/imageselector.cpp b/src/imageselector.cpp index 469058f..13afb5f 100644 --- a/src/imageselector.cpp +++ b/src/imageselector.cpp @@ -100,13 +100,6 @@ ImageDetails ImageSelector::populateImageDetails(const std::string&fileName, con imageDetails.width = imageWidth; imageDetails.height = imageHeight; imageDetails.rotation = degrees; - if (imageWidth > imageHeight) { - imageDetails.aspect = ImageAspect_Landscape; - } else if (imageHeight > imageWidth) { - imageDetails.aspect = ImageAspect_Portrait; - } else { - imageDetails.aspect = ImageAspect_Any; - } imageDetails.options = pathTraverser->UpdateOptionsForImage(imageDetails.filename, baseOptions); @@ -161,8 +154,7 @@ bool ImageSelector::imageMatchesFilter(const ImageDetails& imageDetails) bool ImageSelector::imageValidForAspect(const ImageDetails& imageDetails) { - if (imageDetails.options.onlyAspect == ImageAspect_Any || - imageDetails.aspect == imageDetails.options.onlyAspect) + if (imageDetails.isValidForScreenAspect(imageDetails.options.onlyAspect)) { return true; } diff --git a/src/imagestructs.cpp b/src/imagestructs.cpp new file mode 100644 index 0000000..948f44b --- /dev/null +++ b/src/imagestructs.cpp @@ -0,0 +1,54 @@ + +#include "imagestructs.h" +#include "logger.h" + +ImageDetails::ImageDetails() +{ + +} + +ImageDetails::~ImageDetails() +{ + +} + +ImageAspect ImageDetails::aspect() const +{ + if (width > height) + { + return ImageAspect_Landscape; + } + else if (height > width) + { + return ImageAspect_Portrait; + } + + // must be square, so just pick something + return ImageAspect_Portrait; +} + + +bool ImageDetails::isValidForScreenAspect(const ImageAspectScreenFilter aspectScreen) const +{ + if(aspectScreen == ImageAspectScreenFilter_Any) + { + return true; + } + if(aspectScreen == ImageAspectScreenFilter_Monitor) + { + Log("Error: invalid aspect of ImageAspectScreenFilter_Monitor" ); + return false; + } + + if (width > height) + { + return aspectScreen == ImageAspectScreenFilter_Landscape; + } + else if (height > width) + { + return aspectScreen == ImageAspectScreenFilter_Portrait; + } + + // must be square so let is always display + return true; +} diff --git a/src/imagestructs.h b/src/imagestructs.h index b7042ba..0ccf3c7 100644 --- a/src/imagestructs.h +++ b/src/imagestructs.h @@ -6,7 +6,8 @@ #include // possible aspect ratios of an image -enum ImageAspect { ImageAspect_Landscape = 0, ImageAspect_Portrait, ImageAspect_Any, ImageAspect_Monitor /* match monitors aspect */ }; +enum ImageAspect { ImageAspect_Landscape = 0, ImageAspect_Portrait}; +enum ImageAspectScreenFilter { ImageAspectScreenFilter_Landscape = 0, ImageAspectScreenFilter_Portrait, ImageAspectScreenFilter_Any, ImageAspectScreenFilter_Monitor /* match monitors aspect */ }; struct DisplayTimeWindow { @@ -22,18 +23,24 @@ struct DisplayTimeWindow // options to consider when displaying an image struct ImageDisplayOptions { - ImageAspect onlyAspect = ImageAspect_Any; + ImageAspectScreenFilter onlyAspect = ImageAspectScreenFilter_Any; bool fitAspectAxisToWindow = false; QVector timeWindows; }; // details of a particular image -struct ImageDetails +class ImageDetails { +public: + ImageDetails(); + ~ImageDetails(); + bool isValidForScreenAspect(const ImageAspectScreenFilter aspectDisplay) const; + ImageAspect aspect() const; + +public: int width = 0; int height = 0; int rotation = 0; - ImageAspect aspect = ImageAspect_Any; std::string filename; ImageDisplayOptions options; }; diff --git a/src/main.cpp b/src/main.cpp index 2b54d1b..3dd747a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,7 +51,7 @@ bool parseCommandLine(AppConfig &appConfig, int argc, char *argv[]) { if (appConfig.valid_aspects.find(optarg[0]) == std::string::npos) { std::cout << "Invalid Aspect option, defaulting to all" << std::endl; - appConfig.baseDisplayOptions.onlyAspect = ImageAspect_Any; + appConfig.baseDisplayOptions.onlyAspect = ImageAspectScreenFilter_Any; } else { diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e942443..717c133 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -139,7 +139,7 @@ void MainWindow::checkWindowSize() if (imageAspectMatchesMonitor) { bool isLandscape = screenSize.width() > screenSize.height(); - ImageAspect newAspect = isLandscape ? ImageAspect_Landscape : ImageAspect_Portrait; + ImageAspectScreenFilter newAspect = isLandscape ? ImageAspectScreenFilter_Landscape : ImageAspectScreenFilter_Portrait; if (newAspect != baseImageOptions.onlyAspect) { Log("Changing image orientation to ", newAspect); @@ -218,14 +218,6 @@ void MainWindow::updateImage(bool immediately) currentImage.width = p.width(); currentImage.height = p.height(); currentImage.rotation = 0; - if (currentImage.width > currentImage.height) { - currentImage.aspect = ImageAspect_Landscape; - } else if (currentImage.height > currentImage.width) { - currentImage.aspect = ImageAspect_Portrait; - } else { - currentImage.aspect = ImageAspect_Any; - } - } else { @@ -331,13 +323,13 @@ QPixmap MainWindow::getScaledPixmap(const QPixmap& p) { if (currentImage.options.fitAspectAxisToWindow) { - if (currentImage.aspect == ImageAspect_Portrait) + if (currentImage.aspect() == ImageAspect_Portrait) { // potrait mode, make height of image fit screen and crop top/bottom QPixmap pTemp = p.scaledToHeight(height(), Qt::SmoothTransformation); return pTemp.copy(0,0,width(),height()); } - else if (currentImage.aspect == ImageAspect_Landscape) + else if (currentImage.aspect() == ImageAspect_Landscape) { // landscape mode, make width of image fit screen and crop top/bottom QPixmap pTemp = p.scaledToWidth(width(), Qt::SmoothTransformation); @@ -410,10 +402,10 @@ void MainWindow::warn(std::string text) void MainWindow::setBaseOptions(const ImageDisplayOptions &baseOptionsIn) { baseImageOptions = baseOptionsIn; - if(baseImageOptions.onlyAspect == ImageAspect_Monitor) + if(baseImageOptions.onlyAspect == ImageAspectScreenFilter_Monitor) { imageAspectMatchesMonitor = true; - baseImageOptions.onlyAspect = width() >= height() ? ImageAspect_Landscape : ImageAspect_Portrait; + baseImageOptions.onlyAspect = width() >= height() ? ImageAspectScreenFilter_Landscape : ImageAspectScreenFilter_Portrait; } } diff --git a/src/slide.pro b/src/slide.pro index de08fca..04cc324 100644 --- a/src/slide.pro +++ b/src/slide.pro @@ -38,6 +38,7 @@ SOURCES += \ overlay.cpp \ imageselector.cpp \ appconfig.cpp \ + imagestructs.cpp \ logger.cpp HEADERS += \