File indexing completed on 2024-06-09 05:32:28

0001 /*
0002     SPDX-FileCopyrightText: 2019 David Redondo <kde@david-redondo.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "slidemodel.h"
0008 
0009 #include <QDir>
0010 
0011 #include "model/imageproxymodel.h"
0012 
0013 SlideModel::SlideModel(const QBindable<QSize> &bindableTargetSize, const QBindable<bool> &bindableUsedInConfig, QObject *parent)
0014     : QConcatenateTablesProxyModel(parent)
0015     , m_targetSize(bindableTargetSize.makeBinding())
0016     , m_usedInConfig(bindableUsedInConfig.makeBinding())
0017 {
0018 }
0019 
0020 QHash<int, QByteArray> SlideModel::roleNames() const
0021 {
0022     const auto models = sourceModels();
0023 
0024     if (!models.empty()) {
0025         return models.at(0)->roleNames();
0026     }
0027 
0028     return QConcatenateTablesProxyModel::roleNames();
0029 }
0030 
0031 QVariant SlideModel::data(const QModelIndex &index, int role) const
0032 {
0033     if (!index.isValid()) {
0034         return QVariant();
0035     }
0036 
0037     if (role == ToggleRole) {
0038         return m_checkedTable.value(index.data(PackageNameRole).toString(), true);
0039     }
0040 
0041     return QConcatenateTablesProxyModel::data(index, role);
0042 }
0043 
0044 bool SlideModel::setData(const QModelIndex &index, const QVariant &value, int role)
0045 {
0046     if (!index.isValid()) {
0047         return false;
0048     }
0049 
0050     if (role == ToggleRole) {
0051         m_checkedTable[index.data(PackageNameRole).toString()] = value.toBool();
0052 
0053         Q_EMIT dataChanged(index, index, {ToggleRole});
0054         return true;
0055     }
0056 
0057     return QConcatenateTablesProxyModel::setData(index, value, role);
0058 }
0059 
0060 int SlideModel::indexOf(const QString &packagePath) const
0061 {
0062     int idx = -1;
0063 
0064     for (const auto models{sourceModels()}; auto m : models) {
0065         idx = static_cast<ImageProxyModel *>(m)->indexOf(packagePath);
0066 
0067         if (idx >= 0) {
0068             return mapFromSource(m->index(idx, 0)).row();
0069         }
0070     }
0071 
0072     return idx;
0073 }
0074 
0075 QStringList SlideModel::addDirs(const QStringList &dirs)
0076 {
0077     QStringList added;
0078 
0079     for (const QString &_d : dirs) {
0080         if (!QFileInfo(_d).isDir()) {
0081             continue;
0082         }
0083 
0084         const QString d = _d.endsWith(QDir::separator()) ? _d : _d + QDir::separator();
0085 
0086         if (!m_models.contains(d)) {
0087             auto m = new ImageProxyModel({d}, QBindable<QSize>(&m_targetSize), QBindable<bool>(&m_usedInConfig), this);
0088             m_models.insert(d, m);
0089             added.append(d);
0090 
0091             if (m->loading().value()) {
0092                 connect(m, &ImageProxyModel::loadingChanged, this, &SlideModel::slotSourceModelLoadingChanged);
0093             } else {
0094                 // In case it loads immediately
0095                 ++m_loaded;
0096                 addSourceModel(m);
0097             }
0098         }
0099     }
0100 
0101     if (!added.empty()) {
0102         m_loading = m_loaded != m_models.size();
0103         if (!m_loading) {
0104             Q_EMIT done();
0105         }
0106     }
0107 
0108     return added;
0109 }
0110 
0111 QString SlideModel::removeDir(const QString &_dir)
0112 {
0113     const QString dir = _dir.endsWith(QDir::separator()) ? _dir : _dir + QDir::separator();
0114 
0115     if (!m_models.contains(dir)) {
0116         return QString();
0117     }
0118 
0119     auto *m = m_models.take(dir);
0120 
0121     m_loaded--;
0122     removeSourceModel(m);
0123     m->deleteLater();
0124 
0125     return dir;
0126 }
0127 
0128 void SlideModel::setSlidePaths(const QStringList &slidePaths)
0129 {
0130     const auto models = sourceModels();
0131 
0132     for (const auto k : std::as_const(m_models)) {
0133         if (models.contains(k)) {
0134             removeSourceModel(k);
0135         } else {
0136             // Abort loading
0137             disconnect(k, nullptr, this, nullptr);
0138         }
0139         delete k;
0140     }
0141 
0142     m_models.clear();
0143     m_loaded = 0;
0144 
0145     addDirs(slidePaths);
0146 }
0147 
0148 void SlideModel::setUncheckedSlides(const QStringList &uncheckedSlides)
0149 {
0150     m_checkedTable.clear();
0151 
0152     for (const QString &p : uncheckedSlides) {
0153         m_checkedTable[p] = false;
0154     }
0155 }
0156 
0157 QBindable<bool> SlideModel::loading() const
0158 {
0159     return &m_loading;
0160 }
0161 
0162 void SlideModel::slotSourceModelLoadingChanged()
0163 {
0164     auto m = static_cast<ImageProxyModel *>(sender());
0165     disconnect(m, &ImageProxyModel::loadingChanged, this, nullptr);
0166     addSourceModel(m);
0167 
0168     if (++m_loaded == m_models.size()) {
0169         m_loading = false;
0170         Q_EMIT done();
0171     }
0172 }