Paste P423

Test diff for wallpapers slideshow sorting (POC - work in progress)
ActivePublic

Authored by msdobrescu on Jun 28 2019, 6:40 PM.
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<QDir::SortFlag>(m_wallpaper->slideSort()));
+ qCDebug(IMAGEWALLPAPER) << "Sorting " << m_wallpaper->slideSort() << "-->" << QFlags<QDir::SortFlag>(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<Image> 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 <QDateTime>
#include <QPointer>
#include <QQmlParserStatus>
+#include <QDir>
#include <KPackage/Package>
@@ -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 @@
<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..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 @@
<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>
msdobrescu created this paste.Jun 28 2019, 6:40 PM
msdobrescu created this object in space S1 KDE Community.
msdobrescu changed the title of this paste from Test diff for wallpapers slideshow sorting to Test diff for wallpapers slideshow sorting (not working).
msdobrescu edited the content of this paste. (Show Details)Jun 29 2019, 5:05 AM
msdobrescu edited the content of this paste. (Show Details)Jul 3 2019, 8:28 PM
msdobrescu edited the content of this paste. (Show Details)Jul 3 2019, 9:32 PM
msdobrescu edited the content of this paste. (Show Details)Jul 3 2019, 10:47 PM
msdobrescu changed the title of this paste from Test diff for wallpapers slideshow sorting (not working) to Test diff for wallpapers slideshow sorting (POC - work in progress).