Lomiri
WorkspaceModel.h
1 /*
2  * Copyright (C) 2017 Canonical Ltd.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 3.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 #ifndef WORKSPACEMODEL_H
18 #define WORKSPACEMODEL_H
19 
20 #include <QAbstractListModel>
21 #include <QLoggingCategory>
22 #include <QPointer>
23 
24 Q_DECLARE_LOGGING_CATEGORY(WORKSPACES)
25 
26 class Workspace;
27 class ProxyWorkspaceModel;
28 class ProxyScreen;
29 
30 class WorkspaceModel : public QAbstractListModel
31 {
32  Q_OBJECT
33  Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
34 public:
40  enum Roles {
41  WorkspaceRole = Qt::UserRole
42  };
43 
44  explicit WorkspaceModel(QObject *parent = 0);
45  ~WorkspaceModel();
46 
47  void append(Workspace *workspace);
48  void insert(int index, Workspace *workspace);
49  void remove(Workspace* workspace);
50  virtual void move(int from, int to);
51 
52  Q_INVOKABLE int indexOf(Workspace *workspace) const;
53  Q_INVOKABLE Workspace* get(int index) const;
54 
55  // From QAbstractItemModel
56  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
57  QVariant data(const QModelIndex& index, int role) const override;
58  QHash<int, QByteArray> roleNames() const override {
59  QHash<int, QByteArray> roleNames { {WorkspaceRole, "workspace"} };
60  return roleNames;
61  }
62 
63  const QVector<Workspace*>& list() const { return m_workspaces; }
64 
65  void sync(WorkspaceModel* proxy);
66  void finishSync();
67 
68 Q_SIGNALS:
69  void countChanged();
70 
71  void workspaceInserted(int index, Workspace *workspace);
72  void workspaceRemoved(Workspace *workspace);
73  void workspaceMoved(int from, int to);
74 
75 protected:
76  void insertUnassigned(Workspace* workspace);
77 
78  QVector<Workspace*> m_workspaces;
79  QSet<Workspace*> m_unassignedWorkspaces;
80 
81  friend class ProxyWorkspaceModel;
82 };
83 
84 class ProxyWorkspaceModel : public WorkspaceModel
85 {
86  Q_OBJECT
87 public:
88  explicit ProxyWorkspaceModel(WorkspaceModel*const model, ProxyScreen* screen);
89 
90  Q_INVOKABLE void move(int from, int to) override;
91 
92  bool isSyncing() const;
93 
94 public Q_SLOTS:
95  void addWorkspace();
96 
97 protected:
98  const QPointer<WorkspaceModel> m_original;
99  const ProxyScreen* m_screen;
100 };
101 
102 #endif // WORKSPACEMODEL_H