/*
SPDX-FileCopyrightText: 2007 Paolo Capriotti
SPDX-FileCopyrightText: 2008 Petri Damsten
SPDX-FileCopyrightText: 2014 Sebastian Kügler
SPDX-FileCopyrightText: 2015 Kai Uwe Broulik
SPDX-FileCopyrightText: 2019 David Redondo
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "sortingmode.h"
class ImageProxyModel;
class SlideModel;
class SlideFilterModel;
/**
* @brief An image wallpaper backend that handles slideshow progress and data from
* wallpaper models.
*
* It's used in the configuration dialog and the wallpaper front-end.
*
* When used in the configuration dialog, it summons the wallpaper models to list
* all available images in either:
* - the default wallpaper location (image wallpaper plugin)
* - the specified folders (slideshow wallpaper plugin)
*
* When used in the front-end, it will only be activated when the current wallpaper
* plugin is the sildeshow plugin.
* It provides wallpaper paths for \MediaProxy and will update the current wallpaper
* path periodically following the slideshow settings, and \MediaProxy will convert
* the wallpaper path to an url that \QQuickImage can understand.
*
* @warning The API is unstable. Do not use the backend in your wallpaper plugin.
*/
class ImageBackend : public QObject, public QQmlParserStatus
{
Q_OBJECT
Q_INTERFACES(QQmlParserStatus)
/**
* Used to save the current wallpaper in slideshow mode
*/
Q_PROPERTY(QQmlPropertyMap *configMap READ configMap WRITE setConfigMap NOTIFY configMapChanged)
Q_PROPERTY(bool usedInConfig MEMBER m_usedInConfig)
Q_PROPERTY(RenderingMode renderingMode READ renderingMode WRITE setRenderingMode NOTIFY renderingModeChanged)
Q_PROPERTY(SortingMode::Mode slideshowMode READ slideshowMode WRITE setSlideshowMode NOTIFY slideshowModeChanged)
Q_PROPERTY(bool slideshowFoldersFirst READ slideshowFoldersFirst WRITE setSlideshowFoldersFirst NOTIFY slideshowFoldersFirstChanged)
/**
* Provides source url for \MediaProxy
*/
Q_PROPERTY(QString image READ image WRITE setImage NOTIFY imageChanged)
Q_PROPERTY(QAbstractItemModel *wallpaperModel READ wallpaperModel NOTIFY wallpaperModelChanged)
Q_PROPERTY(QAbstractItemModel *slideFilterModel READ slideFilterModel NOTIFY slideFilterModelChanged)
Q_PROPERTY(int slideTimer READ slideTimer WRITE setSlideTimer NOTIFY slideTimerChanged)
Q_PROPERTY(QStringList slidePaths READ slidePaths WRITE setSlidePaths NOTIFY slidePathsChanged)
Q_PROPERTY(QSize targetSize READ targetSize WRITE setTargetSize NOTIFY targetSizeChanged)
Q_PROPERTY(QStringList uncheckedSlides READ uncheckedSlides WRITE setUncheckedSlides NOTIFY uncheckedSlidesChanged)
/**
* Pauses slideshow when certain conditions are met
*/
Q_PROPERTY(bool pauseSlideshow READ pauseSlideshow WRITE setPauseSlideshow NOTIFY pauseSlideshowChanged)
/**
* @return @c true if the image list is loaded, @c false otherwise
*/
Q_PROPERTY(bool loading READ loading NOTIFY loadingChanged)
public:
enum RenderingMode {
SingleImage,
SlideShow,
};
Q_ENUM(RenderingMode)
explicit ImageBackend(QObject *parent = nullptr);
~ImageBackend() override;
QString image() const;
void setImage(const QString &url);
// this is for QML use
Q_INVOKABLE bool addSlidePath(const QUrl &url);
Q_INVOKABLE void removeSlidePath(const QString &path);
Q_INVOKABLE QString nameFilters() const;
Q_INVOKABLE QString addUsersWallpaper(const QUrl &url);
QQmlPropertyMap *configMap() const;
void setConfigMap(QQmlPropertyMap *configMap);
RenderingMode renderingMode() const;
void setRenderingMode(RenderingMode mode);
SortingMode::Mode slideshowMode() const;
void setSlideshowMode(SortingMode::Mode slideshowMode);
bool slideshowFoldersFirst() const;
void setSlideshowFoldersFirst(bool slideshowFoldersFirst);
QSize targetSize() const;
void setTargetSize(const QSize &size);
QAbstractItemModel *wallpaperModel() const;
QAbstractItemModel *slideFilterModel() const;
int slideTimer() const;
void setSlideTimer(int time);
QStringList slidePaths() const;
void setSlidePaths(const QStringList &slidePaths);
void classBegin() override;
void componentComplete() override;
QStringList uncheckedSlides() const;
void setUncheckedSlides(const QStringList &uncheckedSlides);
bool pauseSlideshow() const;
void setPauseSlideshow(bool pauseSlideshow);
bool loading() const;
public Q_SLOTS:
void nextSlide();
void slotSlideModelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList &roles);
Q_SIGNALS:
void settingsChanged();
void imageChanged();
void wallpaperModelChanged();
void slideFilterModelChanged();
void renderingModeChanged();
void slideshowModeChanged();
void slideshowFoldersFirstChanged();
void targetSizeChanged();
void slideTimerChanged();
void slidePathsChanged();
void uncheckedSlidesChanged();
void pauseSlideshowChanged();
void configMapChanged();
void loadingChanged(bool loading);
protected Q_SLOTS:
void startSlideshow();
void backgroundsFound();
private:
void ensureWallpaperModel();
void ensureSlideshowModel();
void saveCurrentWallpaper();
bool m_ready = false;
int m_delay = 10;
QUrl m_image;
Q_OBJECT_BINDABLE_PROPERTY(ImageBackend, QSize, m_targetSize, &ImageBackend::targetSizeChanged)
Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(ImageBackend, bool, m_usedInConfig, true)
QPointer m_configMap;
Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(ImageBackend, bool, m_loading, false, &ImageBackend::loadingChanged)
RenderingMode m_mode = SingleImage;
Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(ImageBackend, SortingMode::Mode, m_slideshowMode, SortingMode::Random, &ImageBackend::slideshowModeChanged)
Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(ImageBackend, bool, m_slideshowFoldersFirst, false, &ImageBackend::slideshowFoldersFirstChanged)
QTimer m_timer;
static constexpr int m_timer_duration_min = 1000;
static constexpr int m_timer_duration_offset = 10;
bool m_pauseSlideshow = false;
std::optional().remainingTimeAsDuration())> m_remainingTime;
QStringList m_slidePaths;
QStringList m_uncheckedSlides;
int m_currentSlide = -1;
ImageProxyModel *m_model = nullptr;
SlideModel *m_slideshowModel = nullptr;
SlideFilterModel *m_slideFilterModel = nullptr;
};