ProjectExplorer: Base KitAspectWidget on BaseAspect

Enables re-using existing functionality.

The "Make mutable" functionality is still oddly placed. I doubt people
find and use it actively.

Change-Id: Ic6aae17e3a7df093f0f5f234f1e6e1afc196a087
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2021-04-07 18:55:21 +02:00
parent 2727016f1d
commit 77481f25ce
14 changed files with 182 additions and 121 deletions

View File

@@ -47,6 +47,7 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/elidinglabel.h> #include <utils/elidinglabel.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/layoutbuilder.h>
#include <utils/macroexpander.h> #include <utils/macroexpander.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/variablechooser.h> #include <utils/variablechooser.h>
@@ -87,8 +88,8 @@ class CMakeKitAspectWidget final : public KitAspectWidget
Q_DECLARE_TR_FUNCTIONS(CMakeProjectManager::Internal::CMakeKitAspect) Q_DECLARE_TR_FUNCTIONS(CMakeProjectManager::Internal::CMakeKitAspect)
public: public:
CMakeKitAspectWidget(Kit *kit, const KitAspect *ki) : KitAspectWidget(kit, ki), CMakeKitAspectWidget(Kit *kit, const KitAspect *ki) : KitAspectWidget(kit, ki),
m_comboBox(new QComboBox), m_comboBox(createSubWidget<QComboBox>()),
m_manageButton(new QPushButton(KitAspectWidget::msgManage())) m_manageButton(createSubWidget<QPushButton>(KitAspectWidget::msgManage()))
{ {
m_comboBox->setSizePolicy(QSizePolicy::Ignored, m_comboBox->sizePolicy().verticalPolicy()); m_comboBox->setSizePolicy(QSizePolicy::Ignored, m_comboBox->sizePolicy().verticalPolicy());
m_comboBox->setEnabled(false); m_comboBox->setEnabled(false);
@@ -124,8 +125,13 @@ public:
private: private:
// KitAspectWidget interface // KitAspectWidget interface
void makeReadOnly() override { m_comboBox->setEnabled(false); } void makeReadOnly() override { m_comboBox->setEnabled(false); }
QWidget *mainWidget() const override { return m_comboBox; }
QWidget *buttonWidget() const override { return m_manageButton; } void addToLayout(Utils::LayoutBuilder &builder) override
{
addMutableAction(m_comboBox);
builder.addItem(m_comboBox);
builder.addItem(m_manageButton);
}
void refresh() override void refresh() override
{ {
@@ -205,7 +211,7 @@ private:
void manageCMakeTools() void manageCMakeTools()
{ {
Core::ICore::showOptionsDialog(Constants::CMAKE_SETTINGS_PAGE_ID, buttonWidget()); Core::ICore::showOptionsDialog(Constants::CMAKE_SETTINGS_PAGE_ID, m_manageButton);
} }
bool m_removingItem = false; bool m_removingItem = false;
@@ -334,8 +340,8 @@ class CMakeGeneratorKitAspectWidget final : public KitAspectWidget
public: public:
CMakeGeneratorKitAspectWidget(Kit *kit, const ::KitAspect *ki) CMakeGeneratorKitAspectWidget(Kit *kit, const ::KitAspect *ki)
: KitAspectWidget(kit, ki), : KitAspectWidget(kit, ki),
m_label(new Utils::ElidingLabel), m_label(createSubWidget<Utils::ElidingLabel>()),
m_changeButton(new QPushButton) m_changeButton(createSubWidget<QPushButton>())
{ {
m_label->setToolTip(ki->description()); m_label->setToolTip(ki->description());
m_changeButton->setText(tr("Change...")); m_changeButton->setText(tr("Change..."));
@@ -353,8 +359,13 @@ public:
private: private:
// KitAspectWidget interface // KitAspectWidget interface
void makeReadOnly() override { m_changeButton->setEnabled(false); } void makeReadOnly() override { m_changeButton->setEnabled(false); }
QWidget *mainWidget() const override { return m_label; }
QWidget *buttonWidget() const override { return m_changeButton; } void addToLayout(Utils::LayoutBuilder &builder) override
{
addMutableAction(m_label);
builder.addItem(m_label);
builder.addItem(m_changeButton);
}
void refresh() override void refresh() override
{ {
@@ -851,8 +862,8 @@ class CMakeConfigurationKitAspectWidget final : public KitAspectWidget
public: public:
CMakeConfigurationKitAspectWidget(Kit *kit, const KitAspect *ki) CMakeConfigurationKitAspectWidget(Kit *kit, const KitAspect *ki)
: KitAspectWidget(kit, ki), : KitAspectWidget(kit, ki),
m_summaryLabel(new Utils::ElidingLabel), m_summaryLabel(createSubWidget<Utils::ElidingLabel>()),
m_manageButton(new QPushButton) m_manageButton(createSubWidget<QPushButton>())
{ {
refresh(); refresh();
m_manageButton->setText(tr("Change...")); m_manageButton->setText(tr("Change..."));
@@ -862,8 +873,12 @@ public:
private: private:
// KitAspectWidget interface // KitAspectWidget interface
QWidget *mainWidget() const override { return m_summaryLabel; } void addToLayout(Utils::LayoutBuilder &builder) override
QWidget *buttonWidget() const override { return m_manageButton; } {
addMutableAction(m_summaryLabel);
builder.addItem(m_summaryLabel);
builder.addItem(m_manageButton);
}
void makeReadOnly() override void makeReadOnly() override
{ {

View File

@@ -36,6 +36,7 @@
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/fileutils.h> #include <utils/fileutils.h>
#include <utils/layoutbuilder.h>
#include <utils/macroexpander.h> #include <utils/macroexpander.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -63,7 +64,7 @@ public:
DebuggerKitAspectWidget(Kit *workingCopy, const KitAspect *ki) DebuggerKitAspectWidget(Kit *workingCopy, const KitAspect *ki)
: KitAspectWidget(workingCopy, ki) : KitAspectWidget(workingCopy, ki)
{ {
m_comboBox = new QComboBox; m_comboBox = createSubWidget<QComboBox>();
m_comboBox->setSizePolicy(QSizePolicy::Ignored, m_comboBox->sizePolicy().verticalPolicy()); m_comboBox->setSizePolicy(QSizePolicy::Ignored, m_comboBox->sizePolicy().verticalPolicy());
m_comboBox->setEnabled(true); m_comboBox->setEnabled(true);
@@ -72,7 +73,7 @@ public:
connect(m_comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), connect(m_comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &DebuggerKitAspectWidget::currentDebuggerChanged); this, &DebuggerKitAspectWidget::currentDebuggerChanged);
m_manageButton = new QPushButton(KitAspectWidget::msgManage()); m_manageButton = createSubWidget<QPushButton>(KitAspectWidget::msgManage());
m_manageButton->setContentsMargins(0, 0, 0, 0); m_manageButton->setContentsMargins(0, 0, 0, 0);
connect(m_manageButton, &QAbstractButton::clicked, connect(m_manageButton, &QAbstractButton::clicked,
this, &DebuggerKitAspectWidget::manageDebuggers); this, &DebuggerKitAspectWidget::manageDebuggers);
@@ -85,8 +86,12 @@ public:
} }
private: private:
QWidget *buttonWidget() const override { return m_manageButton; } void addToLayout(Utils::LayoutBuilder &builder) override
QWidget *mainWidget() const override { return m_comboBox; } {
addMutableAction(m_comboBox);
builder.addItem(m_comboBox);
builder.addItem(m_manageButton);
}
void makeReadOnly() override void makeReadOnly() override
{ {
@@ -110,7 +115,7 @@ private:
void manageDebuggers() void manageDebuggers()
{ {
Core::ICore::showOptionsDialog(ProjectExplorer::Constants::DEBUGGER_SETTINGS_PAGE_ID, Core::ICore::showOptionsDialog(ProjectExplorer::Constants::DEBUGGER_SETTINGS_PAGE_ID,
buttonWidget()); m_manageButton);
} }
void currentDebuggerChanged(int idx) void currentDebuggerChanged(int idx)

View File

@@ -1254,20 +1254,11 @@ class McuDependenciesKitAspectWidget final : public KitAspectWidget
public: public:
McuDependenciesKitAspectWidget(Kit *workingCopy, const KitAspect *ki) McuDependenciesKitAspectWidget(Kit *workingCopy, const KitAspect *ki)
: KitAspectWidget(workingCopy, ki) : KitAspectWidget(workingCopy, ki)
{ {}
m_emptyWidget = new QWidget();
}
~McuDependenciesKitAspectWidget() override {
delete m_emptyWidget;
}
void makeReadOnly() override {} void makeReadOnly() override {}
void refresh() override {} void refresh() override {}
QWidget *mainWidget() const override { void addToLayout(Utils::LayoutBuilder &) override {}
return m_emptyWidget;
}
private:
QWidget *m_emptyWidget;
}; };
} // Internal } // Internal

View File

@@ -39,8 +39,8 @@ ToolKitAspectWidget::ToolKitAspectWidget(ProjectExplorer::Kit *kit,
const ProjectExplorer::KitAspect *ki, const ProjectExplorer::KitAspect *ki,
ToolType type) ToolType type)
: ProjectExplorer::KitAspectWidget(kit, ki) : ProjectExplorer::KitAspectWidget(kit, ki)
, m_toolsComboBox{new QComboBox} , m_toolsComboBox(createSubWidget<QComboBox>())
, m_manageButton(new QPushButton(KitAspectWidget::msgManage())) , m_manageButton(createSubWidget<QPushButton>(KitAspectWidget::msgManage()))
, m_type{type} , m_type{type}
{ {
m_toolsComboBox->setSizePolicy(QSizePolicy::Ignored, m_toolsComboBox->setSizePolicy(QSizePolicy::Ignored,
@@ -51,7 +51,7 @@ ToolKitAspectWidget::ToolKitAspectWidget(ProjectExplorer::Kit *kit,
m_manageButton->setContentsMargins(0, 0, 0, 0); m_manageButton->setContentsMargins(0, 0, 0, 0);
connect(m_manageButton, &QPushButton::clicked, this, [this]() { connect(m_manageButton, &QPushButton::clicked, this, [this]() {
Core::ICore::showOptionsDialog(Constants::SettingsPage::TOOLS_ID, buttonWidget()); Core::ICore::showOptionsDialog(Constants::SettingsPage::TOOLS_ID, m_manageButton);
}); });
connect(MesonTools::instance(), connect(MesonTools::instance(),

View File

@@ -30,6 +30,8 @@
#include <projectexplorer/kitmanager.h> #include <projectexplorer/kitmanager.h>
#include <utils/layoutbuilder.h>
#include <QComboBox> #include <QComboBox>
#include <QCoreApplication> #include <QCoreApplication>
#include <QPushButton> #include <QPushButton>
@@ -58,8 +60,14 @@ private:
void setToDefault(); void setToDefault();
void makeReadOnly() override { m_toolsComboBox->setEnabled(false); } void makeReadOnly() override { m_toolsComboBox->setEnabled(false); }
QWidget *mainWidget() const override { return m_toolsComboBox; }
QWidget *buttonWidget() const override { return m_manageButton; } void addToLayout(Utils::LayoutBuilder &builder) override
{
addMutableAction(m_toolsComboBox);
builder.addItem(m_toolsComboBox);
builder.addItem(m_manageButton);
}
void refresh() override void refresh() override
{ {
const auto id = [this]() { const auto id = [this]() {

View File

@@ -41,6 +41,7 @@
#include <utils/elidinglabel.h> #include <utils/elidinglabel.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/environmentdialog.h> #include <utils/environmentdialog.h>
#include <utils/layoutbuilder.h>
#include <utils/macroexpander.h> #include <utils/macroexpander.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -56,6 +57,8 @@
#include <QPushButton> #include <QPushButton>
#include <QVBoxLayout> #include <QVBoxLayout>
using namespace Utils;
namespace ProjectExplorer { namespace ProjectExplorer {
const char KITINFORMATION_ID_V3[] = "PE.Profile.ToolChainsV3"; const char KITINFORMATION_ID_V3[] = "PE.Profile.ToolChainsV3";
@@ -72,7 +75,7 @@ class SysRootKitAspectWidget : public KitAspectWidget
public: public:
SysRootKitAspectWidget(Kit *k, const KitAspect *ki) : KitAspectWidget(k, ki) SysRootKitAspectWidget(Kit *k, const KitAspect *ki) : KitAspectWidget(k, ki)
{ {
m_chooser = new Utils::PathChooser; m_chooser = createSubWidget<PathChooser>();
m_chooser->setExpectedKind(Utils::PathChooser::ExistingDirectory); m_chooser->setExpectedKind(Utils::PathChooser::ExistingDirectory);
m_chooser->setHistoryCompleter(QLatin1String("PE.SysRoot.History")); m_chooser->setHistoryCompleter(QLatin1String("PE.SysRoot.History"));
m_chooser->setFilePath(SysRootKitAspect::sysRoot(k)); m_chooser->setFilePath(SysRootKitAspect::sysRoot(k));
@@ -84,8 +87,12 @@ public:
private: private:
void makeReadOnly() override { m_chooser->setReadOnly(true); } void makeReadOnly() override { m_chooser->setReadOnly(true); }
QWidget *buttonWidget() const override { return m_chooser->buttonAtIndex(0); }
QWidget *mainWidget() const override { return m_chooser->lineEdit(); } void addToLayout(LayoutBuilder &builder) override
{
addMutableAction(m_chooser);
builder.addItem(Layouting::Span(2, m_chooser));
}
void refresh() override void refresh() override
{ {
@@ -212,7 +219,7 @@ class ToolChainKitAspectWidget final : public KitAspectWidget
public: public:
ToolChainKitAspectWidget(Kit *k, const KitAspect *ki) : KitAspectWidget(k, ki) ToolChainKitAspectWidget(Kit *k, const KitAspect *ki) : KitAspectWidget(k, ki)
{ {
m_mainWidget = new QWidget; m_mainWidget = createSubWidget<QWidget>();
m_mainWidget->setContentsMargins(0, 0, 0, 0); m_mainWidget->setContentsMargins(0, 0, 0, 0);
auto layout = new QGridLayout(m_mainWidget); auto layout = new QGridLayout(m_mainWidget);
@@ -242,7 +249,7 @@ public:
refresh(); refresh();
m_manageButton = new QPushButton(KitAspectWidget::msgManage()); m_manageButton = createSubWidget<QPushButton>(KitAspectWidget::msgManage());
m_manageButton->setContentsMargins(0, 0, 0, 0); m_manageButton->setContentsMargins(0, 0, 0, 0);
connect(m_manageButton, &QAbstractButton::clicked, connect(m_manageButton, &QAbstractButton::clicked,
this, &ToolChainKitAspectWidget::manageToolChains); this, &ToolChainKitAspectWidget::manageToolChains);
@@ -255,8 +262,12 @@ public:
} }
private: private:
QWidget *mainWidget() const override { return m_mainWidget; } void addToLayout(LayoutBuilder &builder) override
QWidget *buttonWidget() const override { return m_manageButton; } {
addMutableAction(m_mainWidget);
builder.addItem(m_mainWidget);
builder.addItem(m_manageButton);
}
void refresh() override void refresh() override
{ {
@@ -289,7 +300,7 @@ private:
void manageToolChains() void manageToolChains()
{ {
Core::ICore::showOptionsDialog(Constants::TOOLCHAIN_SETTINGS_PAGE_ID, buttonWidget()); Core::ICore::showOptionsDialog(Constants::TOOLCHAIN_SETTINGS_PAGE_ID, m_manageButton);
} }
void currentToolChainChanged(Utils::Id language, int idx) void currentToolChainChanged(Utils::Id language, int idx)
@@ -699,7 +710,7 @@ class DeviceTypeKitAspectWidget final : public KitAspectWidget
public: public:
DeviceTypeKitAspectWidget(Kit *workingCopy, const KitAspect *ki) DeviceTypeKitAspectWidget(Kit *workingCopy, const KitAspect *ki)
: KitAspectWidget(workingCopy, ki), m_comboBox(new QComboBox) : KitAspectWidget(workingCopy, ki), m_comboBox(createSubWidget<QComboBox>())
{ {
for (IDeviceFactory *factory : IDeviceFactory::allDeviceFactories()) for (IDeviceFactory *factory : IDeviceFactory::allDeviceFactories())
m_comboBox->addItem(factory->displayName(), factory->deviceType().toSetting()); m_comboBox->addItem(factory->displayName(), factory->deviceType().toSetting());
@@ -712,7 +723,12 @@ public:
~DeviceTypeKitAspectWidget() override { delete m_comboBox; } ~DeviceTypeKitAspectWidget() override { delete m_comboBox; }
private: private:
QWidget *mainWidget() const override { return m_comboBox; } void addToLayout(LayoutBuilder &builder) override
{
addMutableAction(m_comboBox);
builder.addItem(m_comboBox);
}
void makeReadOnly() override { m_comboBox->setEnabled(false); } void makeReadOnly() override { m_comboBox->setEnabled(false); }
void refresh() override void refresh() override
@@ -817,12 +833,13 @@ class DeviceKitAspectWidget final : public KitAspectWidget
public: public:
DeviceKitAspectWidget(Kit *workingCopy, const KitAspect *ki) DeviceKitAspectWidget(Kit *workingCopy, const KitAspect *ki)
: KitAspectWidget(workingCopy, ki), m_comboBox(new QComboBox), : KitAspectWidget(workingCopy, ki),
m_comboBox(createSubWidget<QComboBox>()),
m_model(new DeviceManagerModel(DeviceManager::instance())) m_model(new DeviceManagerModel(DeviceManager::instance()))
{ {
m_comboBox->setSizePolicy(QSizePolicy::Ignored, m_comboBox->sizePolicy().verticalPolicy()); m_comboBox->setSizePolicy(QSizePolicy::Ignored, m_comboBox->sizePolicy().verticalPolicy());
m_comboBox->setModel(m_model); m_comboBox->setModel(m_model);
m_manageButton = new QPushButton(KitAspectWidget::msgManage()); m_manageButton = createSubWidget<QPushButton>(KitAspectWidget::msgManage());
refresh(); refresh();
m_comboBox->setToolTip(ki->description()); m_comboBox->setToolTip(ki->description());
@@ -844,8 +861,13 @@ public:
} }
private: private:
QWidget *mainWidget() const override { return m_comboBox; } void addToLayout(LayoutBuilder &builder) override
QWidget *buttonWidget() const override { return m_manageButton; } {
addMutableAction(m_comboBox);
builder.addItem(m_comboBox);
builder.addItem(m_manageButton);
}
void makeReadOnly() override { m_comboBox->setEnabled(false); } void makeReadOnly() override { m_comboBox->setEnabled(false); }
void refresh() override void refresh() override
@@ -856,7 +878,7 @@ private:
void manageDevices() void manageDevices()
{ {
Core::ICore::showOptionsDialog(Constants::DEVICE_SETTINGS_PAGE_ID, buttonWidget()); Core::ICore::showOptionsDialog(Constants::DEVICE_SETTINGS_PAGE_ID, m_manageButton);
} }
void modelAboutToReset() void modelAboutToReset()
@@ -1069,9 +1091,9 @@ class EnvironmentKitAspectWidget final : public KitAspectWidget
public: public:
EnvironmentKitAspectWidget(Kit *workingCopy, const KitAspect *ki) EnvironmentKitAspectWidget(Kit *workingCopy, const KitAspect *ki)
: KitAspectWidget(workingCopy, ki), : KitAspectWidget(workingCopy, ki),
m_summaryLabel(new Utils::ElidingLabel), m_summaryLabel(createSubWidget<Utils::ElidingLabel>()),
m_manageButton(new QPushButton), m_manageButton(createSubWidget<QPushButton>()),
m_mainWidget(new QWidget) m_mainWidget(createSubWidget<QWidget>())
{ {
auto *layout = new QVBoxLayout; auto *layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
@@ -1086,8 +1108,13 @@ public:
} }
private: private:
QWidget *mainWidget() const override { return m_mainWidget; } void addToLayout(LayoutBuilder &builder) override
QWidget *buttonWidget() const override { return m_manageButton; } {
addMutableAction(m_mainWidget);
builder.addItem(m_mainWidget);
builder.addItem(m_manageButton);
}
void makeReadOnly() override { m_manageButton->setEnabled(false); } void makeReadOnly() override { m_manageButton->setEnabled(false); }
void refresh() override void refresh() override

View File

@@ -50,6 +50,7 @@
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stringutils.h> #include <utils/stringutils.h>
#include <QAction>
#include <QHash> #include <QHash>
#include <QLabel> #include <QLabel>
#include <QSettings> #include <QSettings>
@@ -724,24 +725,39 @@ void KitAspect::notifyAboutUpdate(Kit *k)
KitAspectWidget::KitAspectWidget(Kit *kit, const KitAspect *ki) KitAspectWidget::KitAspectWidget(Kit *kit, const KitAspect *ki)
: m_kit(kit), m_kitInformation(ki) : m_kit(kit), m_kitInformation(ki)
{ }
void KitAspectWidget::addToLayout(LayoutBuilder &builder)
{ {
QTC_ASSERT(!m_label, delete m_label); const Id id = ki->id();
m_label = new QLabel(m_kitInformation->displayName() + ':'); m_mutableAction = new QAction(tr("Mark as Mutable"));
m_label->setToolTip(m_kitInformation->description()); m_mutableAction->setCheckable(true);
m_mutableAction->setChecked(m_kit->isMutable(id));
builder.addRow({LayoutBuilder::AlignAsFormLabel(m_label), mainWidget(), buttonWidget()}); m_mutableAction->setEnabled(!m_kit->isSticky(id));
connect(m_mutableAction, &QAction::toggled, this, [this, id] {
m_kit->setMutable(id, m_mutableAction->isChecked());
});
} }
void KitAspectWidget::setVisible(bool visible) KitAspectWidget::~KitAspectWidget()
{ {
mainWidget()->setVisible(visible); delete m_mutableAction;
if (buttonWidget()) }
buttonWidget()->setVisible(visible);
QTC_ASSERT(m_label, return); void KitAspectWidget::addToLayoutWithLabel(QWidget *parent)
m_label->setVisible(visible); {
QTC_ASSERT(parent, return);
auto label = createSubWidget<QLabel>(m_kitInformation->displayName() + ':');
label->setToolTip(m_kitInformation->description());
LayoutExtender builder(parent->layout());
builder.finishRow();
builder.addItem(label);
addToLayout(builder);
}
void KitAspectWidget::addMutableAction(QWidget *child)
{
QTC_ASSERT(child, return);
child->addAction(m_mutableAction);
child->setContextMenuPolicy(Qt::ActionsContextMenu);
} }
QString KitAspectWidget::msgManage() QString KitAspectWidget::msgManage()

View File

@@ -31,6 +31,8 @@
#include <coreplugin/featureprovider.h> #include <coreplugin/featureprovider.h>
#include <utils/aspects.h>
#include <QObject> #include <QObject>
#include <QPair> #include <QPair>
#include <QSet> #include <QSet>
@@ -125,31 +127,30 @@ private:
bool m_essential = false; bool m_essential = false;
}; };
class PROJECTEXPLORER_EXPORT KitAspectWidget : public QObject class PROJECTEXPLORER_EXPORT KitAspectWidget : public Utils::BaseAspect
{ {
Q_OBJECT Q_OBJECT
public: public:
KitAspectWidget(Kit *kit, const KitAspect *ki); KitAspectWidget(Kit *kit, const KitAspect *ki);
~KitAspectWidget();
virtual void makeReadOnly() = 0; virtual void makeReadOnly() = 0;
virtual void refresh() = 0; virtual void refresh() = 0;
virtual QWidget *mainWidget() const = 0; void addToLayoutWithLabel(QWidget *parent);
virtual QWidget *buttonWidget() const { return nullptr; }
void addToLayout(Utils::LayoutBuilder &builder);
void setVisible(bool visible);
static QString msgManage(); static QString msgManage();
Kit *kit() const { return m_kit; } Kit *kit() const { return m_kit; }
const KitAspect *kitInformation() const { return m_kitInformation; } const KitAspect *kitInformation() const { return m_kitInformation; }
QAction *mutableAction() const { return m_mutableAction; }
void addMutableAction(QWidget *child);
protected: protected:
Kit *m_kit; Kit *m_kit;
const KitAspect *m_kitInformation; const KitAspect *m_kitInformation;
QLabel *m_label = nullptr; QAction *m_mutableAction = nullptr;
}; };
class PROJECTEXPLORER_EXPORT KitManager : public QObject class PROJECTEXPLORER_EXPORT KitManager : public QObject

View File

@@ -133,8 +133,6 @@ KitManagerConfigWidget::~KitManagerConfigWidget()
{ {
qDeleteAll(m_widgets); qDeleteAll(m_widgets);
m_widgets.clear(); m_widgets.clear();
qDeleteAll(m_actions);
m_actions.clear();
// Make sure our workingCopy did not get registered somehow: // Make sure our workingCopy did not get registered somehow:
QTC_CHECK(!Utils::contains(KitManager::kits(), QTC_CHECK(!Utils::contains(KitManager::kits(),
@@ -219,23 +217,11 @@ void KitManagerConfigWidget::addAspectToWorkingCopy(KitAspect *aspect)
QTC_ASSERT(widget, return); QTC_ASSERT(widget, return);
QTC_ASSERT(!m_widgets.contains(widget), return); QTC_ASSERT(!m_widgets.contains(widget), return);
auto action = new QAction(tr("Mark as Mutable"), nullptr); widget->addToLayoutWithLabel(this);
action->setCheckable(true);
action->setChecked(workingCopy()->isMutable(aspect->id()));
action->setEnabled(!workingCopy()->isSticky(aspect->id()));
widget->mainWidget()->addAction(action);
widget->mainWidget()->setContextMenuPolicy(Qt::ActionsContextMenu);
connect(action, &QAction::toggled, this, [this, aspect, action] {
workingCopy()->setMutable(aspect->id(), action->isChecked());
emit dirty();
});
m_actions << action;
LayoutExtender builder(layout());
widget->addToLayout(builder);
m_widgets.append(widget); m_widgets.append(widget);
connect(widget->mutableAction(), &QAction::toggled,
this, &KitManagerConfigWidget::dirty);
} }
void KitManagerConfigWidget::updateVisibility() void KitManagerConfigWidget::updateVisibility()

View File

@@ -100,7 +100,6 @@ private:
bool m_fixingKit = false; bool m_fixingKit = false;
bool m_hasUniqueName = true; bool m_hasUniqueName = true;
bool m_isRegistering = false; bool m_isRegistering = false;
QList<QAction *> m_actions;
mutable QString m_cachedDisplayName; mutable QString m_cachedDisplayName;
}; };

View File

@@ -39,6 +39,7 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/itemviews.h> #include <utils/itemviews.h>
#include <utils/layoutbuilder.h>
#include <utils/stringutils.h> #include <utils/stringutils.h>
#include <utils/styledbar.h> #include <utils/styledbar.h>
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
@@ -564,15 +565,14 @@ class KitAreaWidget : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit KitAreaWidget(QWidget *parent = nullptr) explicit KitAreaWidget(QWidget *parent = nullptr)
: QWidget(parent), m_layout(new QGridLayout(this)) : QWidget(parent)
{ {
m_layout->setContentsMargins(3, 3, 3, 3);
connect(KitManager::instance(), &KitManager::kitUpdated, this, &KitAreaWidget::updateKit); connect(KitManager::instance(), &KitManager::kitUpdated, this, &KitAreaWidget::updateKit);
} }
~KitAreaWidget() override { setKit(nullptr); } ~KitAreaWidget() override { setKit(nullptr); }
void setKit(ProjectExplorer::Kit *k) void setKit(Kit *k)
{ {
qDeleteAll(m_widgets); qDeleteAll(m_widgets);
m_widgets.clear(); m_widgets.clear();
@@ -580,25 +580,22 @@ public:
if (!k) if (!k)
return; return;
foreach (QLabel *l, m_labels) delete layout();
l->deleteLater();
m_labels.clear();
int row = 0; LayoutBuilder builder(LayoutBuilder::GridLayout);
for (KitAspect *aspect : KitManager::kitAspects()) { for (KitAspect *aspect : KitManager::kitAspects()) {
if (k && k->isMutable(aspect->id())) { if (k && k->isMutable(aspect->id())) {
KitAspectWidget *widget = aspect->createConfigWidget(k); KitAspectWidget *widget = aspect->createConfigWidget(k);
m_widgets << widget; m_widgets << widget;
QLabel *label = new QLabel(aspect->displayName()); QLabel *label = new QLabel(aspect->displayName());
m_labels << label; builder.addItem(label);
widget->addToLayout(builder);
m_layout->addWidget(label, row, 0); builder.finishRow();
m_layout->addWidget(widget->mainWidget(), row, 1);
m_layout->addWidget(widget->buttonWidget(), row, 2);
++row;
} }
} }
builder.attachTo(this);
layout()->setContentsMargins(3, 3, 3, 3);
m_kit = k; m_kit = k;
setHidden(m_widgets.isEmpty()); setHidden(m_widgets.isEmpty());
@@ -633,10 +630,8 @@ private:
} }
} }
QGridLayout *m_layout;
Kit *m_kit = nullptr; Kit *m_kit = nullptr;
QList<KitAspectWidget *> m_widgets; QList<KitAspectWidget *> m_widgets;
QList<QLabel *> m_labels;
}; };
///////// /////////

View File

@@ -31,6 +31,7 @@
#include <projectexplorer/kitmanager.h> #include <projectexplorer/kitmanager.h>
#include <utils/elidinglabel.h> #include <utils/elidinglabel.h>
#include <utils/layoutbuilder.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QPushButton> #include <QPushButton>
@@ -46,8 +47,8 @@ class AspectWidget final : public KitAspectWidget
public: public:
AspectWidget(Kit *kit, const KitAspect *kitInfo) AspectWidget(Kit *kit, const KitAspect *kitInfo)
: KitAspectWidget(kit, kitInfo), : KitAspectWidget(kit, kitInfo),
m_contentLabel(new Utils::ElidingLabel), m_contentLabel(createSubWidget<Utils::ElidingLabel>()),
m_changeButton(new QPushButton(tr("Change..."))) m_changeButton(createSubWidget<QPushButton>(tr("Change...")))
{ {
connect(m_changeButton, &QPushButton::clicked, this, &AspectWidget::changeProperties); connect(m_changeButton, &QPushButton::clicked, this, &AspectWidget::changeProperties);
} }
@@ -55,8 +56,13 @@ public:
private: private:
void makeReadOnly() override { m_changeButton->setEnabled(false); } void makeReadOnly() override { m_changeButton->setEnabled(false); }
void refresh() override { m_contentLabel->setText(QbsKitAspect::representation(kit())); } void refresh() override { m_contentLabel->setText(QbsKitAspect::representation(kit())); }
QWidget *mainWidget() const override { return m_contentLabel; }
QWidget *buttonWidget() const override { return m_changeButton; } void addToLayout(Utils::LayoutBuilder &builder) override
{
addMutableAction(m_contentLabel);
builder.addItem(m_contentLabel);
builder.addItem(m_changeButton);
}
void changeProperties() void changeProperties()
{ {

View File

@@ -34,6 +34,7 @@
#include <qtsupport/qtkitinformation.h> #include <qtsupport/qtkitinformation.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/layoutbuilder.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QDir> #include <QDir>
@@ -51,7 +52,7 @@ class QmakeKitAspectWidget final : public KitAspectWidget
public: public:
QmakeKitAspectWidget(Kit *k, const KitAspect *ki) QmakeKitAspectWidget(Kit *k, const KitAspect *ki)
: KitAspectWidget(k, ki), m_lineEdit(new QLineEdit) : KitAspectWidget(k, ki), m_lineEdit(createSubWidget<QLineEdit>())
{ {
refresh(); // set up everything according to kit refresh(); // set up everything according to kit
m_lineEdit->setToolTip(ki->description()); m_lineEdit->setToolTip(ki->description());
@@ -61,7 +62,12 @@ public:
~QmakeKitAspectWidget() override { delete m_lineEdit; } ~QmakeKitAspectWidget() override { delete m_lineEdit; }
private: private:
QWidget *mainWidget() const override { return m_lineEdit; } void addToLayout(LayoutBuilder &builder) override
{
addMutableAction(m_lineEdit);
builder.addItem(m_lineEdit);
}
void makeReadOnly() override { m_lineEdit->setEnabled(false); } void makeReadOnly() override { m_lineEdit->setEnabled(false); }
void refresh() override void refresh() override

View File

@@ -37,6 +37,7 @@
#include <projectexplorer/toolchainmanager.h> #include <projectexplorer/toolchainmanager.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/buildablehelperlibrary.h> #include <utils/buildablehelperlibrary.h>
#include <utils/layoutbuilder.h>
#include <utils/macroexpander.h> #include <utils/macroexpander.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -55,14 +56,14 @@ class QtKitAspectWidget final : public KitAspectWidget
public: public:
QtKitAspectWidget(Kit *k, const KitAspect *ki) : KitAspectWidget(k, ki) QtKitAspectWidget(Kit *k, const KitAspect *ki) : KitAspectWidget(k, ki)
{ {
m_combo = new QComboBox; m_combo = createSubWidget<QComboBox>();
m_combo->setSizePolicy(QSizePolicy::Ignored, m_combo->sizePolicy().verticalPolicy()); m_combo->setSizePolicy(QSizePolicy::Ignored, m_combo->sizePolicy().verticalPolicy());
m_combo->addItem(tr("None"), -1); m_combo->addItem(tr("None"), -1);
QList<int> versionIds = Utils::transform(QtVersionManager::versions(), &BaseQtVersion::uniqueId); QList<int> versionIds = Utils::transform(QtVersionManager::versions(), &BaseQtVersion::uniqueId);
versionsChanged(versionIds, QList<int>(), QList<int>()); versionsChanged(versionIds, QList<int>(), QList<int>());
m_manageButton = new QPushButton(KitAspectWidget::msgManage()); m_manageButton = createSubWidget<QPushButton>(KitAspectWidget::msgManage());
refresh(); refresh();
m_combo->setToolTip(ki->description()); m_combo->setToolTip(ki->description());
@@ -84,8 +85,13 @@ public:
private: private:
void makeReadOnly() final { m_combo->setEnabled(false); } void makeReadOnly() final { m_combo->setEnabled(false); }
QWidget *mainWidget() const final { return m_combo; }
QWidget *buttonWidget() const final { return m_manageButton; } void addToLayout(LayoutBuilder &builder)
{
addMutableAction(m_combo);
builder.addItem(m_combo);
builder.addItem(m_manageButton);
}
void refresh() final void refresh() final
{ {
@@ -125,7 +131,7 @@ private:
void manageQtVersions() void manageQtVersions()
{ {
Core::ICore::showOptionsDialog(Constants::QTVERSION_SETTINGS_PAGE_ID, buttonWidget()); Core::ICore::showOptionsDialog(Constants::QTVERSION_SETTINGS_PAGE_ID, m_manageButton);
} }
void currentWasChanged(int idx) void currentWasChanged(int idx)