diff options
author | dt <qtc-committer@nokia.com> | 2010-04-29 16:52:31 +0200 |
---|---|---|
committer | dt <qtc-committer@nokia.com> | 2010-04-30 11:55:03 +0200 |
commit | a60d55bdadf2278dfddc1b30f4133a40600a18b4 (patch) | |
tree | e9470cac406e961d29dd401fc500849afc6c7871 /src/plugins/projectexplorer/buildconfigurationmodel.cpp | |
parent | 708dad7c8efa85996f24bc2ecb504506bbd1e8df (diff) | |
download | qt-creator-a60d55bdadf2278dfddc1b30f4133a40600a18b4.tar.gz |
Sort build & run configurations in the ui
Implement a BuildConfigurationModel which does the sorting.
Extend the RunConfigurationModel to do sorting.
Make the mini target selector and project page use both of those models.
Task-Nr: QTCREATORBUG-1235
Diffstat (limited to 'src/plugins/projectexplorer/buildconfigurationmodel.cpp')
-rw-r--r-- | src/plugins/projectexplorer/buildconfigurationmodel.cpp | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/src/plugins/projectexplorer/buildconfigurationmodel.cpp b/src/plugins/projectexplorer/buildconfigurationmodel.cpp new file mode 100644 index 0000000000..a9f93b675c --- /dev/null +++ b/src/plugins/projectexplorer/buildconfigurationmodel.cpp @@ -0,0 +1,180 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "buildconfigurationmodel.h" +#include "target.h" +#include "buildconfiguration.h" + +using namespace ProjectExplorer; + +/// +/// RunConfigurationsModel +/// + +class BuildConfigurationComparer +{ +public: + bool operator()(BuildConfiguration *a, BuildConfiguration *b) + { + return a->displayName() < b->displayName(); + } +}; + +BuildConfigurationModel::BuildConfigurationModel(Target *target, QObject *parent) + : QAbstractListModel(parent), + m_target(target) +{ + m_buildConfigurations = m_target->buildConfigurations(); + qSort(m_buildConfigurations.begin(), m_buildConfigurations.end(), BuildConfigurationComparer()); + + connect(target, SIGNAL(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), + this, SLOT(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*))); + connect(target, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), + this, SLOT(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*))); + + foreach (BuildConfiguration *bc, m_buildConfigurations) + connect(bc, SIGNAL(displayNameChanged()), + this, SLOT(displayNameChanged())); +} + +int BuildConfigurationModel::rowCount(const QModelIndex &parent) const +{ + return parent.isValid() ? 0 : m_buildConfigurations.size(); +} + +int BuildConfigurationModel::columnCount(const QModelIndex &parent) const +{ + return parent.isValid() ? 0 : 1; +} + +void BuildConfigurationModel::displayNameChanged() +{ + BuildConfiguration *rc = qobject_cast<BuildConfiguration *>(sender()); + if (!rc) + return; + + BuildConfigurationComparer compare; + // Find the old position + int oldPos = m_buildConfigurations.indexOf(rc); + + if (oldPos >= 1 && compare(m_buildConfigurations.at(oldPos), m_buildConfigurations.at(oldPos - 1))) { + // We need to move up + int newPos = oldPos - 1; + while (newPos >= 0 && compare(m_buildConfigurations.at(oldPos), m_buildConfigurations.at(newPos))) { + --newPos; + } + ++newPos; + + beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos); + m_buildConfigurations.insert(newPos, rc); + m_buildConfigurations.removeAt(oldPos + 1); + endMoveRows(); + // Not only did we move, we also changed... + emit dataChanged(index(newPos, 0), index(newPos,0)); + } else if (oldPos < m_buildConfigurations.size() - 1 + && compare(m_buildConfigurations.at(oldPos + 1), m_buildConfigurations.at(oldPos))) { + // We need to move down + int newPos = oldPos + 1; + while (newPos < m_buildConfigurations.size() + && compare(m_buildConfigurations.at(newPos), m_buildConfigurations.at(oldPos))) { + ++newPos; + } + beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos); + m_buildConfigurations.insert(newPos, rc); + m_buildConfigurations.removeAt(oldPos); + endMoveRows(); + + // We need to subtract one since removing at the old place moves the newIndex down + emit dataChanged(index(newPos - 1, 0), index(newPos - 1, 0)); + } else { + emit dataChanged(index(oldPos, 0), index(oldPos, 0)); + } +} + +QVariant BuildConfigurationModel::data(const QModelIndex &index, int role) const +{ + if (role == Qt::DisplayRole) { + const int row = index.row(); + if (row < m_buildConfigurations.size()) { + return m_buildConfigurations.at(row)->displayName(); + } + } + + return QVariant(); +} + +BuildConfiguration *BuildConfigurationModel::buildConfigurationAt(int i) +{ + if (i > m_buildConfigurations.size() || i < 0) + return 0; + return m_buildConfigurations.at(i); +} + +BuildConfiguration *BuildConfigurationModel::buildConfigurationFor(const QModelIndex &idx) +{ + if (idx.row() > m_buildConfigurations.size() || idx.row() < 0) + return 0; + return m_buildConfigurations.at(idx.row()); +} + +QModelIndex BuildConfigurationModel::indexFor(BuildConfiguration *rc) +{ + int idx = m_buildConfigurations.indexOf(rc); + if (idx == -1) + return QModelIndex(); + return index(idx, 0); +} + +void BuildConfigurationModel::addedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) +{ + // Find the right place to insert + BuildConfigurationComparer compare; + int i = 0; + for (; i < m_buildConfigurations.size(); ++i) { + if (compare(bc, m_buildConfigurations.at(i))) { + break; + } + } + + beginInsertRows(QModelIndex(), i, i); + m_buildConfigurations.insert(i, bc); + endInsertRows(); + + + connect(bc, SIGNAL(displayNameChanged()), + this, SLOT(displayNameChanged())); +} + +void BuildConfigurationModel::removedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) +{ + int i = m_buildConfigurations.indexOf(bc); + beginRemoveRows(QModelIndex(), i, i); + m_buildConfigurations.removeAt(i); + endRemoveRows(); +} |