summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/appdb.hpp
blob: 5f9b96044c6776c71b03b2eb13c8c4f564992bc7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#pragma once

#include <qhash.h>
#include <qobject.h>
#include <qqmlintegration.h>
#include <qqmllist.h>
#include <qtimer.h>

namespace caelestia {

class AppEntry : public QObject {
    Q_OBJECT
    QML_ELEMENT
    QML_UNCREATABLE("AppEntry instances can only be retrieved from an AppDb")

    // The actual DesktopEntry, but we don't have access to the type so it's a QObject
    Q_PROPERTY(QObject* entry READ entry CONSTANT)

    Q_PROPERTY(quint32 frequency READ frequency NOTIFY frequencyChanged)
    Q_PROPERTY(QString id READ id CONSTANT)
    Q_PROPERTY(QString name READ name NOTIFY nameChanged)
    Q_PROPERTY(QString comment READ comment NOTIFY commentChanged)
    Q_PROPERTY(QString execString READ execString NOTIFY execStringChanged)
    Q_PROPERTY(QString startupClass READ startupClass NOTIFY startupClassChanged)
    Q_PROPERTY(QString genericName READ genericName NOTIFY genericNameChanged)
    Q_PROPERTY(QString categories READ categories NOTIFY categoriesChanged)
    Q_PROPERTY(QString keywords READ keywords NOTIFY keywordsChanged)

public:
    explicit AppEntry(QObject* entry, quint32 frequency, QObject* parent = nullptr);

    [[nodiscard]] QObject* entry() const;

    [[nodiscard]] quint32 frequency() const;
    void setFrequency(quint32 frequency);
    void incrementFrequency();

    [[nodiscard]] QString id() const;
    [[nodiscard]] QString name() const;
    [[nodiscard]] QString comment() const;
    [[nodiscard]] QString execString() const;
    [[nodiscard]] QString startupClass() const;
    [[nodiscard]] QString genericName() const;
    [[nodiscard]] QString categories() const;
    [[nodiscard]] QString keywords() const;

signals:
    void frequencyChanged();
    void nameChanged();
    void commentChanged();
    void execStringChanged();
    void startupClassChanged();
    void genericNameChanged();
    void categoriesChanged();
    void keywordsChanged();

private:
    QObject* m_entry;
    quint32 m_frequency;
};

class AppDb : public QObject {
    Q_OBJECT
    QML_ELEMENT

    Q_PROPERTY(QString uuid READ uuid CONSTANT)
    Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged REQUIRED)
    Q_PROPERTY(QObjectList entries READ entries WRITE setEntries NOTIFY entriesChanged REQUIRED)
    Q_PROPERTY(QQmlListProperty<caelestia::AppEntry> apps READ apps NOTIFY appsChanged)

public:
    explicit AppDb(QObject* parent = nullptr);

    [[nodiscard]] QString uuid() const;

    [[nodiscard]] QString path() const;
    void setPath(const QString& path);

    [[nodiscard]] QObjectList entries() const;
    void setEntries(const QObjectList& entries);

    [[nodiscard]] QQmlListProperty<AppEntry> apps();

    Q_INVOKABLE void incrementFrequency(const QString& id);

signals:
    void pathChanged();
    void entriesChanged();
    void appsChanged();

private:
    QTimer* m_timer;

    const QString m_uuid;
    QString m_path;
    QObjectList m_entries;
    QHash<QString, AppEntry*> m_apps;
    mutable QList<AppEntry*> m_sortedApps;

    QList<AppEntry*>& getSortedApps() const;
    quint32 getFrequency(const QString& id) const;
    void updateAppFrequencies();
    void updateApps();
};

} // namespace caelestia