KWin
Loading...
Searching...
No Matches
tilemodel.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2022 Marco Martin <mart@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10#include "tilemodel.h"
11#include "tiles/tilemanager.h"
12#include "workspace.h"
13
14#include <KConfigGroup>
15#include <KLocalizedString>
16#include <KSharedConfig>
17
18#include <QJsonArray>
19#include <QJsonDocument>
20#include <QJsonObject>
21#include <QTimer>
22
23namespace KWin
24{
25
27 : QAbstractItemModel(parent)
28 , m_tileManager(parent)
29{
30}
31
35
36QHash<int, QByteArray> TileModel::roleNames() const
37{
38 return {
39 {TileRole, QByteArrayLiteral("tile")},
40 };
41}
42
43QVariant TileModel::data(const QModelIndex &index, int role) const
44{
45 if (!index.isValid()) {
46 return QVariant();
47 }
48
49 if (role == TileRole) {
50 return QVariant::fromValue(static_cast<CustomTile *>(index.internalPointer()));
51 }
52
53 return QVariant();
54}
55
56Qt::ItemFlags TileModel::flags(const QModelIndex &index) const
57{
58 if (!index.isValid()) {
59 return Qt::NoItemFlags;
60 }
61
62 return QAbstractItemModel::flags(index);
63}
64
65QModelIndex TileModel::index(int row, int column, const QModelIndex &parent) const
66{
67 if (column > 0 || !hasIndex(row, column, parent)) {
68 return QModelIndex();
69 }
70
71 CustomTile *parentItem;
72
73 if (!parent.isValid()) {
74 parentItem = m_tileManager->rootTile();
75 } else {
76 parentItem = static_cast<CustomTile *>(parent.internalPointer());
77 }
78
79 CustomTile *childItem = static_cast<CustomTile *>(parentItem->childTile(row));
80 if (childItem) {
81 return createIndex(row, column, childItem);
82 }
83 return QModelIndex();
84}
85
86QModelIndex TileModel::parent(const QModelIndex &index) const
87{
88 if (!index.isValid()) {
89 return QModelIndex();
90 }
91
92 CustomTile *childItem = static_cast<CustomTile *>(index.internalPointer());
93 CustomTile *parentItem = static_cast<CustomTile *>(childItem->parentTile());
94
95 if (!parentItem || parentItem == m_tileManager->rootTile()) {
96 return QModelIndex();
97 }
98
99 return createIndex(parentItem->row(), 0, parentItem);
100}
101
102int TileModel::rowCount(const QModelIndex &parent) const
103{
104 Tile *parentItem;
105 if (parent.column() > 0) {
106 return 0;
107 }
108
109 if (!parent.isValid()) {
110 parentItem = m_tileManager->rootTile();
111 } else {
112 parentItem = static_cast<CustomTile *>(parent.internalPointer());
113 }
114
115 return parentItem->childCount();
116}
117
118int TileModel::columnCount(const QModelIndex &parent) const
119{
120 return 1;
121}
122
123void TileModel::beginInsertTile(CustomTile *tile, int position)
124{
125 Q_ASSERT(position >= 0);
126 CustomTile *parentTile = static_cast<CustomTile *>(tile->parentTile());
127 Q_ASSERT(parentTile);
128
129 auto index = parentTile == m_tileManager->rootTile() ? QModelIndex() : createIndex(parentTile->row(), 0, parentTile);
130 const int pos = std::clamp(position, 0, parentTile->childCount());
131
132 beginInsertRows(index, pos, pos);
133}
134
135void TileModel::endInsertTile()
136{
137 endInsertRows();
138}
139
140void TileModel::beginRemoveTile(CustomTile *tile)
141{
142 const auto parentTile = static_cast<CustomTile *>(tile->parentTile());
143 if (!parentTile) {
144 qCWarning(KWIN_CORE) << "Can't remove the root tile";
145 return;
146 }
147
148 QModelIndex parentIndex = parentTile == m_tileManager->rootTile() ? QModelIndex() : createIndex(parentTile->row(), 0, parentTile);
149 beginRemoveRows(parentIndex, tile->row(), tile->row());
150}
151
152void TileModel::endRemoveTile()
153{
154 endRemoveRows();
155}
156
157} // namespace KWin
158
159#include "moc_tilemodel.cpp"
int row() const
Definition tile.cpp:394
Tile * childTile(int row)
Definition tile.cpp:354
Tile * parentTile() const
Definition tile.cpp:376
int childCount() const
Definition tile.cpp:362
KWin::Tile * rootTile
Definition tilemanager.h:40
Qt::ItemFlags flags(const QModelIndex &index) const override
Definition tilemodel.cpp:56
QHash< int, QByteArray > roleNames() const override
Definition tilemodel.cpp:36
friend class CustomTile
Definition tilemodel.h:63
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
Definition tilemodel.cpp:65
QVariant data(const QModelIndex &index, int role) const override
Definition tilemodel.cpp:43
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QModelIndex parent(const QModelIndex &index) const override
Definition tilemodel.cpp:86
int columnCount(const QModelIndex &parent=QModelIndex()) const override
~TileModel() override
Definition tilemodel.cpp:32
TileModel(TileManager *parent=nullptr)
Definition tilemodel.cpp:26