You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

177 lines
3.8 KiB

/*
SPDX-FileCopyrightText: 2019 David Redondo <kde@david-redondo.de>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "slidemodel.h"
#include <QDir>
#include "model/imageproxymodel.h"
SlideModel::SlideModel(const QSize &targetSize, QObject *parent)
: QConcatenateTablesProxyModel(parent)
, m_targetSize(targetSize)
{
connect(this, &SlideModel::targetSizeChanged, [this](const QSize &s) {
m_targetSize = s;
});
}
QHash<int, QByteArray> SlideModel::roleNames() const
{
const auto models = sourceModels();
if (!models.empty()) {
return models.at(0)->roleNames();
}
return QConcatenateTablesProxyModel::roleNames();
}
QVariant SlideModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) {
return QVariant();
}
if (role == ToggleRole) {
return m_checkedTable.value(index.data(PackageNameRole).toString(), true);
}
return QConcatenateTablesProxyModel::data(index, role);
}
bool SlideModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid()) {
return false;
}
if (role == ToggleRole) {
m_checkedTable[index.data(PackageNameRole).toString()] = value.toBool();
Q_EMIT dataChanged(index, index, {ToggleRole});
return true;
}
return QConcatenateTablesProxyModel::setData(index, value, role);
}
int SlideModel::indexOf(const QString &packagePath) const
{
int idx = -1;
const auto models = sourceModels();
for (const auto &m : models) {
idx = static_cast<const ImageProxyModel *>(m)->indexOf(packagePath);
if (idx >= 0) {
return mapFromSource(m->index(idx, 0)).row();
}
}
return idx;
}
QStringList SlideModel::addDirs(const QStringList &dirs)
{
QStringList added;
for (const QString &_d : dirs) {
if (!QFileInfo(_d).isDir()) {
continue;
}
const QString d = _d.endsWith(QDir::separator()) ? _d : _d + QDir::separator();
if (!m_models.contains(d)) {
auto m = new ImageProxyModel({d}, m_targetSize, this);
connect(m, &ImageProxyModel::loadingChanged, this, &SlideModel::slotSourceModelLoadingChanged);
m_models.insert(d, m);
added.append(d);
}
}
if (!added.empty()) {
m_loading = true;
Q_EMIT loadingChanged();
}
return added;
}
QString SlideModel::removeDir(const QString &_dir)
{
const QString dir = _dir.endsWith(QDir::separator()) ? _dir : _dir + QDir::separator();
if (!m_models.contains(dir)) {
return QString();
}
auto *m = m_models.take(dir);
m_loaded--;
removeSourceModel(m);
m->deleteLater();
return dir;
}
void SlideModel::setSlidePaths(const QStringList &slidePaths)
{
const auto models = sourceModels();
for (const auto &k : std::as_const(m_models)) {
if (models.contains(k)) {
removeSourceModel(k);
} else {
// Abort loading
disconnect(k, nullptr, this, nullptr);
}
k->deleteLater();
}
m_models.clear();
m_loaded = 0;
addDirs(slidePaths);
}
void SlideModel::setUncheckedSlides(const QStringList &uncheckedSlides)
{
m_checkedTable.clear();
for (const QString &p : uncheckedSlides) {
m_checkedTable[p] = false;
}
}
bool SlideModel::loading() const
{
return m_loading;
}
void SlideModel::slotSourceModelLoadingChanged()
{
auto m = qobject_cast<ImageProxyModel *>(sender());
if (!m) {
return;
}
disconnect(m, &ImageProxyModel::loadingChanged, this, nullptr);
connect(this, &SlideModel::targetSizeChanged, m, &ImageProxyModel::targetSizeChanged);
addSourceModel(m);
if (++m_loaded == m_models.size()) {
m_loading = false;
Q_EMIT loadingChanged();
Q_EMIT done();
}
}