1 /*
2     SPDX-FileCopyrightText: 2010-2018 Daniel Nicoletti <dantti12@gmail.com>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #ifndef PRINTER_MODEL_H
8 #define PRINTER_MODEL_H
9 
10 #include <QStandardItemModel>
11 #include <QTimer>
12 
13 #include <KCupsPrinter.h>
14 
15 class KCupsRequest;
16 class Q_DECL_EXPORT PrinterModel : public QStandardItemModel
17 {
18     Q_OBJECT
19     Q_ENUMS(JobAction)
20     Q_ENUMS(Role)
21     Q_PROPERTY(int count READ count NOTIFY countChanged)
22     Q_PROPERTY(bool serverUnavailable READ serverUnavailable NOTIFY serverUnavailableChanged)
23 public:
24     enum Role {
25         DestStatus = Qt::UserRole,
26         DestState,
27         DestName,
28         DestIsDefault,
29         DestIsShared,
30         DestIsAcceptingJobs,
31         DestIsPaused,
32         DestIsClass,
33         DestLocation,
34         DestDescription,
35         DestKind,
36         DestType,
37         DestCommands,
38         DestMarkerChangeTime,
39         DestMarkers,
40         DestIconName,
41         DestRemote
42     };
43 
44     enum JobAction {
45         Cancel,
46         Hold,
47         Release,
48         Move
49     };
50 
51     explicit PrinterModel(QObject *parent = nullptr);
52 
53     Qt::ItemFlags flags(const QModelIndex &index) const override;
54     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
55     int count() const;
56     bool serverUnavailable() const;
57 
58     virtual QHash<int,QByteArray> roleNames() const override;
59 
60     Q_INVOKABLE void pausePrinter(const QString &printerName);
61     Q_INVOKABLE void resumePrinter(const QString &printerName);
62     Q_INVOKABLE void rejectJobs(const QString &printerName);
63     Q_INVOKABLE void acceptJobs(const QString &printerName);
64 
65 public slots:
66     void update();
67     void getDestsFinished(KCupsRequest *request);
68     void slotCountChanged();
69 
70 signals:
71     void countChanged(int count);
72     void serverUnavailableChanged(bool unavailable);
73     void error(int lastError, const QString &errorTitle, const QString &errorMsg);
74 
75 private slots:
76     void insertUpdatePrinterName(const QString &printerName);
77     void insertUpdatePrinter(const QString &text,
78                              const QString &printerUri,
79                              const QString &printerName,
80                              uint printerState,
81                              const QString &printerStateReasons,
82                              bool printerIsAcceptingJobs);
83     void insertUpdatePrinterFinished(KCupsRequest *request);
84     void printerRemovedName(const QString &printerName);
85     void printerRemoved(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
86     void printerStateChanged(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
87     void printerStopped(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
88     void printerRestarted(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
89     void printerShutdown(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
90     void printerModified(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
91     void serverChanged(const QString &text);
92 
93 private:
94     WId m_parentId;
95     QHash<int, QByteArray> m_roles;
96     bool m_unavailable = true;
97 
98     int destRow(const QString &destName);
99     void insertDest(int pos, const KCupsPrinter &printer);
100     void updateDest(QStandardItem *item, const KCupsPrinter &printer);
101 
102     QString destStatus(KCupsPrinter::Status state, const QString &message, bool isAcceptingJobs) const;
103     void clear();
104 };
105 
106 #endif // PRINTER_MODEL_H
107