diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2019-02-05 14:42:30 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2019-02-14 14:11:26 +0000 |
commit | 83e08a0d504c4cd7648732536ade581b6c01739a (patch) | |
tree | fa31ccfb589a8e1c036f93261275ce371a553831 | |
parent | c41ff1164be2826572f9dd2be868a4ecf2ee4b81 (diff) |
Let the user choose which kit settings to display
Almost every single aspect of a kit is probably irrelevant to some
users, so let them configure which ones they want to see.
Fixes: QTCREATORBUG-9134
Change-Id: I218d43bd1d00479130278259dff552c9624afa30
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r-- | src/plugins/projectexplorer/filterkitaspectsdialog.cpp | 163 | ||||
-rw-r--r-- | src/plugins/projectexplorer/filterkitaspectsdialog.h | 49 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kit.cpp | 25 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kit.h | 3 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitinformation.cpp | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitmanager.cpp | 17 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitmanager.h | 6 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitmanagerconfigwidget.cpp | 4 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitmodel.cpp | 7 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitmodel.h | 2 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitoptionspage.cpp | 34 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectexplorer.pro | 2 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectexplorer.qbs | 1 |
13 files changed, 309 insertions, 5 deletions
diff --git a/src/plugins/projectexplorer/filterkitaspectsdialog.cpp b/src/plugins/projectexplorer/filterkitaspectsdialog.cpp new file mode 100644 index 0000000000..418ae03564 --- /dev/null +++ b/src/plugins/projectexplorer/filterkitaspectsdialog.cpp @@ -0,0 +1,163 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 "filterkitaspectsdialog.h" + +#include "kitmanager.h" + +#include <utils/itemviews.h> +#include <utils/qtcassert.h> +#include <utils/treemodel.h> + +#include <QDialogButtonBox> +#include <QHeaderView> +#include <QString> +#include <QVBoxLayout> + +using namespace Utils; + +namespace ProjectExplorer { +namespace Internal { + +class FilterTreeItem : public TreeItem +{ +public: + FilterTreeItem(const KitAspect *aspect, bool enabled) : m_aspect(aspect), m_enabled(enabled) + { } + + QString displayName() const { return m_aspect->displayName(); } + Core::Id id() const { return m_aspect->id(); } + bool enabled() const { return m_enabled; } + +private: + QVariant data(int column, int role) const override + { + QTC_ASSERT(column < 2, return QVariant()); + if (column == 0 && role == Qt::DisplayRole) + return displayName(); + if (column == 1 && role == Qt::CheckStateRole) + return m_enabled ? Qt::Checked : Qt::Unchecked; + return QVariant(); + } + + bool setData(int column, const QVariant &data, int role) override + { + QTC_ASSERT(column == 1 && !m_aspect->isEssential(), return false); + if (role == Qt::CheckStateRole) { + m_enabled = data.toInt() == Qt::Checked; + return true; + } + return false; + } + + Qt::ItemFlags flags(int column) const override + { + QTC_ASSERT(column < 2, return Qt::ItemFlags()); + Qt::ItemFlags flags = Qt::ItemIsSelectable; + if (column == 0 || !m_aspect->isEssential()) + flags |= Qt::ItemIsEnabled; + if (column == 1 && !m_aspect->isEssential()) + flags |= Qt::ItemIsUserCheckable; + return flags; + } + + const KitAspect * const m_aspect; + bool m_enabled; +}; + +class FilterKitAspectsModel : public TreeModel<TreeItem, FilterTreeItem> +{ +public: + FilterKitAspectsModel(const Kit *kit, QObject *parent) : TreeModel(parent) + { + setHeader({tr("Setting"), tr("Visible")}); + for (const KitAspect * const aspect : KitManager::kitAspects()) { + if (kit && !aspect->isApplicableToKit(kit)) + continue; + const QSet<Core::Id> irrelevantAspects = kit ? kit->irrelevantAspects() + : KitManager::irrelevantAspects(); + auto * const item = new FilterTreeItem(aspect, + !irrelevantAspects.contains(aspect->id())); + rootItem()->appendChild(item); + } + static const auto cmp = [](const TreeItem *item1, const TreeItem *item2) { + return static_cast<const FilterTreeItem *>(item1)->displayName() + < static_cast<const FilterTreeItem *>(item2)->displayName(); + }; + rootItem()->sortChildren(cmp); + } + + QSet<Core::Id> disabledItems() const + { + QSet<Core::Id> ids; + for (int i = 0; i < rootItem()->childCount(); ++i) { + const FilterTreeItem * const item + = static_cast<FilterTreeItem *>(rootItem()->childAt(i)); + if (!item->enabled()) + ids << item->id(); + } + return ids; + } +}; + +class FilterTreeView : public TreeView +{ +public: + FilterTreeView(QWidget *parent) : TreeView(parent) + { + setUniformRowHeights(true); + } + +private: + QSize sizeHint() const override + { + const int width = columnWidth(0) + columnWidth(1); + const int height = model()->rowCount() * rowHeight(model()->index(0, 0)) + + header()->sizeHint().height(); + return {width, height}; + } +}; + +FilterKitAspectsDialog::FilterKitAspectsDialog(const Kit *kit, QWidget *parent) + : QDialog(parent), m_model(new FilterKitAspectsModel(kit, this)) +{ + auto * const layout = new QVBoxLayout(this); + auto * const view = new FilterTreeView(this); + view->setModel(m_model); + view->resizeColumnToContents(0); + layout->addWidget(view); + auto * const buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + layout->addWidget(buttonBox); + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); +} + +QSet<Core::Id> FilterKitAspectsDialog::irrelevantAspects() const +{ + return static_cast<FilterKitAspectsModel *>(m_model)->disabledItems(); +} + +} // namespace Internal +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/filterkitaspectsdialog.h b/src/plugins/projectexplorer/filterkitaspectsdialog.h new file mode 100644 index 0000000000..441abd658d --- /dev/null +++ b/src/plugins/projectexplorer/filterkitaspectsdialog.h @@ -0,0 +1,49 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 <coreplugin/id.h> + +#include <QDialog> + +namespace Utils { class BaseTreeModel; } + +namespace ProjectExplorer { +class Kit; +namespace Internal { + +class FilterKitAspectsDialog : public QDialog +{ +public: + FilterKitAspectsDialog(const Kit *kit, QWidget *parent); + QSet<Core::Id> irrelevantAspects() const; + +private: + Utils::BaseTreeModel * const m_model; +}; + +} // namespace Internal +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index ba0a76f8ab..e92e66c5b2 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -36,6 +36,7 @@ #include <utils/fileutils.h> #include <utils/icon.h> #include <utils/macroexpander.h> +#include <utils/optional.h> #include <utils/qtcassert.h> #include <QApplication> @@ -58,6 +59,7 @@ const char DATA_KEY[] = "PE.Profile.Data"; const char ICON_KEY[] = "PE.Profile.Icon"; const char MUTABLE_INFO_KEY[] = "PE.Profile.MutableInfo"; const char STICKY_INFO_KEY[] = "PE.Profile.StickyInfo"; +const char IRRELEVANT_ASPECTS_KEY[] = "PE.Kit.IrrelevantAspects"; namespace ProjectExplorer { namespace Internal { @@ -122,6 +124,7 @@ public: QHash<Id, QVariant> m_data; QSet<Id> m_sticky; QSet<Id> m_mutable; + optional<QSet<Id>> m_irrelevantAspects; MacroExpander m_macroExpander; }; @@ -158,6 +161,9 @@ Kit::Kit(const QVariantMap &data) : d->m_fileSystemFriendlyName = data.value(QLatin1String(FILESYSTEMFRIENDLYNAME_KEY)).toString(); d->m_iconPath = FileName::fromString(data.value(QLatin1String(ICON_KEY), d->m_iconPath.toString()).toString()); + const auto it = data.constFind(IRRELEVANT_ASPECTS_KEY); + if (it != data.constEnd()) + d->m_irrelevantAspects = transform<QSet<Id>>(it.value().toList(), &Id::fromSetting); QVariantMap extra = data.value(QLatin1String(DATA_KEY)).toMap(); d->m_data.clear(); // remove default values @@ -206,6 +212,7 @@ Kit *Kit::clone(bool keepName) const k->d->m_iconPath = d->m_iconPath; k->d->m_sticky = d->m_sticky; k->d->m_mutable = d->m_mutable; + k->d->m_irrelevantAspects = d->m_irrelevantAspects; return k; } @@ -222,6 +229,7 @@ void Kit::copyFrom(const Kit *k) d->m_mustNotify = true; d->m_sticky = k->d->m_sticky; d->m_mutable = k->d->m_mutable; + d->m_irrelevantAspects = k->d->m_irrelevantAspects; } bool Kit::isValid() const @@ -461,8 +469,8 @@ bool Kit::isEqual(const Kit *other) const && d->m_iconPath == other->d->m_iconPath && d->m_unexpandedDisplayName == other->d->m_unexpandedDisplayName && d->m_fileSystemFriendlyName == other->d->m_fileSystemFriendlyName + && d->m_irrelevantAspects == other->d->m_irrelevantAspects && d->m_mutable == other->d->m_mutable; - } QVariantMap Kit::toMap() const @@ -489,6 +497,11 @@ QVariantMap Kit::toMap() const stickyInfo << id.toString(); data.insert(QLatin1String(STICKY_INFO_KEY), stickyInfo); + if (d->m_irrelevantAspects) { + data.insert(IRRELEVANT_ASPECTS_KEY, transform<QVariantList>(d->m_irrelevantAspects.value(), + &Id::toSetting)); + } + QVariantMap extra; const IdVariantConstIt cend = d->m_data.constEnd(); @@ -611,6 +624,16 @@ bool Kit::isMutable(Id id) const return d->m_mutable.contains(id); } +void Kit::setIrrelevantAspects(const QSet<Id> &irrelevant) +{ + d->m_irrelevantAspects = irrelevant; +} + +QSet<Id> Kit::irrelevantAspects() const +{ + return d->m_irrelevantAspects.value_or(KitManager::irrelevantAspects()); +} + QSet<Id> Kit::supportedPlatforms() const { QSet<Id> platforms; diff --git a/src/plugins/projectexplorer/kit.h b/src/plugins/projectexplorer/kit.h index 6a6b014033..adfef62c0f 100644 --- a/src/plugins/projectexplorer/kit.h +++ b/src/plugins/projectexplorer/kit.h @@ -123,6 +123,9 @@ public: void setMutable(Core::Id id, bool b); bool isMutable(Core::Id id) const; + void setIrrelevantAspects(const QSet<Core::Id> &irrelevant); + QSet<Core::Id> irrelevantAspects() const; + QSet<Core::Id> supportedPlatforms() const; QSet<Core::Id> availableFeatures() const; bool hasFeatures(const QSet<Core::Id> &features) const; diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index fbc2078364..ce8796e786 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -810,6 +810,7 @@ DeviceTypeKitAspect::DeviceTypeKitAspect() setDisplayName(tr("Device type")); setDescription(tr("The type of device to run applications on.")); setPriority(33000); + makeEssential(); } QVariant DeviceTypeKitAspect::defaultValue(const Kit *k) const diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index 57069ffcf1..0b4984fd24 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -54,6 +54,7 @@ const char KIT_DATA_KEY[] = "Profile."; const char KIT_COUNT_KEY[] = "Profile.Count"; const char KIT_FILE_VERSION_KEY[] = "Version"; const char KIT_DEFAULT_KEY[] = "Profile.Default"; +const char KIT_IRRELEVANT_ASPECTS_KEY[] = "Kit.IrrelevantAspects"; const char KIT_FILENAME[] = "/profiles.xml"; static FileName settingsFileName() @@ -73,6 +74,7 @@ public: std::vector<std::unique_ptr<KitAspect>> m_informationList; std::vector<std::unique_ptr<Kit>> m_kitList; std::unique_ptr<PersistentSettingsWriter> m_writer; + QSet<Id> m_irrelevantAspects; }; } // namespace Internal @@ -220,6 +222,8 @@ void KitManager::saveKits() data.insert(QLatin1String(KIT_COUNT_KEY), count); data.insert(QLatin1String(KIT_DEFAULT_KEY), d->m_defaultKit ? QString::fromLatin1(d->m_defaultKit->id().name()) : QString()); + data.insert(KIT_IRRELEVANT_ASPECTS_KEY, + transform<QVariantList>(d->m_irrelevantAspects, &Id::toSetting)); d->m_writer->save(data, ICore::mainWindow()); } @@ -335,6 +339,9 @@ KitManager::KitList KitManager::restoreKits(const FileName &fileName) if (Utils::contains(result.kits, [id](const std::unique_ptr<Kit> &k) { return k->id() == id; })) result.defaultKit = id; + const auto it = data.constFind(KIT_IRRELEVANT_ASPECTS_KEY); + if (it != data.constEnd()) + d->m_irrelevantAspects = transform<QSet<Id>>(it.value().toList(), &Id::fromSetting); return result; } @@ -370,6 +377,16 @@ const QList<KitAspect *> KitManager::kitAspects() return Utils::toRawPointer<QList>(d->m_informationList); } +const QSet<Id> KitManager::irrelevantAspects() +{ + return d->m_irrelevantAspects; +} + +void KitManager::setIrrelevantAspects(const QSet<Id> &aspects) +{ + d->m_irrelevantAspects = aspects; +} + void KitManager::notifyAboutUpdate(Kit *k) { if (!k || !isLoaded()) diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index 6d7ef22742..4b031846a0 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -34,6 +34,7 @@ #include <QObject> #include <QPair> +#include <QSet> #include <functional> @@ -76,6 +77,7 @@ public: int priority() const { return m_priority; } QString displayName() const { return m_displayName; } QString description() const { return m_description; } + bool isEssential() const { return m_essential; } virtual QVariant defaultValue(const Kit *) const = 0; @@ -108,6 +110,7 @@ protected: void setId(Core::Id id) { m_id = id; } void setDisplayName(const QString &name) { m_displayName = name; } void setDescription(const QString &desc) { m_description = desc; } + void makeEssential() { m_essential = true; } void setPriority(int priority) { m_priority = priority; } void notifyAboutUpdate(Kit *k); @@ -116,6 +119,7 @@ private: QString m_description; Core::Id m_id; int m_priority = 0; // The higher the closer to the top. + bool m_essential = false; }; class PROJECTEXPLORER_EXPORT KitAspectWidget : public QObject @@ -166,6 +170,8 @@ public: static Kit *defaultKit(); static const QList<KitAspect *> kitAspects(); + static const QSet<Core::Id> irrelevantAspects(); + static void setIrrelevantAspects(const QSet<Core::Id> &aspects); static bool registerKit(std::unique_ptr<Kit> &&k); static void deregisterKit(Kit *k); diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index 2923b7a6f7..7624da21d9 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -45,6 +45,7 @@ #include <QLabel> #include <QLineEdit> #include <QPainter> +#include <QPushButton> #include <QToolButton> #include <QScrollArea> #include <QSizePolicy> @@ -262,7 +263,8 @@ void KitManagerConfigWidget::updateVisibility() int count = m_widgets.count(); for (int i = 0; i < count; ++i) { KitAspectWidget *widget = m_widgets.at(i); - bool visible = widget->visibleInKit(); + const bool visible = widget->visibleInKit() + && !m_modifiedKit->irrelevantAspects().contains(widget->kitInformationId()); widget->mainWidget()->setVisible(visible); if (widget->buttonWidget()) widget->buttonWidget()->setVisible(visible); diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp index 8e4ca2de4a..7795f3f02c 100644 --- a/src/plugins/projectexplorer/kitmodel.cpp +++ b/src/plugins/projectexplorer/kitmodel.cpp @@ -266,6 +266,13 @@ Kit *KitModel::markForAddition(Kit *baseKit) return k; } +void KitModel::updateVisibility() +{ + forItemsAtLevel<2>([](const TreeItem *ti) { + static_cast<const KitNode *>(ti)->widget->updateVisibility(); + }); +} + KitNode *KitModel::findWorkingCopy(Kit *k) const { return findItemAtLevel<2>([k](KitNode *n) { return n->widget->workingCopy() == k; }); diff --git a/src/plugins/projectexplorer/kitmodel.h b/src/plugins/projectexplorer/kitmodel.h index 8070eefe30..c752215d41 100644 --- a/src/plugins/projectexplorer/kitmodel.h +++ b/src/plugins/projectexplorer/kitmodel.h @@ -69,6 +69,8 @@ public: void markForRemoval(Kit *k); Kit *markForAddition(Kit *baseKit); + void updateVisibility(); + signals: void kitStateChanged(); diff --git a/src/plugins/projectexplorer/kitoptionspage.cpp b/src/plugins/projectexplorer/kitoptionspage.cpp index 262d6c2706..d9ebe3f0e0 100644 --- a/src/plugins/projectexplorer/kitoptionspage.cpp +++ b/src/plugins/projectexplorer/kitoptionspage.cpp @@ -25,6 +25,7 @@ #include "kitoptionspage.h" +#include "filterkitaspectsdialog.h" #include "kitmodel.h" #include "kit.h" #include "projectexplorerconstants.h" @@ -32,6 +33,8 @@ #include "kitmanagerconfigwidget.h" #include "kitmanager.h" +#include <utils/qtcassert.h> + #include <QHBoxLayout> #include <QHeaderView> #include <QItemSelectionModel> @@ -67,10 +70,12 @@ public: QPushButton *m_cloneButton = nullptr; QPushButton *m_delButton = nullptr; QPushButton *m_makeDefaultButton = nullptr; + QPushButton *m_filterButton = nullptr; + QPushButton *m_defaultFilterButton = nullptr; KitModel *m_model = nullptr; QItemSelectionModel *m_selectionModel = nullptr; - QWidget *m_currentWidget = nullptr; + KitManagerConfigWidget *m_currentWidget = nullptr; }; KitOptionsPageWidget::KitOptionsPageWidget() @@ -85,6 +90,12 @@ KitOptionsPageWidget::KitOptionsPageWidget() m_cloneButton = new QPushButton(KitOptionsPage::tr("Clone"), this); m_delButton = new QPushButton(KitOptionsPage::tr("Remove"), this); m_makeDefaultButton = new QPushButton(KitOptionsPage::tr("Make Default"), this); + m_filterButton = new QPushButton(KitOptionsPage::tr("Settings Filter..."), this); + m_filterButton->setToolTip(KitOptionsPage::tr( + "Choose which settings to display for this kit.")); + m_defaultFilterButton = new QPushButton(KitOptionsPage::tr("Default Settings Filter..."), this); + m_defaultFilterButton->setToolTip(KitOptionsPage::tr( + "Choose which kit settings to display by default.")); auto buttonLayout = new QVBoxLayout; buttonLayout->setSpacing(6); @@ -93,6 +104,8 @@ KitOptionsPageWidget::KitOptionsPageWidget() buttonLayout->addWidget(m_cloneButton); buttonLayout->addWidget(m_delButton); buttonLayout->addWidget(m_makeDefaultButton); + buttonLayout->addWidget(m_filterButton); + buttonLayout->addWidget(m_defaultFilterButton); buttonLayout->addStretch(); auto horizontalLayout = new QHBoxLayout; @@ -131,14 +144,28 @@ KitOptionsPageWidget::KitOptionsPageWidget() this, &KitOptionsPageWidget::removeKit); connect(m_makeDefaultButton, &QAbstractButton::clicked, this, &KitOptionsPageWidget::makeDefaultKit); - + connect(m_filterButton, &QAbstractButton::clicked, this, [this] { + QTC_ASSERT(m_currentWidget, return); + FilterKitAspectsDialog dlg(m_currentWidget->workingCopy(), this); + if (dlg.exec() == QDialog::Accepted) { + m_currentWidget->workingCopy()->setIrrelevantAspects(dlg.irrelevantAspects()); + m_currentWidget->updateVisibility(); + } + }); + connect(m_defaultFilterButton, &QAbstractButton::clicked, this, [this] { + FilterKitAspectsDialog dlg(nullptr, this); + if (dlg.exec() == QDialog::Accepted) { + KitManager::setIrrelevantAspects(dlg.irrelevantAspects()); + m_model->updateVisibility(); + } + }); updateState(); } void KitOptionsPageWidget::kitSelectionChanged() { QModelIndex current = currentIndex(); - QWidget *newWidget = m_model->widget(current); + KitManagerConfigWidget * const newWidget = m_model->widget(current); if (newWidget == m_currentWidget) return; @@ -216,6 +243,7 @@ void KitOptionsPageWidget::updateState() m_cloneButton->setEnabled(canCopy); m_delButton->setEnabled(canDelete); m_makeDefaultButton->setEnabled(canMakeDefault); + m_filterButton->setEnabled(canCopy); } QModelIndex KitOptionsPageWidget::currentIndex() const diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index 8ba656b36b..14033e5c47 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -17,6 +17,7 @@ HEADERS += projectexplorer.h \ environmentaspect.h \ environmentaspectwidget.h \ extraabi.h \ + filterkitaspectsdialog.h \ gcctoolchain.h \ importwidget.h \ userfileaccessor.h \ @@ -168,6 +169,7 @@ SOURCES += projectexplorer.cpp \ environmentaspect.cpp \ environmentaspectwidget.cpp \ extraabi.cpp \ + filterkitaspectsdialog.cpp \ gcctoolchain.cpp \ importwidget.cpp \ projectconfigurationmodel.cpp \ diff --git a/src/plugins/projectexplorer/projectexplorer.qbs b/src/plugins/projectexplorer/projectexplorer.qbs index 59038d9875..5294cbd7a5 100644 --- a/src/plugins/projectexplorer/projectexplorer.qbs +++ b/src/plugins/projectexplorer/projectexplorer.qbs @@ -69,6 +69,7 @@ Project { "expanddata.cpp", "expanddata.h", "extraabi.cpp", "extraabi.h", "extracompiler.cpp", "extracompiler.h", + "filterkitaspectsdialog.cpp", "filterkitaspectsdialog.h", "foldernavigationwidget.cpp", "foldernavigationwidget.h", "gccparser.cpp", "gccparser.h", "gcctoolchain.cpp", "gcctoolchain.h", |