File indexing completed on 2024-05-12 05:35:36

0001 /*
0002     SPDX-FileCopyrightText: 2016 Ivan Cukic <ivan.cukic(at)kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 // Qt
0010 #include <QSortFilterProxyModel>
0011 
0012 // KDE
0013 #include <PlasmaActivities/ActivitiesModel>
0014 #include <PlasmaActivities/Consumer>
0015 
0016 #include <config-X11.h> // Required by files that include this header
0017 
0018 namespace TaskManager
0019 {
0020 class WindowTasksModel;
0021 }
0022 
0023 class SortedActivitiesModel : public QSortFilterProxyModel
0024 {
0025     Q_OBJECT
0026 
0027     Q_PROPERTY(bool inhibitUpdates READ inhibitUpdates WRITE setInhibitUpdates NOTIFY inhibitUpdatesChanged)
0028 
0029 public:
0030     SortedActivitiesModel(const QList<KActivities::Info::State> &states, QObject *parent = nullptr);
0031     ~SortedActivitiesModel() override;
0032 
0033     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
0034 
0035     QHash<int, QByteArray> roleNames() const override;
0036 
0037     QString relativeActivity(int relative) const;
0038 
0039     TaskManager::WindowTasksModel * const m_windowTasksModel;
0040 
0041 protected:
0042     uint lastUsedTime(const QString &activity) const;
0043     bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
0044 
0045     enum AdditionalRoles {
0046         LastTimeUsed = KActivities::ActivitiesModel::UserRole,
0047         LastTimeUsedString = KActivities::ActivitiesModel::UserRole + 1,
0048         WindowCount = KActivities::ActivitiesModel::UserRole + 2,
0049         HasWindows = KActivities::ActivitiesModel::UserRole + 3,
0050     };
0051 
0052 public Q_SLOTS:
0053     bool inhibitUpdates() const;
0054     void setInhibitUpdates(bool sortByLastUsedTime);
0055 
0056     void onBackgroundsUpdated(const QStringList &changedBackgrounds);
0057     void onCurrentActivityChanged(const QString &currentActivity);
0058 
0059     QString activityIdForRow(int row) const;
0060     QString activityIdForIndex(const QModelIndex &index) const;
0061     int rowForActivityId(const QString &activity) const;
0062 
0063     void rowChanged(int row, const QList<int> &roles);
0064 
0065     void onWindowAdded(const QModelIndex &parent, int first, int last);
0066     void onWindowRemoved(const QModelIndex &parent, int first, int last);
0067     void onWindowChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles);
0068 
0069 Q_SIGNALS:
0070     void inhibitUpdatesChanged(bool inhibitUpdates);
0071 
0072 private:
0073     bool m_inhibitUpdates;
0074 
0075     QString m_previousActivity;
0076 
0077     KActivities::ActivitiesModel *m_activitiesModel = nullptr;
0078     KActivities::Consumer *m_activities = nullptr;
0079 
0080     QHash<QString, QVariantList> m_activitiesWindows;
0081 
0082     QVariant getWinIdList(const QModelIndex &parent, int row);
0083 };