93e0265e4e
Once in a while, we receive complaints from other fellow KDE developers about the file organization of kwin. This change addresses some of those complaints by moving all of source code in a separate directory, src/, thus making the project structure more traditional. Things such as tests are kept in their own toplevel directories. This change may wreak havoc on merge requests that add new files to kwin, but if a patch modifies an already existing file, git should be smart enough to figure out that the file has been relocated. We may potentially split the src/ directory further to make navigating the source code easier, but hopefully this is good enough already.
176 lines
4.7 KiB
C++
176 lines
4.7 KiB
C++
/*
|
|
KWin - the KDE window manager
|
|
This file is part of the KDE project.
|
|
|
|
SPDX-FileCopyrightText: 2009 Martin Gräßlin <mgraesslin@kde.org>
|
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
// own
|
|
#include "desktopmodel.h"
|
|
// tabbox
|
|
#include "clientmodel.h"
|
|
#include "tabboxconfig.h"
|
|
#include "tabboxhandler.h"
|
|
|
|
#include <cmath>
|
|
|
|
namespace KWin
|
|
{
|
|
namespace TabBox
|
|
{
|
|
|
|
DesktopModel::DesktopModel(QObject* parent)
|
|
: QAbstractItemModel(parent)
|
|
{
|
|
}
|
|
|
|
DesktopModel::~DesktopModel()
|
|
{
|
|
}
|
|
|
|
QVariant DesktopModel::data(const QModelIndex& index, int role) const
|
|
{
|
|
if (!index.isValid() || index.column() != 0)
|
|
return QVariant();
|
|
|
|
if (index.parent().isValid()) {
|
|
// parent is valid -> access to Client
|
|
ClientModel *model = m_clientModels[ m_desktopList[ index.internalId() - 1] ];
|
|
return model->data(model->index(index.row(), 0), role);
|
|
}
|
|
|
|
const int desktopIndex = index.row();
|
|
if (desktopIndex >= m_desktopList.count())
|
|
return QVariant();
|
|
switch(role) {
|
|
case Qt::DisplayRole:
|
|
case DesktopNameRole:
|
|
return tabBox->desktopName(m_desktopList[ desktopIndex ]);
|
|
case DesktopRole:
|
|
return m_desktopList[ desktopIndex ];
|
|
case ClientModelRole:
|
|
return QVariant::fromValue<void *>(m_clientModels[m_desktopList[desktopIndex]]);
|
|
default:
|
|
return QVariant();
|
|
}
|
|
}
|
|
|
|
QString DesktopModel::longestCaption() const
|
|
{
|
|
QString caption;
|
|
for (int desktop : m_desktopList) {
|
|
QString desktopName = tabBox->desktopName(desktop);
|
|
if (desktopName.size() > caption.size()) {
|
|
caption = desktopName;
|
|
}
|
|
}
|
|
return caption;
|
|
}
|
|
|
|
int DesktopModel::columnCount(const QModelIndex& parent) const
|
|
{
|
|
Q_UNUSED(parent)
|
|
return 1;
|
|
}
|
|
|
|
int DesktopModel::rowCount(const QModelIndex& parent) const
|
|
{
|
|
if (parent.isValid()) {
|
|
if (parent.internalId() != 0 || parent.row() >= m_desktopList.count()) {
|
|
return 0;
|
|
}
|
|
const int desktop = m_desktopList.at(parent.row());
|
|
const ClientModel *model = m_clientModels.value(desktop);
|
|
return model->rowCount();
|
|
}
|
|
return m_desktopList.count();
|
|
}
|
|
|
|
QModelIndex DesktopModel::parent(const QModelIndex& child) const
|
|
{
|
|
if (!child.isValid() || child.internalId() == 0) {
|
|
return QModelIndex();
|
|
}
|
|
const int row = child.internalId() -1;
|
|
if (row >= m_desktopList.count()) {
|
|
return QModelIndex();
|
|
}
|
|
return createIndex(row, 0);
|
|
}
|
|
|
|
QModelIndex DesktopModel::index(int row, int column, const QModelIndex& parent) const
|
|
{
|
|
if (column != 0) {
|
|
return QModelIndex();
|
|
}
|
|
if (row < 0) {
|
|
return QModelIndex();
|
|
}
|
|
if (parent.isValid()) {
|
|
if (parent.row() < 0 || parent.row() >= m_desktopList.count() || parent.internalId() != 0) {
|
|
return QModelIndex();
|
|
}
|
|
const int desktop = m_desktopList.at(parent.row());
|
|
const ClientModel *model = m_clientModels.value(desktop);
|
|
if (row >= model->rowCount()) {
|
|
return QModelIndex();
|
|
}
|
|
return createIndex(row, column, parent.row() + 1);
|
|
}
|
|
if (row > m_desktopList.count() || m_desktopList.isEmpty())
|
|
return QModelIndex();
|
|
return createIndex(row, column);
|
|
}
|
|
|
|
QHash<int, QByteArray> DesktopModel::roleNames() const
|
|
{
|
|
return {
|
|
{ Qt::DisplayRole, QByteArrayLiteral("display") },
|
|
{ DesktopNameRole, QByteArrayLiteral("caption") },
|
|
{ DesktopRole, QByteArrayLiteral("desktop") },
|
|
{ ClientModelRole, QByteArrayLiteral("client") },
|
|
};
|
|
}
|
|
|
|
QModelIndex DesktopModel::desktopIndex(int desktop) const
|
|
{
|
|
if (desktop > m_desktopList.count())
|
|
return QModelIndex();
|
|
return createIndex(m_desktopList.indexOf(desktop), 0);
|
|
}
|
|
|
|
void DesktopModel::createDesktopList()
|
|
{
|
|
beginResetModel();
|
|
m_desktopList.clear();
|
|
qDeleteAll(m_clientModels);
|
|
m_clientModels.clear();
|
|
|
|
switch(tabBox->config().desktopSwitchingMode()) {
|
|
case TabBoxConfig::MostRecentlyUsedDesktopSwitching: {
|
|
int desktop = tabBox->currentDesktop();
|
|
do {
|
|
m_desktopList.append(desktop);
|
|
ClientModel* clientModel = new ClientModel(this);
|
|
clientModel->createClientList(desktop);
|
|
m_clientModels.insert(desktop, clientModel);
|
|
desktop = tabBox->nextDesktopFocusChain(desktop);
|
|
} while (desktop != tabBox->currentDesktop());
|
|
break;
|
|
}
|
|
case TabBoxConfig::StaticDesktopSwitching: {
|
|
for (int i = 1; i <= tabBox->numberOfDesktops(); i++) {
|
|
m_desktopList.append(i);
|
|
ClientModel* clientModel = new ClientModel(this);
|
|
clientModel->createClientList(i);
|
|
m_clientModels.insert(i, clientModel);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
endResetModel();
|
|
}
|
|
|
|
} // namespace Tabbox
|
|
} // namespace KWin
|