kwin/tabbox/desktopmodel.cpp

188 lines
5.4 KiB
C++
Raw Normal View History

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2009 Martin Gräßlin <mgraesslin@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
// own
#include "desktopmodel.h"
// tabbox
#include "clientmodel.h"
#include "tabboxconfig.h"
#include "tabboxhandler.h"
#include <cmath>
namespace KWin
{
namespace TabBox
{
2011-01-30 14:34:42 +00:00
DesktopModel::DesktopModel(QObject* parent)
: QAbstractItemModel(parent)
{
}
DesktopModel::~DesktopModel()
2011-01-30 14:34:42 +00:00
{
}
2011-01-30 14:34:42 +00:00
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();
2011-01-30 14:34:42 +00:00
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]]);
2011-01-30 14:34:42 +00:00
default:
return QVariant();
}
2011-01-30 14:34:42 +00:00
}
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;
}
2011-01-30 14:34:42 +00:00
int DesktopModel::columnCount(const QModelIndex& parent) const
{
Q_UNUSED(parent)
return 1;
2011-01-30 14:34:42 +00:00
}
2011-01-30 14:34:42 +00:00
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();
2011-01-30 14:34:42 +00:00
}
2011-01-30 14:34:42 +00:00
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);
2011-01-30 14:34:42 +00:00
}
2011-01-30 14:34:42 +00:00
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();
2011-01-30 14:34:42 +00:00
return createIndex(row, column);
}
QHash<int, QByteArray> DesktopModel::roleNames() const
{
return {
{ Qt::DisplayRole, QByteArrayLiteral("display") },
{ DesktopNameRole, QByteArrayLiteral("caption") },
{ DesktopRole, QByteArrayLiteral("desktop") },
{ ClientModelRole, QByteArrayLiteral("client") },
};
}
2011-01-30 14:34:42 +00:00
QModelIndex DesktopModel::desktopIndex(int desktop) const
{
if (desktop > m_desktopList.count())
return QModelIndex();
return createIndex(m_desktopList.indexOf(desktop), 0);
2011-01-30 14:34:42 +00:00
}
void DesktopModel::createDesktopList()
2011-01-30 14:34:42 +00:00
{
beginResetModel();
m_desktopList.clear();
2011-01-30 14:34:42 +00:00
qDeleteAll(m_clientModels);
m_clientModels.clear();
2011-01-30 14:34:42 +00:00
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);
}
2011-01-30 14:34:42 +00:00
break;
}
2011-01-30 14:34:42 +00:00
}
endResetModel();
2011-01-30 14:34:42 +00:00
}
} // namespace Tabbox
} // namespace KWin