aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer/kitmodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/projectexplorer/kitmodel.cpp')
-rw-r--r--src/plugins/projectexplorer/kitmodel.cpp186
1 files changed, 125 insertions, 61 deletions
diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp
index 4b250f23c98..12f23fb2819 100644
--- a/src/plugins/projectexplorer/kitmodel.cpp
+++ b/src/plugins/projectexplorer/kitmodel.cpp
@@ -24,57 +24,122 @@ namespace Internal {
class KitNode : public TreeItem
{
public:
- KitNode(Kit *k, KitModel *m)
+ KitNode(Kit *k, KitModel *m, QBoxLayout *parentLayout)
+ : m_kit(k), m_model(m), m_parentLayout(parentLayout)
+ {}
+
+ ~KitNode() override { delete m_widget; }
+
+ Kit *kit() const { return m_kit; }
+
+ QVariant data(int, int role) const override
{
- widget = new KitManagerConfigWidget(k);
+ if (role == Qt::FontRole) {
+ QFont f = QApplication::font();
+ if (isDirty())
+ f.setBold(!f.bold());
+ if (isDefaultKit())
+ f.setItalic(f.style() != QFont::StyleItalic);
+ return f;
+ }
+ if (role == Qt::DisplayRole) {
+ QString baseName = displayName();
+ if (isDefaultKit())
+ //: Mark up a kit as the default one.
+ baseName = Tr::tr("%1 (default)").arg(baseName);
+ return baseName;
+ }
- QObject::connect(widget, &KitManagerConfigWidget::dirty, m, [this] { update(); });
+ if (role == Qt::DecorationRole)
+ return displayIcon();
- QObject::connect(widget, &KitManagerConfigWidget::isAutoDetectedChanged, m, [this, m] {
- TreeItem *oldParent = parent();
- TreeItem *newParent =
- m->rootItem()->childAt(widget->workingCopy()->isAutoDetected() ? 0 : 1);
- if (oldParent && oldParent != newParent) {
- m->takeItem(this);
- newParent->appendChild(this);
- }
- });
+ if (role == Qt::ToolTipRole)
+ return widget()->validityMessage();
+
+ return {};
}
- ~KitNode() override
+ bool isDirty() const
{
- delete widget;
+ if (m_widget)
+ return m_widget->isDirty();
+ return false;
}
- QVariant data(int, int role) const override
+ QIcon displayIcon() const
{
- if (widget) {
- if (role == Qt::FontRole) {
- QFont f = QApplication::font();
- if (widget->isDirty())
- f.setBold(!f.bold());
- if (widget->isDefaultKit())
- f.setItalic(f.style() != QFont::StyleItalic);
- return f;
- }
- if (role == Qt::DisplayRole) {
- QString baseName = widget->displayName();
- if (widget->isDefaultKit())
- //: Mark up a kit as the default one.
- baseName = Tr::tr("%1 (default)").arg(baseName);
- return baseName;
- }
- if (role == Qt::DecorationRole) {
- return widget->displayIcon();
- }
- if (role == Qt::ToolTipRole) {
- return widget->validityMessage();
+ if (m_widget)
+ return m_widget->displayIcon();
+ return m_kit->displayIcon();
+ }
+
+ QString displayName() const
+ {
+ if (m_widget)
+ return m_widget->displayName();
+ return m_kit->displayName();
+ }
+
+ bool isDefaultKit() const
+ {
+ return m_isDefaultKit;
+ }
+
+ bool isRegistering() const
+ {
+ if (m_widget)
+ return m_widget->isRegistering();
+ return false;
+ }
+
+ void setIsDefaultKit(bool on)
+ {
+ if (m_isDefaultKit == on)
+ return;
+ m_isDefaultKit = on;
+ if (m_widget)
+ emit m_widget->dirty();
+ }
+
+ KitManagerConfigWidget *widget() const
+ {
+ const_cast<KitNode *>(this)->ensureWidget();
+ return m_widget;
+ }
+
+ void setHasUniqueName(bool on)
+ {
+ m_hasUniqueName = on;
+ }
+
+private:
+ void ensureWidget()
+ {
+ if (m_widget)
+ return;
+
+ m_widget = new KitManagerConfigWidget(m_kit, m_isDefaultKit, m_hasUniqueName);
+
+ QObject::connect(m_widget, &KitManagerConfigWidget::dirty, m_model, [this] { update(); });
+
+ QObject::connect(m_widget, &KitManagerConfigWidget::isAutoDetectedChanged, m_model, [this] {
+ TreeItem *oldParent = parent();
+ TreeItem *newParent =
+ m_model->rootItem()->childAt(m_widget->workingCopy()->isAutoDetected() ? 0 : 1);
+ if (oldParent && oldParent != newParent) {
+ m_model->takeItem(this);
+ newParent->appendChild(this);
}
- }
- return QVariant();
+ });
+ m_parentLayout->addWidget(m_widget);
}
- KitManagerConfigWidget *widget;
+ Kit *m_kit = m_kit;
+ KitModel *m_model = nullptr;
+ KitManagerConfigWidget *m_widget = nullptr;
+ QBoxLayout *m_parentLayout = nullptr;
+ bool m_isDefaultKit = false;
+ bool m_hasUniqueName = true;
};
// --------------------------------------------------------------------------
@@ -113,7 +178,7 @@ KitModel::KitModel(QBoxLayout *parentLayout, QObject *parent)
Kit *KitModel::kit(const QModelIndex &index)
{
KitNode *n = kitNode(index);
- return n ? n->widget->workingCopy() : nullptr;
+ return n ? n->widget()->workingCopy() : nullptr;
}
KitNode *KitModel::kitNode(const QModelIndex &index)
@@ -136,20 +201,20 @@ void KitModel::setDefaultKit(const QModelIndex &index)
bool KitModel::isDefaultKit(Kit *k) const
{
- return m_defaultNode && m_defaultNode->widget->workingCopy() == k;
+ return m_defaultNode && m_defaultNode->widget()->workingCopy() == k;
}
KitManagerConfigWidget *KitModel::widget(const QModelIndex &index)
{
KitNode *n = kitNode(index);
- return n ? n->widget : nullptr;
+ return n ? n->widget() : nullptr;
}
void KitModel::validateKitNames()
{
QHash<QString, int> nameHash;
forItemsAtLevel<2>([&nameHash](KitNode *n) {
- const QString displayName = n->widget->displayName();
+ const QString displayName = n->displayName();
if (nameHash.contains(displayName))
++nameHash[displayName];
else
@@ -157,8 +222,8 @@ void KitModel::validateKitNames()
});
forItemsAtLevel<2>([&nameHash](KitNode *n) {
- const QString displayName = n->widget->displayName();
- n->widget->setHasUniqueName(nameHash.value(displayName) == 1);
+ const QString displayName = n->displayName();
+ n->setHasUniqueName(nameHash.value(displayName) == 1);
});
}
@@ -166,8 +231,8 @@ void KitModel::apply()
{
// Add/update dirty nodes before removing kits. This ensures the right kit ends up as default.
forItemsAtLevel<2>([](KitNode *n) {
- if (n->widget->isDirty()) {
- n->widget->apply();
+ if (n->isDirty()) {
+ n->widget()->apply();
n->update();
}
});
@@ -175,7 +240,7 @@ void KitModel::apply()
// Remove unused kits:
const QList<KitNode *> removeList = m_toRemoveList;
for (KitNode *n : removeList)
- n->widget->removeKit();
+ KitManager::deregisterKit(n->kit());
emit layoutChanged(); // Force update.
}
@@ -197,7 +262,7 @@ void KitModel::markForRemoval(Kit *k)
setDefaultNode(findItemAtLevel<2>([node](KitNode *kn) { return kn != node; }));
takeItem(node);
- if (node->widget->configures(nullptr))
+ if (node->kit() == nullptr)
delete node;
else
m_toRemoveList.append(node);
@@ -209,7 +274,7 @@ Kit *KitModel::markForAddition(Kit *baseKit)
const QString newName = newKitName(baseKit ? baseKit->unexpandedDisplayName() : QString());
KitNode *node = createNode(nullptr);
m_manualRoot->appendChild(node);
- Kit *k = node->widget->workingCopy();
+ Kit *k = node->widget()->workingCopy();
KitGuard g(k);
if (baseKit) {
k->copyFrom(baseKit);
@@ -229,7 +294,7 @@ Kit *KitModel::markForAddition(Kit *baseKit)
void KitModel::updateVisibility()
{
forItemsAtLevel<2>([](const TreeItem *ti) {
- static_cast<const KitNode *>(ti)->widget->updateVisibility();
+ static_cast<const KitNode *>(ti)->widget()->updateVisibility();
});
}
@@ -237,32 +302,31 @@ QString KitModel::newKitName(const QString &sourceName) const
{
QList<Kit *> allKits;
forItemsAtLevel<2>([&allKits](const TreeItem *ti) {
- allKits << static_cast<const KitNode *>(ti)->widget->workingCopy();
+ allKits << static_cast<const KitNode *>(ti)->widget()->workingCopy();
});
return Kit::newKitName(sourceName, allKits);
}
KitNode *KitModel::findWorkingCopy(Kit *k) const
{
- return findItemAtLevel<2>([k](KitNode *n) { return n->widget->workingCopy() == k; });
+ return findItemAtLevel<2>([k](KitNode *n) { return n->widget()->workingCopy() == k; });
}
KitNode *KitModel::createNode(Kit *k)
{
- auto node = new KitNode(k, this);
- m_parentLayout->addWidget(node->widget);
+ auto node = new KitNode(k, this, m_parentLayout);
return node;
}
void KitModel::setDefaultNode(KitNode *node)
{
if (m_defaultNode) {
- m_defaultNode->widget->setIsDefaultKit(false);
+ m_defaultNode->setIsDefaultKit(false);
m_defaultNode->update();
}
m_defaultNode = node;
if (m_defaultNode) {
- m_defaultNode->widget->setIsDefaultKit(true);
+ m_defaultNode->setIsDefaultKit(true);
m_defaultNode->update();
}
}
@@ -271,7 +335,7 @@ void KitModel::addKit(Kit *k)
{
for (TreeItem *n : *m_manualRoot) {
// Was added by us
- if (static_cast<KitNode *>(n)->widget->isRegistering())
+ if (static_cast<KitNode *>(n)->isRegistering())
return;
}
@@ -292,7 +356,7 @@ void KitModel::removeKit(Kit *k)
{
QList<KitNode *> nodes = m_toRemoveList;
for (KitNode *n : std::as_const(nodes)) {
- if (n->widget->configures(k)) {
+ if (n->kit() == k) {
m_toRemoveList.removeOne(n);
if (m_defaultNode == n)
m_defaultNode = nullptr;
@@ -303,7 +367,7 @@ void KitModel::removeKit(Kit *k)
}
KitNode *node = findItemAtLevel<2>([k](KitNode *n) {
- return n->widget->configures(k);
+ return n->kit() == k;
});
if (node == m_defaultNode)
@@ -319,7 +383,7 @@ void KitModel::changeDefaultKit()
{
Kit *defaultKit = KitManager::defaultKit();
KitNode *node = findItemAtLevel<2>([defaultKit](KitNode *n) {
- return n->widget->configures(defaultKit);
+ return n->kit() == defaultKit;
});
setDefaultNode(node);
}