/* SPDX-FileCopyrightText: 2016 Eike Hein SPDX-License-Identifier: GPL-2.0-or-later */ #include "windowmodel.h" #include "pagermodel.h" #include #include #include #include #include using namespace TaskManager; class WindowModel::Private { public: explicit Private(WindowModel *q); PagerModel *pagerModel = nullptr; private: WindowModel *const q; }; WindowModel::Private::Private(WindowModel *q) : q(q) { Q_UNUSED(this->q); } WindowModel::WindowModel(PagerModel *parent) : TaskFilterProxyModel(parent) , d(new Private(this)) { d->pagerModel = parent; connect(parent, &PagerModel::pagerItemSizeChanged, this, &WindowModel::onPagerItemSizeChanged); connect(this, &QAbstractItemModel::dataChanged, this, [this](const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList &roles) { if (roles.contains(AbstractTasksModel::StackingOrder)) { Q_EMIT dataChanged(topLeft, bottomRight, {WindowModelRoles::PagerStackingOrder}); } }); } WindowModel::~WindowModel() { } QHash WindowModel::roleNames() const { QHash roles = TaskFilterProxyModel::roleNames(); QMetaEnum e = metaObject()->enumerator(metaObject()->indexOfEnumerator("WindowModelRoles")); for (int i = 0; i < e.keyCount(); ++i) { roles.insert(e.value(i), e.key(i)); } return roles; } QVariant WindowModel::data(const QModelIndex &index, int role) const { if (role == AbstractTasksModel::Geometry) { QRect windowGeo = TaskFilterProxyModel::data(index, role).toRect(); const QRect clampingRect(QPoint(0, 0), d->pagerModel->pagerItemSize()); if (filterByScreen() && screenGeometry().isValid()) { const QPoint &screenOffset = screenGeometry().topLeft(); windowGeo.translate(0 - screenOffset.x(), 0 - screenOffset.y()); } // Restrict to desktop/screen rect. return windowGeo.intersected(clampingRect); } else if (role == WindowModelRoles::PagerStackingOrder) { const auto &winId = TaskFilterProxyModel::data(index, AbstractTasksModel::WinIdList); const int z = d->pagerModel->stackingOrder(index); if (z != -1) { return z; } return 0; } return TaskFilterProxyModel::data(index, role); } void WindowModel::onPagerItemSizeChanged() { if (rowCount() > 0) { Q_EMIT dataChanged(index(0, 0), index(rowCount() - 1, 0), {AbstractTasksModel::Geometry}); } } #include "moc_windowmodel.cpp"