6 #include "plasmawindowmodel.h"
7 #include "plasmawindowmanagement.h"
15 class Q_DECL_HIDDEN PlasmaWindowModel::Private
18 Private(PlasmaWindowModel *q);
20 PlasmaWindow *
window =
nullptr;
22 void addWindow(PlasmaWindow *window);
23 void dataChanged(PlasmaWindow *window,
int role);
29 PlasmaWindowModel::Private::Private(PlasmaWindowModel *q)
34 void PlasmaWindowModel::Private::addWindow(PlasmaWindow *window)
36 if (windows.indexOf(window) != -1) {
40 const int count = windows.count();
42 windows.append(window);
45 auto removeWindow = [
window,
this] {
46 const int row = windows.indexOf(window);
49 windows.removeAt(row);
66 this->dataChanged(window, PlasmaWindowModel::AppId);
70 this->dataChanged(window, IsActive);
73 QObject::connect(window, &PlasmaWindow::fullscreenableChanged, q, [window,
this] {
74 this->dataChanged(window, IsFullscreenable);
77 QObject::connect(window, &PlasmaWindow::fullscreenChanged, q, [window,
this] {
78 this->dataChanged(window, IsFullscreen);
81 QObject::connect(window, &PlasmaWindow::maximizeableChanged, q, [window,
this] {
82 this->dataChanged(window, IsMaximizable);
85 QObject::connect(window, &PlasmaWindow::maximizedChanged, q, [window,
this] {
86 this->dataChanged(window, IsMaximized);
89 QObject::connect(window, &PlasmaWindow::minimizeableChanged, q, [window,
this] {
90 this->dataChanged(window, IsMinimizable);
93 QObject::connect(window, &PlasmaWindow::minimizedChanged, q, [window,
this] {
94 this->dataChanged(window, IsMinimized);
97 QObject::connect(window, &PlasmaWindow::keepAboveChanged, q, [window,
this] {
98 this->dataChanged(window, IsKeepAbove);
101 QObject::connect(window, &PlasmaWindow::keepBelowChanged, q, [window,
this] {
102 this->dataChanged(window, IsKeepBelow);
105 #if KWAYLANDCLIENT_BUILD_DEPRECATED_SINCE(5, 52)
106 QObject::connect(window, &PlasmaWindow::virtualDesktopChanged, q, [window,
this] {
107 this->dataChanged(window, VirtualDesktop);
111 QObject::connect(window, &PlasmaWindow::onAllDesktopsChanged, q, [window,
this] {
112 this->dataChanged(window, IsOnAllDesktops);
115 QObject::connect(window, &PlasmaWindow::demandsAttentionChanged, q, [window,
this] {
116 this->dataChanged(window, IsDemandingAttention);
119 QObject::connect(window, &PlasmaWindow::skipTaskbarChanged, q, [window,
this] {
120 this->dataChanged(window, SkipTaskbar);
123 QObject::connect(window, &PlasmaWindow::skipSwitcherChanged, q, [window,
this] {
124 this->dataChanged(window, SkipSwitcher);
127 QObject::connect(window, &PlasmaWindow::shadeableChanged, q, [window,
this] {
128 this->dataChanged(window, IsShadeable);
132 this->dataChanged(window, IsShaded);
136 this->dataChanged(window, IsMovable);
139 QObject::connect(window, &PlasmaWindow::resizableChanged, q, [window,
this] {
140 this->dataChanged(window, IsResizable);
143 QObject::connect(window, &PlasmaWindow::virtualDesktopChangeableChanged, q, [window,
this] {
144 this->dataChanged(window, IsVirtualDesktopChangeable);
147 QObject::connect(window, &PlasmaWindow::closeableChanged, q, [window,
this] {
148 this->dataChanged(window, IsCloseable);
151 QObject::connect(window, &PlasmaWindow::geometryChanged, q, [window,
this] {
152 this->dataChanged(window, Geometry);
155 QObject::connect(window, &PlasmaWindow::plasmaVirtualDesktopEntered, q, [window,
this] {
156 this->dataChanged(window, VirtualDesktops);
159 QObject::connect(window, &PlasmaWindow::plasmaVirtualDesktopLeft, q, [window,
this] {
160 this->dataChanged(window, VirtualDesktops);
164 void PlasmaWindowModel::Private::dataChanged(PlasmaWindow *window,
int role)
166 QModelIndex idx = q->index(windows.indexOf(window));
167 Q_EMIT q->dataChanged(idx, idx,
QVector<int>() << role);
170 PlasmaWindowModel::PlasmaWindowModel(PlasmaWindowManagement *parent)
172 , d(new Private(this))
174 connect(
parent, &PlasmaWindowManagement::interfaceAboutToBeReleased,
this, [
this] {
180 connect(
parent, &PlasmaWindowManagement::windowCreated,
this, [
this](PlasmaWindow *window) {
181 d->addWindow(window);
184 for (
auto it =
parent->windows().constBegin(); it !=
parent->windows().constEnd(); ++it) {
189 PlasmaWindowModel::~PlasmaWindowModel()
200 QMetaEnum e = metaObject()->enumerator(metaObject()->indexOfEnumerator(
"AdditionalRoles"));
202 for (
int i = 0; i < e.
keyCount(); ++i) {
211 if (!index.
isValid() || index.
row() >= d->windows.count()) {
215 const PlasmaWindow *
window = d->windows.at(index.
row());
221 }
else if (role == AppId) {
223 }
else if (role == Pid) {
225 }
else if (role == IsActive) {
226 return window->isActive();
227 }
else if (role == IsFullscreenable) {
228 return window->isFullscreenable();
229 }
else if (role == IsFullscreen) {
230 return window->isFullscreen();
231 }
else if (role == IsMaximizable) {
232 return window->isMaximizeable();
233 }
else if (role == IsMaximized) {
235 }
else if (role == IsMinimizable) {
236 return window->isMinimizeable();
237 }
else if (role == IsMinimized) {
239 }
else if (role == IsKeepAbove) {
240 return window->isKeepAbove();
241 }
else if (role == IsKeepBelow) {
242 return window->isKeepBelow();
243 }
else if (role == IsOnAllDesktops) {
244 return window->isOnAllDesktops();
245 }
else if (role == IsDemandingAttention) {
246 return window->isDemandingAttention();
247 }
else if (role == SkipTaskbar) {
248 return window->skipTaskbar();
249 }
else if (role == SkipSwitcher) {
250 return window->skipSwitcher();
251 }
else if (role == IsShadeable) {
252 return window->isShadeable();
253 }
else if (role == IsShaded) {
254 return window->isShaded();
255 }
else if (role == IsMovable) {
256 return window->isMovable();
257 }
else if (role == IsResizable) {
258 return window->isResizable();
259 }
else if (role == IsVirtualDesktopChangeable) {
260 return window->isVirtualDesktopChangeable();
261 }
else if (role == IsCloseable) {
262 return window->isCloseable();
263 }
else if (role == Geometry) {
265 }
else if (role == VirtualDesktops) {
266 return window->plasmaVirtualDesktops();
267 }
else if (role == Uuid) {
270 #if KWAYLANDCLIENT_BUILD_DEPRECATED_SINCE(5, 52)
271 else if (role == VirtualDesktop) {
272 return window->virtualDesktop();
281 for (
int role = AppId; role < LastRole; ++role) {
282 ret.
insert(role, data(index, role));
287 int PlasmaWindowModel::rowCount(
const QModelIndex &parent)
const
289 return parent.
isValid() ? 0 : d->windows.count();
294 return hasIndex(row, column, parent) ? createIndex(row, column, d->windows.at(row)) :
QModelIndex();
297 Q_INVOKABLE
void PlasmaWindowModel::requestActivate(
int row)
299 if (row >= 0 && row < d->windows.count()) {
300 d->windows.at(row)->requestActivate();
304 Q_INVOKABLE
void PlasmaWindowModel::requestClose(
int row)
306 if (row >= 0 && row < d->windows.count()) {
307 d->windows.at(row)->requestClose();
311 Q_INVOKABLE
void PlasmaWindowModel::requestMove(
int row)
313 if (row >= 0 && row < d->windows.count()) {
314 d->windows.at(row)->requestMove();
318 Q_INVOKABLE
void PlasmaWindowModel::requestResize(
int row)
320 if (row >= 0 && row < d->windows.count()) {
321 d->windows.at(row)->requestResize();
325 #if KWAYLANDCLIENT_BUILD_DEPRECATED_SINCE(5, 52)
326 Q_INVOKABLE
void PlasmaWindowModel::requestVirtualDesktop(
int row, quint32 desktop)
328 if (row >= 0 && row < d->windows.count()) {
329 d->windows.at(row)->requestVirtualDesktop(desktop);
334 Q_INVOKABLE
void PlasmaWindowModel::requestEnterVirtualDesktop(
int row,
const QString &
id)
336 if (row >= 0 && row < d->windows.count()) {
337 d->windows.at(row)->requestEnterVirtualDesktop(
id);
341 Q_INVOKABLE
void PlasmaWindowModel::requestToggleKeepAbove(
int row)
343 if (row >= 0 && row < d->windows.count()) {
344 d->windows.at(row)->requestToggleKeepAbove();
348 Q_INVOKABLE
void PlasmaWindowModel::requestToggleKeepBelow(
int row)
350 if (row >= 0 && row < d->windows.count()) {
351 d->windows.at(row)->requestToggleKeepBelow();
355 Q_INVOKABLE
void PlasmaWindowModel::requestToggleMinimized(
int row)
357 if (row >= 0 && row < d->windows.count()) {
358 d->windows.at(row)->requestToggleMinimized();
362 Q_INVOKABLE
void PlasmaWindowModel::requestToggleMaximized(
int row)
364 if (row >= 0 && row < d->windows.count()) {
365 d->windows.at(row)->requestToggleMaximized();
369 Q_INVOKABLE
void PlasmaWindowModel::setMinimizedGeometry(
int row,
Surface *panel,
const QRect &geom)
371 if (row >= 0 && row < d->windows.count()) {
372 d->windows.at(row)->setMinimizedGeometry(panel, geom);
376 Q_INVOKABLE
void PlasmaWindowModel::requestToggleShaded(
int row)
378 if (row >= 0 && row < d->windows.count()) {
379 d->windows.at(row)->requestToggleShaded();