File indexing completed on 2024-05-12 16:59:00

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         UpgradeTextRole,
0036         ExtendedRole,
0037     };
0038     Q_ENUM(Roles)
0039 
0040     explicit UpdateModel(QObject *parent = nullptr);
0041     ~UpdateModel() override;
0042 
0043     QVariant data(const QModelIndex &index, int role) const override;
0044     Qt::ItemFlags flags(const QModelIndex &index) const override;
0045     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0046 
0047     bool setData(const QModelIndex &index, const QVariant &value, int role) override;
0048     void setResources(const QList<AbstractResource *> &res);
0049     UpdateItem *itemFromIndex(const QModelIndex &index) const;
0050 
0051     void checkResources(const QList<AbstractResource *> &resource, bool checked);
0052     QHash<int, QByteArray> roleNames() const override;
0053 
0054     bool hasUpdates() const;
0055 
0056     /// all upgradeable packages
0057     int totalUpdatesCount() const;
0058 
0059     /// packages marked to upgrade
0060     int toUpdateCount() const;
0061 
0062     Q_SCRIPTABLE void fetchUpdateDetails(int row);
0063 
0064     QString updateSize() const;
0065 
0066     ResourcesUpdatesModel *backend() const;
0067 
0068 public Q_SLOTS:
0069     void checkAll();
0070     void uncheckAll();
0071 
0072     void setBackend(ResourcesUpdatesModel *updates);
0073 
0074 Q_SIGNALS:
0075     void hasUpdatesChanged(bool hasUpdates);
0076     void toUpdateChanged();
0077     void updateSizeChanged();
0078 
0079 private:
0080     void resourceDataChanged(AbstractResource *res, const QVector<QByteArray> &properties);
0081     void integrateChangelog(const QString &changelog);
0082     QModelIndex indexFromItem(UpdateItem *item) const;
0083     UpdateItem *itemFromResource(AbstractResource *res);
0084     void resourceHasProgressed(AbstractResource *res, qreal progress, AbstractBackendUpdater::State state);
0085     void activityChanged();
0086 
0087     QTimer *const m_updateSizeTimer;
0088     QVector<UpdateItem *> m_updateItems;
0089     ResourcesUpdatesModel *m_updates;
0090     QList<AbstractResource *> m_resources;
0091 };