wallpapers/image/backgroundlistmodel.cpp | 6 +- wallpapers/image/backgroundlistmodel.h | 1 + wallpapers/image/image.cpp | 41 +++++++++++--- wallpapers/image/image.h | 32 ++++++++++- .../image/imagepackage/contents/config/main.xml | 22 +++++++- .../image/imagepackage/contents/ui/config.qml | 65 +++++++++++++++++++--- wallpapers/image/imagepackage/contents/ui/main.qml | 6 +- .../slideshowpackage/contents/config/main.xml | 22 +++++++- 8 files changed, 172 insertions(+), 23 deletions(-) diff --git a/wallpapers/image/backgroundlistmodel.cpp b/wallpapers/image/backgroundlistmodel.cpp index 1598e5df..b077447e 100644 --- a/wallpapers/image/backgroundlistmodel.cpp +++ b/wallpapers/image/backgroundlistmodel.cpp @@ -489,6 +489,7 @@ const QStringList BackgroundListModel::wallpapersAwaitingDeletion() BackgroundFinder::BackgroundFinder(Image *wallpaper, const QStringList &paths) : QThread(wallpaper), + m_wallpaper(wallpaper), m_paths(paths), m_token(QUuid().toString()) { @@ -541,6 +542,8 @@ void BackgroundFinder::run() QDir dir; dir.setFilter(QDir::AllDirs | QDir::Files | QDir::Readable); + dir.setSorting(QFlags(m_wallpaper->slideSort())); + qCDebug(IMAGEWALLPAPER) << "Sorting " << m_wallpaper->slideSort() << "-->" << QFlags(m_wallpaper->slideSort()); dir.setNameFilters(suffixes()); KPackage::Package package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Wallpaper/Images")); @@ -549,6 +552,7 @@ void BackgroundFinder::run() const QString path = m_paths.at(i); dir.setPath(path); const QFileInfoList files = dir.entryInfoList(); + qCDebug(IMAGEWALLPAPER) << "Files " << files; Q_FOREACH (const QFileInfo &wp, files) { if (wp.isDir()) { //qCDebug(IMAGEWALLPAPER) << "scanning directory" << wp.fileName(); @@ -585,6 +589,4 @@ void BackgroundFinder::run() deleteLater(); } - - #endif // BACKGROUNDLISTMODEL_CPP diff --git a/wallpapers/image/backgroundlistmodel.h b/wallpapers/image/backgroundlistmodel.h index 516eb3ca..80d2978b 100644 --- a/wallpapers/image/backgroundlistmodel.h +++ b/wallpapers/image/backgroundlistmodel.h @@ -140,6 +140,7 @@ Q_SIGNALS: protected: void run() override; + QPointer m_wallpaper; private: QStringList m_paths; diff --git a/wallpapers/image/image.cpp b/wallpapers/image/image.cpp index 5d9e4c64..b73eb0d4 100644 --- a/wallpapers/image/image.cpp +++ b/wallpapers/image/image.cpp @@ -66,7 +66,8 @@ Image::Image(QObject *parent) m_currentSlide(-1), m_model(nullptr), m_slideshowModel(nullptr), - m_dialog(nullptr) + m_dialog(nullptr), + m_slideSort(Unsorted) { m_wallpaperPackage = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Wallpaper/Images")); @@ -149,7 +150,6 @@ void Image::setRenderingMode(RenderingMode mode) startSlideshow(); updateDirWatch(m_slidePaths); - updateDirWatch(m_slidePaths); } else { // we need to reset the preferred image setSingleImage(); @@ -547,7 +547,7 @@ void Image::addUrl(const QUrl &url, bool setAsCurrent) if (m_mode != SingleImage) { // it's a slide show, add it to the slide show m_slideshowBackgrounds.append(path); - m_unseenSlideshowBackgrounds.append(path); + //m_unseenSlideshowBackgrounds.append(path); } // always add it to the user papers, though addUsersWallpaper(path); @@ -577,7 +577,7 @@ void Image::setWallpaper(const QString &path) setSingleImage(); } else { m_slideshowBackgrounds.append(path); - m_unseenSlideshowBackgrounds.clear(); + //m_unseenSlideshowBackgrounds.clear(); m_currentSlide = m_slideshowBackgrounds.size() - 2; nextSlide(); } @@ -594,7 +594,7 @@ void Image::startSlideshow() // populate background list m_timer.stop(); m_slideshowBackgrounds.clear(); - m_unseenSlideshowBackgrounds.clear(); + //m_unseenSlideshowBackgrounds.clear(); BackgroundFinder *finder = new BackgroundFinder(this, m_dirs); m_findToken = finder->token(); connect(finder, &BackgroundFinder::backgroundsFound, this, &Image::backgroundsFound); @@ -623,7 +623,7 @@ void Image::backgroundsFound(const QStringList &paths, const QString &token) for(const QString &slide : qAsConst(m_uncheckedSlides)) { m_slideshowBackgrounds.removeAll(QUrl(slide).path()); } - m_unseenSlideshowBackgrounds.clear(); + //m_unseenSlideshowBackgrounds.clear(); // start slideshow if (m_slideshowBackgrounds.isEmpty()) { // no image has been found, which is quite weird... try again later (this is useful for events which @@ -763,6 +763,7 @@ void Image::nextSlide() return; } + /* QString previousPath; if (m_currentSlide > -1 && m_currentSlide < m_unseenSlideshowBackgrounds.size()) { previousPath = m_unseenSlideshowBackgrounds.takeAt(m_currentSlide); @@ -785,6 +786,12 @@ void Image::nextSlide() m_currentSlide = KRandom::random() % m_unseenSlideshowBackgrounds.size(); const QString currentPath = m_unseenSlideshowBackgrounds.at(m_currentSlide); + */ + if (m_currentSlide < -1) { + m_currentSlide = -1; + } + m_currentSlide = (m_currentSlide + 1) % m_slideshowBackgrounds.size(); + const QString currentPath = m_slideshowBackgrounds.at(m_currentSlide); m_wallpaperPackage.setPath(currentPath); findPreferedImageInPackage(m_wallpaperPackage); @@ -820,7 +827,7 @@ void Image::pathCreated(const QString &path) QFileInfo fileInfo(path); if(fileInfo.isFile() && BackgroundFinder::isAcceptableSuffix(fileInfo.suffix())) { m_slideshowBackgrounds.append(path); - m_unseenSlideshowBackgrounds.append(path); + //m_unseenSlideshowBackgrounds.append(path); if(m_slideshowBackgrounds.count() == 1) { nextSlide(); } @@ -831,7 +838,7 @@ void Image::pathCreated(const QString &path) void Image::pathDeleted(const QString &path) { if(m_slideshowBackgrounds.removeAll(path)) { - m_unseenSlideshowBackgrounds.removeAll(path); + //m_unseenSlideshowBackgrounds.removeAll(path); if(path == m_img) { nextSlide(); } @@ -927,3 +934,21 @@ void Image::setUncheckedSlides(const QStringList &uncheckedSlides) emit uncheckedSlidesChanged(); startSlideshow(); } + +Image::SortingMode Image::slideSort() const +{ + return m_slideSort; +} + +void Image::setSlideSort(Image::SortingMode sortingMode) +{ + if (sortingMode == m_slideSort) { + return; + } + m_slideSort = sortingMode; + if (m_mode == SlideShow) { + updateDirWatch(m_slidePaths); + startSlideshow(); + } + emit slideSortChanged(); +} diff --git a/wallpapers/image/image.h b/wallpapers/image/image.h index e3526a41..fe4f4316 100644 --- a/wallpapers/image/image.h +++ b/wallpapers/image/image.h @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -64,6 +65,7 @@ class Image : public QObject, public QQmlParserStatus Q_PROPERTY(QSize targetSize READ targetSize WRITE setTargetSize NOTIFY targetSizeChanged) Q_PROPERTY(QString photosPath READ photosPath CONSTANT) Q_PROPERTY(QStringList uncheckedSlides READ uncheckedSlides WRITE setUncheckedSlides NOTIFY uncheckedSlidesChanged) + Q_PROPERTY(SortingMode slideSort READ slideSort WRITE setSlideSort NOTIFY slideSortChanged) public: @@ -72,6 +74,29 @@ class Image : public QObject, public QQmlParserStatus SlideShow }; Q_ENUM(RenderingMode) + + enum SortingMode { + Unsorted = QDir::Unsorted, + SortByName = QDir::Name, + SortByTime = QDir::Time, + SortBySize = QDir::Size, + SortByType = QDir::Type, + + SortByMask = QDir::SortByMask, + + SortReversed = QDir::Reversed, + + SortDirsFirst = QDir::DirsFirst, + SortDirsLast = QDir::DirsLast, + + SortIgnoreCase = QDir::IgnoreCase, + SortLocaleAware = QDir::LocaleAware, + + //SortNoSort = QDir::NoSort + }; + Q_ENUM(SortingMode) + //Q_DECLARE_FLAGS(SortingModes, SortingMode) + //Q_FLAG(SortingModes) explicit Image(QObject* parent = nullptr); ~Image() override; @@ -124,6 +149,9 @@ class Image : public QObject, public QQmlParserStatus QStringList uncheckedSlides() const; void setUncheckedSlides(const QStringList &uncheckedSlides); + + SortingMode slideSort() const; + void setSlideSort(SortingMode sortingMode); public Q_SLOTS: void nextSlide(); @@ -140,6 +168,7 @@ class Image : public QObject, public QQmlParserStatus void resizeMethodChanged(); void customWallpaperPicked(const QString &path); void uncheckedSlidesChanged(); + void slideSortChanged(); protected Q_SLOTS: void showAddSlidePathsDialog(); @@ -183,9 +212,10 @@ class Image : public QObject, public QQmlParserStatus RenderingMode m_mode; KPackage::Package m_wallpaperPackage; QStringList m_slideshowBackgrounds; - QStringList m_unseenSlideshowBackgrounds; + //QStringList m_unseenSlideshowBackgrounds; QStringList m_slidePaths; QStringList m_uncheckedSlides; + SortingMode m_slideSort; QTimer m_timer; int m_currentSlide; BackgroundListModel *m_model; diff --git a/wallpapers/image/imagepackage/contents/config/main.xml b/wallpapers/image/imagepackage/contents/config/main.xml index 824bbd48..ce720520 100644 --- a/wallpapers/image/imagepackage/contents/config/main.xml +++ b/wallpapers/image/imagepackage/contents/config/main.xml @@ -31,9 +31,29 @@ 10 - + 1000 + + + 0 + + + + 0 + + + + false + + + + false + + + + false + diff --git a/wallpapers/image/imagepackage/contents/ui/config.qml b/wallpapers/image/imagepackage/contents/ui/config.qml index cdab8998..1b79d181 100644 --- a/wallpapers/image/imagepackage/contents/ui/config.qml +++ b/wallpapers/image/imagepackage/contents/ui/config.qml @@ -38,6 +38,7 @@ ColumnLayout { property var cfg_SlidePaths: "" property int cfg_SlideInterval: 0 property var cfg_UncheckedSlides: [] + property int cfg_SlideSort function saveConfig() { imageWallpaper.commitDeletion(); @@ -58,6 +59,7 @@ ColumnLayout { } onSlidePathsChanged: cfg_SlidePaths = slidePaths onUncheckedSlidesChanged: cfg_UncheckedSlides = uncheckedSlides + onSlideSortChanged: cfg_SlideSort = slideSort } onCfg_SlidePathsChanged: { @@ -66,6 +68,10 @@ ColumnLayout { onCfg_UncheckedSlidesChanged: { imageWallpaper.uncheckedSlides = cfg_UncheckedSlides } + + onCfg_SlideSortChanged: { + imageWallpaper.slideSort = cfg_SlideSort; + } property int hoursIntervalValue: Math.floor(cfg_SlideInterval / 3600) property int minutesIntervalValue: Math.floor(cfg_SlideInterval % 3600) / 60 @@ -84,11 +90,11 @@ ColumnLayout { 'fillMode': Image.PreserveAspectCrop }, { - 'label': i18nd("plasma_wallpaper_org.kde.image","Scaled"), + 'label': i18nd("plasma_wallpaper_org.kde.image", "Scaled"), 'fillMode': Image.Stretch }, { - 'label': i18nd("plasma_wallpaper_org.kde.image","Scaled, Keep Proportions"), + 'label': i18nd("plasma_wallpaper_org.kde.image", "Scaled, Keep Proportions"), 'fillMode': Image.PreserveAspectFit }, { @@ -96,10 +102,10 @@ ColumnLayout { 'fillMode': Image.Pad }, { - 'label': i18nd("plasma_wallpaper_org.kde.image","Tiled"), + 'label': i18nd("plasma_wallpaper_org.kde.image", "Tiled"), 'fillMode': Image.Tile } - ] + ] textRole: "label" onCurrentIndexChanged: cfg_FillMode = model[currentIndex]["fillMode"] @@ -116,6 +122,47 @@ ColumnLayout { } } + QtControls2.ComboBox { + id: slideSortComboBox + Kirigami.FormData.label: i18nd("plasma_wallpaper_org.kde.image", "Slide sorting:") + model: [ + { + 'label': i18nd("plasma_wallpaper_org.kde.image", "Unsorted"), + 'slideSort': Wallpaper.Image.Unsorted + }, + { + 'label': i18nd("plasma_wallpaper_org.kde.image", "Name"), + 'slideSort': Wallpaper.Image.SortByName + }, + { + 'label': i18nd("plasma_wallpaper_org.kde.image", "Time"), + 'slideSort': Wallpaper.Image.SortByTime + }, + { + 'label': i18nd("plasma_wallpaper_org.kde.image", "Size"), + 'slideSort': Wallpaper.Image.SortBySize + }, + { + 'label': i18nd("plasma_wallpaper_org.kde.image", "Type"), + 'slideSort': Wallpaper.Image.SortByType + } + ] + + textRole: "label" + onCurrentIndexChanged: cfg_SlideSort = model[currentIndex]["slideSort"] + Component.onCompleted: setMethod(); + + function setMethod() { + for (var i = 0; i < model.length; i++) { + if (model[i]["slideSort"] === wallpaper.configuration.SlideSort) { + slideSortComboBox.currentIndex = i; + //var tl = model[i]["label"].length; + //slideSortComboBox.textLength = Math.max(slideSortComboBox.textLength, tl+5); + } + } + } + } + QtControls2.ButtonGroup { id: backgroundGroup } QtControls2.RadioButton { @@ -141,7 +188,7 @@ ColumnLayout { } } } - + Component { id: foldersComponent ColumnLayout { @@ -165,7 +212,7 @@ ColumnLayout { onValueChanged: cfg_SlideInterval = hoursInterval.value * 3600 + minutesInterval.value * 60 + secondsInterval.value } QtControls2.Label { - text: i18nd("plasma_wallpaper_org.kde.image","Hours") + text: i18nd("plasma_wallpaper_org.kde.image", "Hours") } QtControls2.SpinBox { id: minutesInterval @@ -176,7 +223,7 @@ ColumnLayout { onValueChanged: cfg_SlideInterval = hoursInterval.value * 3600 + minutesInterval.value * 60 + secondsInterval.value } QtControls2.Label { - text: i18nd("plasma_wallpaper_org.kde.image","Minutes") + text: i18nd("plasma_wallpaper_org.kde.image", "Minutes") } QtControls2.SpinBox { id: secondsInterval @@ -187,7 +234,7 @@ ColumnLayout { onValueChanged: cfg_SlideInterval = hoursInterval.value * 3600 + minutesInterval.value * 60 + secondsInterval.value } QtControls2.Label { - text: i18nd("plasma_wallpaper_org.kde.image","Seconds") + text: i18nd("plasma_wallpaper_org.kde.image", "Seconds") } } } @@ -232,7 +279,7 @@ ColumnLayout { QtControls2.ToolTip.timeout: 5000 } width: slidePathsView.width - height: paintedHeight; + height: folderDelegate.paintedHeight } } } diff --git a/wallpapers/image/imagepackage/contents/ui/main.qml b/wallpapers/image/imagepackage/contents/ui/main.qml index eba89a7a..3daa768a 100644 --- a/wallpapers/image/imagepackage/contents/ui/main.qml +++ b/wallpapers/image/imagepackage/contents/ui/main.qml @@ -34,6 +34,7 @@ QQC2.StackView { readonly property string configColor: wallpaper.configuration.Color readonly property bool blur: wallpaper.configuration.Blur readonly property size sourceSize: Qt.size(root.width * Screen.devicePixelRatio, root.height * Screen.devicePixelRatio) + readonly property int slideSort: wallpaper.configuration.SlideSort //public API, the C++ part will look for those function setUrl(url) { @@ -69,6 +70,7 @@ QQC2.StackView { slidePaths: wallpaper.configuration.SlidePaths slideTimer: wallpaper.configuration.SlideInterval uncheckedSlides: wallpaper.configuration.UncheckedSlides + slideSort: wallpaper.configuration.SlideSort } onFillModeChanged: Qt.callLater(loadImage); @@ -77,6 +79,7 @@ QQC2.StackView { onBlurChanged: Qt.callLater(loadImage); onWidthChanged: Qt.callLater(loadImage); onHeightChanged: Qt.callLater(loadImage); + onSlideSortChanged: Qt.callLater(loadImage); function loadImage() { var isFirst = (root.currentItem == undefined); @@ -85,7 +88,8 @@ QQC2.StackView { "sourceSize": root.sourceSize, "color": root.configColor, "blur": root.blur, - "opacity": isFirst ? 1: 0}); + "opacity": isFirst ? 1: 0 + }); function replaceWhenLoaded() { if (pendingImage.status !== Image.Loading) { diff --git a/wallpapers/image/slideshowpackage/contents/config/main.xml b/wallpapers/image/slideshowpackage/contents/config/main.xml index 272e568d..e15188aa 100644 --- a/wallpapers/image/slideshowpackage/contents/config/main.xml +++ b/wallpapers/image/slideshowpackage/contents/config/main.xml @@ -38,6 +38,26 @@ - + + + 0 + + + + 0 + + + + false + + + + false + + + + false + +