diff --git a/src/plugins/projectexplorer/buildconfigurationmodel.cpp b/src/plugins/projectexplorer/buildconfigurationmodel.cpp deleted file mode 100644 index b8ef079f383..00000000000 --- a/src/plugins/projectexplorer/buildconfigurationmodel.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "buildconfigurationmodel.h" -#include "target.h" -#include "buildconfiguration.h" - -#include - -using namespace ProjectExplorer; - -/*! - \class ProjectExplorer::BuildConfigurationModel - \brief The BuildConfigurationModel class is a model to represent the build - configurations of a target. - - To be used in the dropdown lists of comboboxes. - Automatically adjusts itself to added and removed BuildConfigurations. - Very similar to the Run Configuration Model. - - TODO might it possible to share code without making the code a complete mess. -*/ - -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(); - Utils::sort(m_buildConfigurations, BuildConfigurationComparer()); - - connect(target, &Target::addedBuildConfiguration, - this, &BuildConfigurationModel::addedBuildConfiguration); - connect(target, &Target::removedBuildConfiguration, - this, &BuildConfigurationModel::removedBuildConfiguration); - - foreach (BuildConfiguration *bc, m_buildConfigurations) - connect(bc, &ProjectConfiguration::displayNameChanged, - this, &BuildConfigurationModel::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() -{ - auto rc = qobject_cast(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(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, &ProjectConfiguration::displayNameChanged, - this, &BuildConfigurationModel::displayNameChanged); -} - -void BuildConfigurationModel::removedBuildConfiguration(BuildConfiguration *bc) -{ - int i = m_buildConfigurations.indexOf(bc); - beginRemoveRows(QModelIndex(), i, i); - m_buildConfigurations.removeAt(i); - endRemoveRows(); -} diff --git a/src/plugins/projectexplorer/buildconfigurationmodel.h b/src/plugins/projectexplorer/buildconfigurationmodel.h deleted file mode 100644 index b5712f85fc8..00000000000 --- a/src/plugins/projectexplorer/buildconfigurationmodel.h +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include - -namespace ProjectExplorer { -class Target; -class BuildConfiguration; - -// Documentation inside. -class BuildConfigurationModel : public QAbstractListModel -{ - Q_OBJECT -public: - explicit BuildConfigurationModel(Target *target, QObject *parent = nullptr); - - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - int columnCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - - BuildConfiguration *buildConfigurationAt(int i); - BuildConfiguration *buildConfigurationFor(const QModelIndex &idx); - QModelIndex indexFor(BuildConfiguration *rc); - -private: - void addedBuildConfiguration(ProjectExplorer::BuildConfiguration*); - void removedBuildConfiguration(ProjectExplorer::BuildConfiguration*); - void displayNameChanged(); - - Target *m_target; - QList m_buildConfigurations; -}; - -} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp index 6319a59aea2..a144680a74f 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp @@ -29,7 +29,7 @@ #include "project.h" #include "target.h" #include "buildconfiguration.h" -#include "buildconfigurationmodel.h" +#include "projectconfigurationmodel.h" #include "session.h" #include @@ -218,7 +218,7 @@ void BuildSettingsWidget::updateBuildSettings() void BuildSettingsWidget::currentIndexChanged(int index) { auto model = static_cast(m_buildConfigurationComboBox->model()); - BuildConfiguration *buildConfiguration = model->buildConfigurationAt(index); + auto buildConfiguration = qobject_cast(model->projectConfigurationAt(index)); SessionManager::setActiveBuildConfiguration(m_target, buildConfiguration, SetActive::Cascade); } diff --git a/src/plugins/projectexplorer/deployconfigurationmodel.cpp b/src/plugins/projectexplorer/deployconfigurationmodel.cpp deleted file mode 100644 index b0e5dc70eb1..00000000000 --- a/src/plugins/projectexplorer/deployconfigurationmodel.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "deployconfigurationmodel.h" -#include "target.h" -#include "deployconfiguration.h" - -#include - -using namespace ProjectExplorer; - -/*! - \class ProjectExplorer::DeployConfigurationModel - - \brief The DeployConfigurationModel class provides a model to represent - the run configurations of a target. - - To be used in drop down lists of comboboxes. Automatically adjusts - itself to added and removed deploy configurations. -*/ - -class DeployConfigurationComparer -{ -public: - bool operator()(DeployConfiguration *a, DeployConfiguration *b) - { - return a->displayName() < b->displayName(); - } -}; - -DeployConfigurationModel::DeployConfigurationModel(Target *target, QObject *parent) : - QAbstractListModel(parent), - m_target(target) -{ - m_deployConfigurations = m_target->deployConfigurations(); - Utils::sort(m_deployConfigurations, DeployConfigurationComparer()); - - connect(target, &Target::addedDeployConfiguration, - this, &DeployConfigurationModel::addedDeployConfiguration); - connect(target, &Target::removedDeployConfiguration, - this, &DeployConfigurationModel::removedDeployConfiguration); - - foreach (DeployConfiguration *dc, m_deployConfigurations) { - connect(dc, &ProjectConfiguration::displayNameChanged, - this, &DeployConfigurationModel::displayNameChanged); - } -} - -int DeployConfigurationModel::rowCount(const QModelIndex &parent) const -{ - return parent.isValid() ? 0 : m_deployConfigurations.size(); -} - -int DeployConfigurationModel::columnCount(const QModelIndex &parent) const -{ - return parent.isValid() ? 0 : 1; -} - -void DeployConfigurationModel::displayNameChanged() -{ - auto dc = qobject_cast(sender()); - if (!dc) - return; - - DeployConfigurationComparer compare; - // Find the old position - int oldPos = m_deployConfigurations.indexOf(dc); - - if (oldPos >= 1 && compare(m_deployConfigurations.at(oldPos), m_deployConfigurations.at(oldPos - 1))) { - // We need to move up - int newPos = oldPos - 1; - while (newPos >= 0 && compare(m_deployConfigurations.at(oldPos), m_deployConfigurations.at(newPos))) { - --newPos; - } - ++newPos; - - beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos); - m_deployConfigurations.insert(newPos, dc); - m_deployConfigurations.removeAt(oldPos + 1); - endMoveRows(); - // Not only did we move, we also changed... - emit dataChanged(index(newPos, 0), index(newPos,0)); - } else if (oldPos < m_deployConfigurations.size() - 1 - && compare(m_deployConfigurations.at(oldPos + 1), m_deployConfigurations.at(oldPos))) { - // We need to move down - int newPos = oldPos + 1; - while (newPos < m_deployConfigurations.size() - && compare(m_deployConfigurations.at(newPos), m_deployConfigurations.at(oldPos))) { - ++newPos; - } - beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos); - m_deployConfigurations.insert(newPos, dc); - m_deployConfigurations.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 DeployConfigurationModel::data(const QModelIndex &index, int role) const -{ - if (role == Qt::DisplayRole) { - const int row = index.row(); - if (row < m_deployConfigurations.size()) - return m_deployConfigurations.at(row)->displayName(); - } - - return QVariant(); -} - -DeployConfiguration *DeployConfigurationModel::deployConfigurationAt(int i) -{ - if (i > m_deployConfigurations.size() || i < 0) - return nullptr; - return m_deployConfigurations.at(i); -} - -DeployConfiguration *DeployConfigurationModel::deployConfigurationFor(const QModelIndex &idx) -{ - if (idx.row() > m_deployConfigurations.size() || idx.row() < 0) - return nullptr; - return m_deployConfigurations.at(idx.row()); -} - -QModelIndex DeployConfigurationModel::indexFor(DeployConfiguration *rc) -{ - int idx = m_deployConfigurations.indexOf(rc); - if (idx == -1) - return QModelIndex(); - return index(idx, 0); -} - -void DeployConfigurationModel::addedDeployConfiguration(DeployConfiguration *dc) -{ - // Find the right place to insert - DeployConfigurationComparer compare; - int i = 0; - for (; i < m_deployConfigurations.size(); ++i) { - if (compare(dc, m_deployConfigurations.at(i))) - break; - } - - beginInsertRows(QModelIndex(), i, i); - m_deployConfigurations.insert(i, dc); - endInsertRows(); - - connect(dc, &ProjectConfiguration::displayNameChanged, - this, &DeployConfigurationModel::displayNameChanged); -} - -void DeployConfigurationModel::removedDeployConfiguration(DeployConfiguration *dc) -{ - int i = m_deployConfigurations.indexOf(dc); - if (i < 0) - return; - beginRemoveRows(QModelIndex(), i, i); - m_deployConfigurations.removeAt(i); - endRemoveRows(); -} diff --git a/src/plugins/projectexplorer/deployconfigurationmodel.h b/src/plugins/projectexplorer/deployconfigurationmodel.h deleted file mode 100644 index 95b6092898d..00000000000 --- a/src/plugins/projectexplorer/deployconfigurationmodel.h +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include - -namespace ProjectExplorer { - -class Target; -class DeployConfiguration; - -// Documentation inside. -class DeployConfigurationModel : public QAbstractListModel -{ - Q_OBJECT -public: - explicit DeployConfigurationModel(Target *target, QObject *parent = nullptr); - - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - int columnCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - - DeployConfiguration *deployConfigurationAt(int i); - DeployConfiguration *deployConfigurationFor(const QModelIndex &idx); - QModelIndex indexFor(DeployConfiguration *rc); - -private: - void addedDeployConfiguration(ProjectExplorer::DeployConfiguration*); - void removedDeployConfiguration(ProjectExplorer::DeployConfiguration*); - void displayNameChanged(); - - Target *m_target; - QList m_deployConfigurations; -}; - -} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectconfigurationmodel.cpp b/src/plugins/projectexplorer/projectconfigurationmodel.cpp new file mode 100644 index 00000000000..f27f1bf55b3 --- /dev/null +++ b/src/plugins/projectexplorer/projectconfigurationmodel.cpp @@ -0,0 +1,218 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "projectconfigurationmodel.h" + +#include "buildconfiguration.h" +#include "deployconfiguration.h" +#include "runconfiguration.h" +#include "target.h" +#include "projectconfiguration.h" + +#include + +using namespace ProjectExplorer; + +/*! + \class ProjectExplorer::BuildConfigurationModel + \brief The BuildConfigurationModel class is a model to represent the build + configurations of a target. + + To be used in the dropdown lists of comboboxes. + Automatically adjusts itself to added and removed BuildConfigurations. + Very similar to the Run Configuration Model. + + TODO might it possible to share code without making the code a complete mess. +*/ + +namespace { + +const auto ComparisonOperator = + [](const ProjectConfiguration *a, const ProjectConfiguration *b) { + return a->displayName() < b->displayName(); + }; + +} // namespace + +ProjectConfigurationModel::ProjectConfigurationModel(Target *target, FilterFunction filter, + QObject *parent) : + QAbstractListModel(parent), + m_target(target), + m_filter(filter) +{ + m_projectConfigurations = Utils::filtered(m_target->projectConfigurations(), m_filter); + Utils::sort(m_projectConfigurations, ComparisonOperator); + + connect(target, &Target::addedProjectConfiguration, + this, &ProjectConfigurationModel::addedProjectConfiguration); + connect(target, &Target::removedProjectConfiguration, + this, &ProjectConfigurationModel::removedProjectConfiguration); + + foreach (ProjectConfiguration *pc, m_projectConfigurations) + connect(pc, &ProjectConfiguration::displayNameChanged, + this, &ProjectConfigurationModel::displayNameChanged); +} + +int ProjectConfigurationModel::rowCount(const QModelIndex &parent) const +{ + return parent.isValid() ? 0 : m_projectConfigurations.size(); +} + +int ProjectConfigurationModel::columnCount(const QModelIndex &parent) const +{ + return parent.isValid() ? 0 : 1; +} + +void ProjectConfigurationModel::displayNameChanged() +{ + auto pc = qobject_cast(sender()); + if (!pc) + return; + + // Find the old position + int oldPos = m_projectConfigurations.indexOf(pc); + if (oldPos < 0) + return; + + if (oldPos >= 1 && ComparisonOperator(m_projectConfigurations.at(oldPos), m_projectConfigurations.at(oldPos - 1))) { + // We need to move up + int newPos = oldPos - 1; + while (newPos >= 0 && ComparisonOperator(m_projectConfigurations.at(oldPos), m_projectConfigurations.at(newPos))) { + --newPos; + } + ++newPos; + + beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos); + m_projectConfigurations.insert(newPos, pc); + m_projectConfigurations.removeAt(oldPos + 1); + endMoveRows(); + // Not only did we move, we also changed... + emit dataChanged(index(newPos, 0), index(newPos,0)); + } else if (oldPos < m_projectConfigurations.size() - 1 + && ComparisonOperator(m_projectConfigurations.at(oldPos + 1), m_projectConfigurations.at(oldPos))) { + // We need to move down + int newPos = oldPos + 1; + while (newPos < m_projectConfigurations.size() + && ComparisonOperator(m_projectConfigurations.at(newPos), m_projectConfigurations.at(oldPos))) { + ++newPos; + } + beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos); + m_projectConfigurations.insert(newPos, pc); + m_projectConfigurations.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 ProjectConfigurationModel::data(const QModelIndex &index, int role) const +{ + if (role == Qt::DisplayRole) { + const int row = index.row(); + if (row < m_projectConfigurations.size()) + return m_projectConfigurations.at(row)->displayName(); + } + + return QVariant(); +} + +ProjectConfiguration *ProjectConfigurationModel::projectConfigurationAt(int i) +{ + if (i > m_projectConfigurations.size() || i < 0) + return nullptr; + return m_projectConfigurations.at(i); +} + +ProjectConfiguration *ProjectConfigurationModel::projectConfigurationFor(const QModelIndex &idx) +{ + if (idx.row() > m_projectConfigurations.size() || idx.row() < 0) + return nullptr; + return m_projectConfigurations.at(idx.row()); +} + +QModelIndex ProjectConfigurationModel::indexFor(ProjectConfiguration *pc) +{ + int idx = m_projectConfigurations.indexOf(pc); + if (idx == -1) + return QModelIndex(); + return index(idx, 0); +} + +void ProjectConfigurationModel::addedProjectConfiguration(ProjectConfiguration *pc) +{ + if (!m_filter(pc)) + return; + + // Find the right place to insert + int i = 0; + for (; i < m_projectConfigurations.size(); ++i) { + if (ComparisonOperator(pc, m_projectConfigurations.at(i))) + break; + } + + beginInsertRows(QModelIndex(), i, i); + m_projectConfigurations.insert(i, pc); + endInsertRows(); + + connect(pc, &ProjectConfiguration::displayNameChanged, + this, &ProjectConfigurationModel::displayNameChanged); +} + +void ProjectConfigurationModel::removedProjectConfiguration(ProjectConfiguration *pc) +{ + int i = m_projectConfigurations.indexOf(pc); + if (i < 0) + return; + beginRemoveRows(QModelIndex(), i, i); + m_projectConfigurations.removeAt(i); + endRemoveRows(); +} + +BuildConfigurationModel::BuildConfigurationModel(Target *t, QObject *parent) : + ProjectConfigurationModel(t, + [](const ProjectConfiguration *pc) { + return qobject_cast(pc) != nullptr; + }, + parent) +{ } + +DeployConfigurationModel::DeployConfigurationModel(Target *t, QObject *parent) : + ProjectConfigurationModel(t, + [](const ProjectConfiguration *pc) { + return qobject_cast(pc) != nullptr; + }, + parent) +{ } + +RunConfigurationModel::RunConfigurationModel(Target *t, QObject *parent) : + ProjectConfigurationModel(t, + [](const ProjectConfiguration *pc) { + return qobject_cast(pc) != nullptr; + }, + parent) +{ } diff --git a/src/plugins/projectexplorer/runconfigurationmodel.h b/src/plugins/projectexplorer/projectconfigurationmodel.h similarity index 58% rename from src/plugins/projectexplorer/runconfigurationmodel.h rename to src/plugins/projectexplorer/projectconfigurationmodel.h index 8af2566b950..adc1a004029 100644 --- a/src/plugins/projectexplorer/runconfigurationmodel.h +++ b/src/plugins/projectexplorer/projectconfigurationmodel.h @@ -27,32 +27,56 @@ #include +#include + namespace ProjectExplorer { class Target; -class RunConfiguration; +class ProjectConfiguration; // Documentation inside. -class RunConfigurationModel : public QAbstractListModel +class ProjectConfigurationModel : public QAbstractListModel { Q_OBJECT - public: - explicit RunConfigurationModel(Target *target, QObject *parent = nullptr); + using FilterFunction = std::function; + + explicit ProjectConfigurationModel(Target *target, FilterFunction filter, + QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - RunConfiguration *runConfigurationAt(int i); - RunConfiguration *runConfigurationFor(const QModelIndex &idx); - QModelIndex indexFor(RunConfiguration *rc); + ProjectConfiguration *projectConfigurationAt(int i); + ProjectConfiguration *projectConfigurationFor(const QModelIndex &idx); + QModelIndex indexFor(ProjectConfiguration *pc); private: - void addedRunConfiguration(ProjectExplorer::RunConfiguration*); - void removedRunConfiguration(ProjectExplorer::RunConfiguration*); + void addedProjectConfiguration(ProjectConfiguration *pc); + void removedProjectConfiguration(ProjectConfiguration *pc); void displayNameChanged(); + Target *m_target; - QList m_runConfigurations; + FilterFunction m_filter; + QList m_projectConfigurations; +}; + +class BuildConfigurationModel : public ProjectConfigurationModel +{ +public: + explicit BuildConfigurationModel(Target *t, QObject *parent = nullptr); +}; + +class DeployConfigurationModel : public ProjectConfigurationModel +{ +public: + explicit DeployConfigurationModel(Target *t, QObject *parent = nullptr); +}; + +class RunConfigurationModel : public ProjectConfigurationModel +{ +public: + explicit RunConfigurationModel(Target *t, QObject *parent = nullptr); }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index 21d97fb2c27..ed213d330de 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -33,11 +33,11 @@ HEADERS += projectexplorer.h \ kitmanagerconfigwidget.h \ kitmodel.h \ kitoptionspage.h \ + projectconfigurationmodel.h \ buildmanager.h \ buildsteplist.h \ compileoutputwindow.h \ deployconfiguration.h \ - deployconfigurationmodel.h \ namedwidget.h \ target.h \ targetsettingspanel.h \ @@ -94,8 +94,6 @@ HEADERS += projectexplorer.h \ ldparser.h \ linuxiccparser.h \ runconfigurationaspects.h \ - runconfigurationmodel.h \ - buildconfigurationmodel.h \ processparameters.h \ abstractprocessstep.h \ taskhub.h \ @@ -163,6 +161,7 @@ SOURCES += projectexplorer.cpp \ environmentaspectwidget.cpp \ gcctoolchain.cpp \ importwidget.cpp \ + projectconfigurationmodel.cpp \ runnables.cpp \ localenvironmentaspect.cpp \ osparser.cpp \ @@ -184,7 +183,6 @@ SOURCES += projectexplorer.cpp \ buildsteplist.cpp \ compileoutputwindow.cpp \ deployconfiguration.cpp \ - deployconfigurationmodel.cpp \ namedwidget.cpp \ target.cpp \ targetsettingspanel.cpp \ @@ -238,8 +236,6 @@ SOURCES += projectexplorer.cpp \ ldparser.cpp \ linuxiccparser.cpp \ runconfigurationaspects.cpp \ - runconfigurationmodel.cpp \ - buildconfigurationmodel.cpp \ taskhub.cpp \ processparameters.cpp \ appoutputpane.cpp \ diff --git a/src/plugins/projectexplorer/projectexplorer.qbs b/src/plugins/projectexplorer/projectexplorer.qbs index 47bc9d39478..c6d358f7e91 100644 --- a/src/plugins/projectexplorer/projectexplorer.qbs +++ b/src/plugins/projectexplorer/projectexplorer.qbs @@ -29,7 +29,6 @@ Project { "appoutputpane.cpp", "appoutputpane.h", "baseprojectwizarddialog.cpp", "baseprojectwizarddialog.h", "buildconfiguration.cpp", "buildconfiguration.h", - "buildconfigurationmodel.cpp", "buildconfigurationmodel.h", "buildenvironmentwidget.cpp", "buildenvironmentwidget.h", "buildinfo.cpp", "buildinfo.h", "buildmanager.cpp", "buildmanager.h", @@ -54,7 +53,6 @@ Project { "dependenciespanel.cpp", "dependenciespanel.h", "deployablefile.cpp", "deployablefile.h", "deployconfiguration.cpp", "deployconfiguration.h", - "deployconfigurationmodel.cpp", "deployconfigurationmodel.h", "deploymentdata.h", "deploymentdataview.cpp", "deploymentdataview.h", @@ -100,6 +98,7 @@ Project { "processstep.cpp", "processstep.h", "processstep.ui", "project.cpp", "project.h", "projectconfiguration.cpp", "projectconfiguration.h", + "projectconfigurationmodel.cpp", "projectconfigurationmodel.h", "projectexplorer.cpp", "projectexplorer.h", "projectexplorer.qrc", "projectexplorer_export.h", @@ -124,7 +123,6 @@ Project { "runnables.cpp", "runnables.h", "runconfiguration.cpp", "runconfiguration.h", "runconfigurationaspects.cpp", "runconfigurationaspects.h", - "runconfigurationmodel.cpp", "runconfigurationmodel.h", "runsettingspropertiespage.cpp", "runsettingspropertiespage.h", "selectablefilesmodel.cpp", "selectablefilesmodel.h", "session.cpp", "session.h", diff --git a/src/plugins/projectexplorer/runconfigurationmodel.cpp b/src/plugins/projectexplorer/runconfigurationmodel.cpp deleted file mode 100644 index 45d7bf06686..00000000000 --- a/src/plugins/projectexplorer/runconfigurationmodel.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "runconfigurationmodel.h" -#include "target.h" -#include "runconfiguration.h" - -#include - -using namespace ProjectExplorer; - -/*! - \class ProjectExplorer::RunConfigurationModel - - \brief The RunConfigurationModel class provides a model to represent the - run configurations of a target. - - To be used in the dropdown lists of comboboxes. - Automatically adjusts itself to added and removed run configurations. -*/ - -class RunConfigurationComparer -{ -public: - bool operator()(RunConfiguration *a, RunConfiguration *b) - { - return a->displayName() < b->displayName(); - } -}; - -RunConfigurationModel::RunConfigurationModel(Target *target, QObject *parent) : - QAbstractListModel(parent), - m_target(target) -{ - QTC_ASSERT(target, return); - m_runConfigurations = m_target->runConfigurations(); - Utils::sort(m_runConfigurations, RunConfigurationComparer()); - - connect(target, &Target::addedRunConfiguration, - this, &RunConfigurationModel::addedRunConfiguration); - connect(target, &Target::removedRunConfiguration, - this, &RunConfigurationModel::removedRunConfiguration); - - foreach (RunConfiguration *rc, m_runConfigurations) - connect(rc, &ProjectConfiguration::displayNameChanged, - this, &RunConfigurationModel::displayNameChanged); -} - -int RunConfigurationModel::rowCount(const QModelIndex &parent) const -{ - return parent.isValid() ? 0 : m_runConfigurations.size(); -} - -int RunConfigurationModel::columnCount(const QModelIndex &parent) const -{ - return parent.isValid() ? 0 : 1; -} - -void RunConfigurationModel::displayNameChanged() -{ - RunConfiguration *rc = qobject_cast(sender()); - if (!rc) - return; - - RunConfigurationComparer compare; - // Find the old position - int oldPos = m_runConfigurations.indexOf(rc); - - if (oldPos >= 1 && compare(m_runConfigurations.at(oldPos), m_runConfigurations.at(oldPos - 1))) { - // We need to move up - int newPos = oldPos - 1; - while (newPos >= 0 && compare(m_runConfigurations.at(oldPos), m_runConfigurations.at(newPos))) { - --newPos; - } - ++newPos; - - beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos); - m_runConfigurations.insert(newPos, rc); - m_runConfigurations.removeAt(oldPos + 1); - endMoveRows(); - // Not only did we move, we also changed... - emit dataChanged(index(newPos, 0), index(newPos,0)); - } else if (oldPos < m_runConfigurations.size() - 1 - && compare(m_runConfigurations.at(oldPos + 1), m_runConfigurations.at(oldPos))) { - // We need to move down - int newPos = oldPos + 1; - while (newPos < m_runConfigurations.size() - && compare(m_runConfigurations.at(newPos), m_runConfigurations.at(oldPos))) { - ++newPos; - } - beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos); - m_runConfigurations.insert(newPos, rc); - m_runConfigurations.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 RunConfigurationModel::data(const QModelIndex &index, int role) const -{ - if (role == Qt::DisplayRole) { - const int row = index.row(); - if (row < m_runConfigurations.size()) - return m_runConfigurations.at(row)->displayName(); - } - - return QVariant(); -} - -RunConfiguration *RunConfigurationModel::runConfigurationAt(int i) -{ - if (i > m_runConfigurations.size() || i < 0) - return nullptr; - return m_runConfigurations.at(i); -} - -RunConfiguration *RunConfigurationModel::runConfigurationFor(const QModelIndex &idx) -{ - if (idx.row() > m_runConfigurations.size() || idx.row() < 0) - return nullptr; - return m_runConfigurations.at(idx.row()); -} - -QModelIndex RunConfigurationModel::indexFor(RunConfiguration *rc) -{ - int idx = m_runConfigurations.indexOf(rc); - if (idx == -1) - return QModelIndex(); - return index(idx, 0); -} - -void RunConfigurationModel::addedRunConfiguration(RunConfiguration *rc) -{ - // Find the right place to insert - RunConfigurationComparer compare; - int i = 0; - for (; i < m_runConfigurations.size(); ++i) { - if (compare(rc, m_runConfigurations.at(i))) - break; - } - - beginInsertRows(QModelIndex(), i, i); - m_runConfigurations.insert(i, rc); - endInsertRows(); - - - connect(rc, &ProjectConfiguration::displayNameChanged, - this, &RunConfigurationModel::displayNameChanged); -} - -void RunConfigurationModel::removedRunConfiguration(RunConfiguration *rc) -{ - int i = m_runConfigurations.indexOf(rc); - if (i < 0) - return; - - beginRemoveRows(QModelIndex(), i, i); - m_runConfigurations.removeAt(i); - endRemoveRows(); -} diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index d3104be154e..7930a783368 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -27,11 +27,10 @@ #include "buildstepspage.h" #include "deployconfiguration.h" -#include "deployconfigurationmodel.h" -#include "runconfigurationmodel.h" #include "runconfiguration.h" #include "target.h" #include "project.h" +#include "projectconfigurationmodel.h" #include "session.h" #include @@ -314,7 +313,7 @@ void RunSettingsWidget::activeRunConfigurationChanged() QModelIndex actRc = m_runConfigurationsModel->indexFor(m_target->activeRunConfiguration()); m_ignoreChange = true; m_runConfigurationCombo->setCurrentIndex(actRc.row()); - setConfigurationWidget(m_runConfigurationsModel->runConfigurationAt(actRc.row())); + setConfigurationWidget(qobject_cast(m_runConfigurationsModel->projectConfigurationAt(actRc.row()))); m_ignoreChange = false; m_renameRunButton->setEnabled(m_target->activeRunConfiguration()); } @@ -344,7 +343,7 @@ void RunSettingsWidget::currentRunConfigurationChanged(int index) RunConfiguration *selectedRunConfiguration = nullptr; if (index >= 0) - selectedRunConfiguration = m_runConfigurationsModel->runConfigurationAt(index); + selectedRunConfiguration = qobject_cast(m_runConfigurationsModel->projectConfigurationAt(index)); if (selectedRunConfiguration == m_runConfiguration) return; @@ -364,7 +363,8 @@ void RunSettingsWidget::currentDeployConfigurationChanged(int index) if (index == -1) SessionManager::setActiveDeployConfiguration(m_target, nullptr, SetActive::Cascade); else - SessionManager::setActiveDeployConfiguration(m_target, m_deployConfigurationModel->deployConfigurationAt(index), + SessionManager::setActiveDeployConfiguration(m_target, + qobject_cast(m_deployConfigurationModel->projectConfigurationAt(index)), SetActive::Cascade); } diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index fc5d330d2ec..d27b894bcc2 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -408,6 +408,15 @@ BuildTargetInfoList Target::applicationTargets() const return d->m_appTargets; } +QList Target::projectConfigurations() const +{ + QList result; + result.append(Utils::transform(buildConfigurations(), [](BuildConfiguration *bc) { return qobject_cast(bc); })); + result.append(Utils::transform(deployConfigurations(), [](DeployConfiguration *dc) { return qobject_cast(dc); })); + result.append(Utils::transform(runConfigurations(), [](RunConfiguration *rc) { return qobject_cast(rc); })); + return result; +} + QList Target::runConfigurations() const { return d->m_runConfigurations; diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h index 0725390d303..3f168ce7846 100644 --- a/src/plugins/projectexplorer/target.h +++ b/src/plugins/projectexplorer/target.h @@ -80,6 +80,8 @@ public: void setApplicationTargets(const BuildTargetInfoList &appTargets); BuildTargetInfoList applicationTargets() const; + QList projectConfigurations() const; + // Running QList runConfigurations() const; void addRunConfiguration(RunConfiguration *rc);