File indexing completed on 2024-05-12 05:29:06

0001 /*
0002  *   SPDX-FileCopyrightText: 2011 Jonathan Thomas <echidnaman@kubuntu.org>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #pragma once
0008 
0009 #include "discovercommon_export.h"
0010 #include "resources/AbstractBackendUpdater.h"
0011 #include <QAbstractListModel>
0012 
0013 class QTimer;
0014 class ResourcesUpdatesModel;
0015 class AbstractResource;
0016 class UpdateItem;
0017 
0018 class DISCOVERCOMMON_EXPORT UpdateModel : public QAbstractListModel
0019 {
0020     Q_OBJECT
0021     Q_PROPERTY(ResourcesUpdatesModel *backend READ backend WRITE setBackend)
0022     Q_PROPERTY(bool hasUpdates READ hasUpdates NOTIFY hasUpdatesChanged)
0023     Q_PROPERTY(int toUpdateCount READ toUpdateCount NOTIFY toUpdateChanged)
0024     Q_PROPERTY(int totalUpdatesCount READ totalUpdatesCount NOTIFY hasUpdatesChanged)
0025     Q_PROPERTY(QString updateSize READ updateSize NOTIFY updateSizeChanged)
0026 public:
0027     enum Roles {
0028         SizeRole = Qt::UserRole + 1,
0029         ResourceRole,
0030         ResourceProgressRole,
0031         ResourceStateRole,
0032         SectionResourceProgressRole,
0033         ChangelogRole,
0034         SectionRole,
0035         ExtendedRole,
0036     };
0037     Q_ENUM(Roles)
0038 
0039     explicit UpdateModel(QObject *parent = nullptr);
0040     ~UpdateModel() override;
0041 
0042     QVariant data(const QModelIndex &index, int role) const override;
0043     Qt::ItemFlags flags(const QModelIndex &index) const override;
0044     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0045 
0046     bool setData(const QModelIndex &index, const QVariant &value, int role) override;
0047     void setResources(const QList<AbstractResource *> &res);
0048     UpdateItem *itemFromIndex(const QModelIndex &index) const;
0049 
0050     void checkResources(const QList<AbstractResource *> &resource, bool checked);
0051     QHash<int, QByteArray> roleNames() const override;
0052 
0053     bool hasUpdates() const;
0054 
0055     /// all upgradeable packages
0056     int totalUpdatesCount() const;
0057 
0058     /// packages marked to upgrade
0059     int toUpdateCount() const;
0060 
0061     Q_SCRIPTABLE void fetchUpdateDetails(int row);
0062 
0063     QString updateSize() const;
0064 
0065     ResourcesUpdatesModel *backend() const;
0066     void setBackend(ResourcesUpdatesModel *);
0067 
0068 public Q_SLOTS:
0069     void checkAll();
0070     void uncheckAll();
0071 
0072 Q_SIGNALS:
0073     void hasUpdatesChanged(bool hasUpdates);
0074     void toUpdateChanged();
0075     void updateSizeChanged();
0076 
0077 private:
0078     void resourceDataChanged(AbstractResource *res, const QVector<QByteArray> &properties);
0079     void integrateChangelog(const QString &changelog);
0080     QModelIndex indexFromItem(UpdateItem *item) const;
0081     UpdateItem *itemFromResource(AbstractResource *res);
0082     void resourceHasProgressed(AbstractResource *res, qreal progress, AbstractBackendUpdater::State state);
0083     void activityChanged();
0084 
0085     QTimer *const m_updateSizeTimer;
0086     QVector<UpdateItem *> m_updateItems;
0087     ResourcesUpdatesModel *m_updates;
0088     QList<AbstractResource *> m_resources;
0089 };