wallpapers/image/backgroundlistmodel.cpp | 2 +
wallpapers/image/backgroundlistmodel.h | 1 +
wallpapers/image/image.cpp | 19 ++++++++
wallpapers/image/image.h | 6 +++
.../image/imagepackage/contents/config/main.xml | 22 ++++++++-
.../image/imagepackage/contents/ui/config.qml | 57 ++++++++++++++++++++--
wallpapers/image/imagepackage/contents/ui/main.qml | 6 ++-
.../slideshowpackage/contents/config/main.xml | 22 ++++++++-
8 files changed, 128 insertions(+), 7 deletions(-)
diff --git a/wallpapers/image/backgroundlistmodel.cpp b/wallpapers/image/backgroundlistmodel.cpp
index 1598e5df..f7ca7708 100644
--- a/wallpapers/image/backgroundlistmodel.cpp
+++ b/wallpapers/image/backgroundlistmodel.cpp
@@ -490,6 +490,7 @@ const QStringList BackgroundListModel::wallpapersAwaitingDeletion()
BackgroundFinder::BackgroundFinder(Image *wallpaper, const QStringList &paths)
: QThread(wallpaper),
m_paths(paths),
+ m_sorting(wallpaper->slideSort()),
m_token(QUuid().toString())
{
}
@@ -541,6 +542,7 @@ void BackgroundFinder::run()
QDir dir;
dir.setFilter(QDir::AllDirs | QDir::Files | QDir::Readable);
+ dir.setSorting(QFlags<QDir::SortFlag>(m_sorting));
dir.setNameFilters(suffixes());
KPackage::Package package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Wallpaper/Images"));
diff --git a/wallpapers/image/backgroundlistmodel.h b/wallpapers/image/backgroundlistmodel.h
index 516eb3ca..b7ef9d01 100644
--- a/wallpapers/image/backgroundlistmodel.h
+++ b/wallpapers/image/backgroundlistmodel.h
@@ -143,6 +143,7 @@ protected:
private:
QStringList m_paths;
+ int m_sorting;
QString m_token;
static QMutex s_suffixMutex;
diff --git a/wallpapers/image/image.cpp b/wallpapers/image/image.cpp
index 5d9e4c64..cb9d9bf7 100644
--- a/wallpapers/image/image.cpp
+++ b/wallpapers/image/image.cpp
@@ -927,3 +927,22 @@ void Image::setUncheckedSlides(const QStringList &uncheckedSlides)
emit uncheckedSlidesChanged();
startSlideshow();
}
+
+int Image::slideSort() const
+{
+ return m_slideSort;
+}
+
+void Image::setSlideSort(int sort)
+{
+ if (sort == m_slideSort) {
+ return;
+ }
+ m_slideSort = sort;
+ if (m_mode == SlideShow) {
+ updateDirWatch(m_slidePaths);
+ startSlideshow();
+ }
+ emit slideSortChanged();
+ startSlideshow();
+}
diff --git a/wallpapers/image/image.h b/wallpapers/image/image.h
index e3526a41..effa58ba 100644
--- a/wallpapers/image/image.h
+++ b/wallpapers/image/image.h
@@ -64,6 +64,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(int slideSort READ slideSort WRITE setSlideSort NOTIFY slideSortChanged)
public:
@@ -124,6 +125,9 @@ class Image : public QObject, public QQmlParserStatus
QStringList uncheckedSlides() const;
void setUncheckedSlides(const QStringList &uncheckedSlides);
+
+ int slideSort() const;
+ void setSlideSort(int sort);
public Q_SLOTS:
void nextSlide();
@@ -140,6 +144,7 @@ class Image : public QObject, public QQmlParserStatus
void resizeMethodChanged();
void customWallpaperPicked(const QString &path);
void uncheckedSlidesChanged();
+ void slideSortChanged();
protected Q_SLOTS:
void showAddSlidePathsDialog();
@@ -186,6 +191,7 @@ class Image : public QObject, public QQmlParserStatus
QStringList m_unseenSlideshowBackgrounds;
QStringList m_slidePaths;
QStringList m_uncheckedSlides;
+ int 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 @@
<default>10</default>
</entry>
<entry name="TransitionAnimationDuration" type="int">
- <label>Fade Transition Animation (ms)</label>
+ <label>Fade Transition Animation (ms)</label>
<default>1000</default>
</entry>
+ <entry name="SlideSort" type="int">
+ <label>Slides sort by one of Name, Time, Size, Type, default Unsorted</label>
+ <default>0</default>
+ </entry>
+ <entry name="SlideDirsOrFilesFirst" type="int">
+ <label>Put dirs or files first, default undecided</label>
+ <default>0</default>
+ </entry>
+ <entry name="SlideReversed" type="bool">
+ <label>Reverse the sort order</label>
+ <default>false</default>
+ </entry>
+ <entry name="SlideIgnoreCase" type="bool">
+ <label>Sort case-insensitive</label>
+ <default>false</default>
+ </entry>
+ <entry name="SlideLocaleAware" type="bool">
+ <label>Sort images using the current locale settings</label>
+ <default>false</default>
+ </entry>
</group>
</kcfg>
diff --git a/wallpapers/image/imagepackage/contents/ui/config.qml b/wallpapers/image/imagepackage/contents/ui/config.qml
index cdab8998..87e7bc2c 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,7 +102,7 @@ ColumnLayout {
'fillMode': Image.Pad
},
{
- 'label': i18nd("plasma_wallpaper_org.kde.image","Tiled"),
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Tiled"),
'fillMode': Image.Tile
}
]
@@ -141,7 +147,7 @@ ColumnLayout {
}
}
}
-
+
Component {
id: foldersComponent
ColumnLayout {
@@ -191,6 +197,49 @@ ColumnLayout {
}
}
}
+ Kirigami.FormLayout {
+ twinFormLayouts: parentLayout
+ 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': QDir.Unsorted
+ },
+ {
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Name"),
+ 'slideSort': QDir.Name
+ },
+ {
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Time"),
+ 'slideSort': QDir.Time
+ },
+ {
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Size"),
+ 'slideSort': QDir.Size
+ },
+ {
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Type"),
+ 'slideSort': QDir.Type
+ }
+ ]
+
+ 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);
+ }
+ }
+ }
+ }
+ }
Kirigami.Heading {
text: i18nd("plasma_wallpaper_org.kde.image","Folders")
level: 2
diff --git a/wallpapers/image/imagepackage/contents/ui/main.qml b/wallpapers/image/imagepackage/contents/ui/main.qml
index 76933760..6acbee98 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);/image/imagepackage/contents/ui/config.qml | 55 ++++++++++++++++++++--
wallpapers/image/imagepackage/contents/ui/main.qml | 6 ++-
.../slideshowpackage/contents/config/main.xml | 22 ++++++++-
8 files changed, 126 insertions(+), 7 deletions(-)
diff --git a/wallpapers/image/backgroundlistmodel.cpp b/wallpapers/image/backgroundlistmodel.cpp
index 1598e5df..f7ca7708 100644
--- a/wallpapers/image/backgroundlistmodel.cpp
+++ b/wallpapers/image/backgroundlistmodel.cpp
@@ -490,6 +490,7 @@ const QStringList BackgroundListModel::wallpapersAwaitingDeletion()
BackgroundFinder::BackgroundFinder(Image *wallpaper, const QStringList &paths)
: QThread(wallpaper),
m_paths(paths),
+ m_sorting(wallpaper->slideSort()),
m_token(QUuid().toString())
{
}
@@ -541,6 +542,7 @@ void BackgroundFinder::run()
QDir dir;
dir.setFilter(QDir::AllDirs | QDir::Files | QDir::Readable);
+ dir.setSorting(QFlags<QDir::SortFlag>(m_sorting));
dir.setNameFilters(suffixes());
KPackage::Package package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Wallpaper/Images"));
diff --git a/wallpapers/image/backgroundlistmodel.h b/wallpapers/image/backgroundlistmodel.h
index 516eb3ca..b7ef9d01 100644
--- a/wallpapers/image/backgroundlistmodel.h
+++ b/wallpapers/image/backgroundlistmodel.h
@@ -143,6 +143,7 @@ protected:
private:
QStringList m_paths;
+ int m_sorting;
QString m_token;
static QMutex s_suffixMutex;
diff --git a/wallpapers/image/image.cpp b/wallpapers/image/image.cpp
index 5d9e4c64..7bddfaaf 100644
--- a/wallpapers/image/image.cpp
+++ b/wallpapers/image/image.cpp
@@ -927,3 +927,22 @@ void Image::setUncheckedSlides(const QStringList &uncheckedSlides)
emit uncheckedSlidesChanged();
startSlideshow();
}
+
+int Image::slideSort() const
+{
+ return m_slideSort;
+}
+
+void Image::setSlideSort(int sort)
+{
+ if (sort == m_slideSort) {
+ return;
+ }
+ m_slideSort = sort;
+ if (m_mode == SlideShow) {
+ updateDirWatch(m_slidePaths);
+ startSlideshow();
+ }
+ emit slideSortChanged();
+ //startSlideshow();
+}
diff --git a/wallpapers/image/image.h b/wallpapers/image/image.h
index e3526a41..effa58ba 100644
--- a/wallpapers/image/image.h
+++ b/wallpapers/image/image.h
@@ -64,6 +64,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(int slideSort READ slideSort WRITE setSlideSort NOTIFY slideSortChanged)
public:
@@ -124,6 +125,9 @@ class Image : public QObject, public QQmlParserStatus
QStringList uncheckedSlides() const;
void setUncheckedSlides(const QStringList &uncheckedSlides);
+
+ int slideSort() const;
+ void setSlideSort(int sort);
public Q_SLOTS:
void nextSlide();
@@ -140,6 +144,7 @@ class Image : public QObject, public QQmlParserStatus
void resizeMethodChanged();
void customWallpaperPicked(const QString &path);
void uncheckedSlidesChanged();
+ void slideSortChanged();
protected Q_SLOTS:
void showAddSlidePathsDialog();
@@ -186,6 +191,7 @@ class Image : public QObject, public QQmlParserStatus
QStringList m_unseenSlideshowBackgrounds;
QStringList m_slidePaths;
QStringList m_uncheckedSlides;
+ int 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 @@
<default>10</default>
</entry>
<entry name="TransitionAnimationDuration" type="int">
- <label>Fade Transition Animation (ms)</label>
+ <label>Fade Transition Animation (ms)</label>
<default>1000</default>
</entry>
+ <entry name="SlideSort" type="int">
+ <label>Slides sort by one of Name, Time, Size, Type, default Unsorted</label>
+ <default>0</default>
+ </entry>
+ <entry name="SlideDirsOrFilesFirst" type="int">
+ <label>Put dirs or files first, default undecided</label>
+ <default>0</default>
+ </entry>
+ <entry name="SlideReversed" type="bool">
+ <label>Reverse the sort order</label>
+ <default>false</default>
+ </entry>
+ <entry name="SlideIgnoreCase" type="bool">
+ <label>Sort case-insensitive</label>
+ <default>false</default>
+ </entry>
+ <entry name="SlideLocaleAware" type="bool">
+ <label>Sort images using the current locale settings</label>
+ <default>false</default>
+ </entry>
</group>
</kcfg>
diff --git a/wallpapers/image/imagepackage/contents/ui/config.qml b/wallpapers/image/imagepackage/contents/ui/config.qml
index cdab8998..625f198b 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,7 +102,7 @@ ColumnLayout {
'fillMode': Image.Pad
},
{
- 'label': i18nd("plasma_wallpaper_org.kde.image","Tiled"),
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Tiled"),
'fillMode': Image.Tile
}
]
@@ -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': QDir.Unsorted
+ },
+ {
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Name"),
+ 'slideSort': QDir.Name
+ },
+ {
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Time"),
+ 'slideSort': QDir.Time
+ },
+ {
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Size"),
+ 'slideSort': QDir.Size
+ },
+ {
+ 'label': i18nd("plasma_wallpaper_org.kde.image", "Type"),
+ 'slideSort': QDir.Type
+ }
+ ]
+
+ 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 {
diff --git a/wallpapers/image/imagepackage/contents/ui/main.qml b/wallpapers/image/imagepackage/contents/ui/main.qml
index eba89a7a..3c57dcdd 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 @@
<label>Unchecked Slides</label>
<default></default>
</entry>
- </group>
+ <entry name="SlideSort" type="int">
+ <label>Slides sort by one of Name, Time, Size, Type, default Unsorted</label>
+ <default>0</default>
+ </entry>
+ <entry name="SlideDirsOrFilesFirst" type="int">
+ <label>Put dirs or files first, default undecided</label>
+ <default>0</default>
+ </entry>
+ <entry name="SlideReversed" type="bool">
+ <label>Reverse the sort order</label>
+ <default>false</default>
+ </entry>
+ <entry name="SlideIgnoreCase" type="bool">
+ <label>Sort case-insensitive</label>
+ <default>false</default>
+ </entry>
+ <entry name="SlideLocaleAware" type="bool">
+ <label>Sort images using the current locale settings</label>
+ <default>false</default>
+ </entry>
+</group>
</kcfg>