ProjectExplorer: Avoid KitConfigWidget creation in some code paths

They are now only created when the kit is selected for editing or
for getting a tooltip.

Change-Id: I50b4194610f662645eada9f69e4b6f2d20aa6c00
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2023-04-18 16:54:53 +02:00
parent a353e9fde1
commit 3351459ead
3 changed files with 93 additions and 71 deletions

View File

@@ -36,12 +36,14 @@ using namespace Utils;
namespace ProjectExplorer { namespace ProjectExplorer {
namespace Internal { namespace Internal {
KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) : KitManagerConfigWidget::KitManagerConfigWidget(Kit *k, bool &isDefaultKit, bool &hasUniqueName) :
m_iconButton(new QToolButton), m_iconButton(new QToolButton),
m_nameEdit(new QLineEdit), m_nameEdit(new QLineEdit),
m_fileSystemFriendlyNameLineEdit(new QLineEdit), m_fileSystemFriendlyNameLineEdit(new QLineEdit),
m_kit(k), m_kit(k),
m_modifiedKit(std::make_unique<Kit>(Utils::Id(WORKING_COPY_KIT_ID))) m_modifiedKit(std::make_unique<Kit>(Utils::Id(WORKING_COPY_KIT_ID))),
m_isDefaultKit(isDefaultKit),
m_hasUniqueName(hasUniqueName)
{ {
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
@@ -213,11 +215,6 @@ void KitManagerConfigWidget::updateVisibility()
} }
} }
void KitManagerConfigWidget::setHasUniqueName(bool unique)
{
m_hasUniqueName = unique;
}
void KitManagerConfigWidget::makeStickySubWidgetsReadOnly() void KitManagerConfigWidget::makeStickySubWidgetsReadOnly()
{ {
for (KitAspectWidget *w : std::as_const(m_widgets)) { for (KitAspectWidget *w : std::as_const(m_widgets)) {
@@ -231,31 +228,11 @@ Kit *KitManagerConfigWidget::workingCopy() const
return m_modifiedKit.get(); return m_modifiedKit.get();
} }
bool KitManagerConfigWidget::configures(Kit *k) const
{
return m_kit == k;
}
void KitManagerConfigWidget::setIsDefaultKit(bool d)
{
if (m_isDefaultKit == d)
return;
m_isDefaultKit = d;
emit dirty();
}
bool KitManagerConfigWidget::isDefaultKit() const bool KitManagerConfigWidget::isDefaultKit() const
{ {
return m_isDefaultKit; return m_isDefaultKit;
} }
void KitManagerConfigWidget::removeKit()
{
if (!m_kit)
return;
KitManager::deregisterKit(m_kit);
}
void KitManagerConfigWidget::setIcon() void KitManagerConfigWidget::setIcon()
{ {
const Utils::Id deviceType = DeviceTypeKitAspect::deviceTypeId(m_modifiedKit.get()); const Utils::Id deviceType = DeviceTypeKitAspect::deviceTypeId(m_modifiedKit.get());

View File

@@ -25,7 +25,7 @@ class KitManagerConfigWidget : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit KitManagerConfigWidget(Kit *k); explicit KitManagerConfigWidget(Kit *k, bool &isDefaultKit, bool &hasUniqueName);
~KitManagerConfigWidget() override; ~KitManagerConfigWidget() override;
QString displayName() const; QString displayName() const;
@@ -39,15 +39,10 @@ public:
void makeStickySubWidgetsReadOnly(); void makeStickySubWidgetsReadOnly();
Kit *workingCopy() const; Kit *workingCopy() const;
bool configures(Kit *k) const;
bool isRegistering() const { return m_isRegistering; } bool isRegistering() const { return m_isRegistering; }
void setIsDefaultKit(bool d);
bool isDefaultKit() const; bool isDefaultKit() const;
void removeKit();
void updateVisibility(); void updateVisibility();
void setHasUniqueName(bool unique);
signals: signals:
void dirty(); void dirty();
void isAutoDetectedChanged(); void isAutoDetectedChanged();
@@ -74,9 +69,9 @@ private:
QList<KitAspectWidget *> m_widgets; QList<KitAspectWidget *> m_widgets;
Kit *m_kit; Kit *m_kit;
std::unique_ptr<Kit> m_modifiedKit; std::unique_ptr<Kit> m_modifiedKit;
bool m_isDefaultKit = false; bool &m_isDefaultKit;
bool m_fixingKit = false; bool m_fixingKit = false;
bool m_hasUniqueName = true; bool &m_hasUniqueName;
bool m_isRegistering = false; bool m_isRegistering = false;
mutable QString m_cachedDisplayName; mutable QString m_cachedDisplayName;
}; };

View File

@@ -30,32 +30,75 @@ public:
~KitNode() override { delete m_widget; } ~KitNode() override { delete m_widget; }
Kit *kit() const { return m_kit; }
QVariant data(int, int role) const override QVariant data(int, int role) const override
{ {
if (m_widget) {
if (role == Qt::FontRole) { if (role == Qt::FontRole) {
QFont f = QApplication::font(); QFont f = QApplication::font();
if (m_widget->isDirty()) if (isDirty())
f.setBold(!f.bold()); f.setBold(!f.bold());
if (m_widget->isDefaultKit()) if (isDefaultKit())
f.setItalic(f.style() != QFont::StyleItalic); f.setItalic(f.style() != QFont::StyleItalic);
return f; return f;
} }
if (role == Qt::DisplayRole) { if (role == Qt::DisplayRole) {
QString baseName = m_widget->displayName(); QString baseName = displayName();
if (m_widget->isDefaultKit()) if (isDefaultKit())
//: Mark up a kit as the default one. //: Mark up a kit as the default one.
baseName = Tr::tr("%1 (default)").arg(baseName); baseName = Tr::tr("%1 (default)").arg(baseName);
return baseName; return baseName;
} }
if (role == Qt::DecorationRole) {
if (role == Qt::DecorationRole)
return displayIcon();
if (role == Qt::ToolTipRole)
return widget()->validityMessage();
return {};
}
bool isDirty() const
{
if (m_widget)
return m_widget->isDirty();
return false;
}
QIcon displayIcon() const
{
if (m_widget)
return m_widget->displayIcon(); return m_widget->displayIcon();
return m_kit->displayIcon();
} }
if (role == Qt::ToolTipRole) {
return m_widget->validityMessage(); QString displayName() const
{
if (m_widget)
return m_widget->displayName();
return m_kit->displayName();
} }
bool isDefaultKit() const
{
return m_isDefaultKit;
} }
return QVariant();
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 KitManagerConfigWidget *widget() const
@@ -64,13 +107,18 @@ public:
return m_widget; return m_widget;
} }
void setHasUniqueName(bool on)
{
m_hasUniqueName = on;
}
private: private:
void ensureWidget() void ensureWidget()
{ {
if (m_widget) if (m_widget)
return; return;
m_widget = new KitManagerConfigWidget(m_kit); 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::dirty, m_model, [this] { update(); });
@@ -90,6 +138,8 @@ private:
KitModel *m_model = nullptr; KitModel *m_model = nullptr;
KitManagerConfigWidget *m_widget = nullptr; KitManagerConfigWidget *m_widget = nullptr;
QBoxLayout *m_parentLayout = nullptr; QBoxLayout *m_parentLayout = nullptr;
bool m_isDefaultKit = false;
bool m_hasUniqueName = true;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -164,7 +214,7 @@ void KitModel::validateKitNames()
{ {
QHash<QString, int> nameHash; QHash<QString, int> nameHash;
forItemsAtLevel<2>([&nameHash](KitNode *n) { forItemsAtLevel<2>([&nameHash](KitNode *n) {
const QString displayName = n->widget()->displayName(); const QString displayName = n->displayName();
if (nameHash.contains(displayName)) if (nameHash.contains(displayName))
++nameHash[displayName]; ++nameHash[displayName];
else else
@@ -172,8 +222,8 @@ void KitModel::validateKitNames()
}); });
forItemsAtLevel<2>([&nameHash](KitNode *n) { forItemsAtLevel<2>([&nameHash](KitNode *n) {
const QString displayName = n->widget()->displayName(); const QString displayName = n->displayName();
n->widget()->setHasUniqueName(nameHash.value(displayName) == 1); n->setHasUniqueName(nameHash.value(displayName) == 1);
}); });
} }
@@ -181,7 +231,7 @@ void KitModel::apply()
{ {
// Add/update dirty nodes before removing kits. This ensures the right kit ends up as default. // Add/update dirty nodes before removing kits. This ensures the right kit ends up as default.
forItemsAtLevel<2>([](KitNode *n) { forItemsAtLevel<2>([](KitNode *n) {
if (n->widget()->isDirty()) { if (n->isDirty()) {
n->widget()->apply(); n->widget()->apply();
n->update(); n->update();
} }
@@ -190,7 +240,7 @@ void KitModel::apply()
// Remove unused kits: // Remove unused kits:
const QList<KitNode *> removeList = m_toRemoveList; const QList<KitNode *> removeList = m_toRemoveList;
for (KitNode *n : removeList) for (KitNode *n : removeList)
n->widget()->removeKit(); KitManager::deregisterKit(n->kit());
emit layoutChanged(); // Force update. emit layoutChanged(); // Force update.
} }
@@ -212,7 +262,7 @@ void KitModel::markForRemoval(Kit *k)
setDefaultNode(findItemAtLevel<2>([node](KitNode *kn) { return kn != node; })); setDefaultNode(findItemAtLevel<2>([node](KitNode *kn) { return kn != node; }));
takeItem(node); takeItem(node);
if (node->widget()->configures(nullptr)) if (node->kit() == nullptr)
delete node; delete node;
else else
m_toRemoveList.append(node); m_toRemoveList.append(node);
@@ -271,12 +321,12 @@ KitNode *KitModel::createNode(Kit *k)
void KitModel::setDefaultNode(KitNode *node) void KitModel::setDefaultNode(KitNode *node)
{ {
if (m_defaultNode) { if (m_defaultNode) {
m_defaultNode->widget()->setIsDefaultKit(false); m_defaultNode->setIsDefaultKit(false);
m_defaultNode->update(); m_defaultNode->update();
} }
m_defaultNode = node; m_defaultNode = node;
if (m_defaultNode) { if (m_defaultNode) {
m_defaultNode->widget()->setIsDefaultKit(true); m_defaultNode->setIsDefaultKit(true);
m_defaultNode->update(); m_defaultNode->update();
} }
} }
@@ -285,7 +335,7 @@ void KitModel::addKit(Kit *k)
{ {
for (TreeItem *n : *m_manualRoot) { for (TreeItem *n : *m_manualRoot) {
// Was added by us // Was added by us
if (static_cast<KitNode *>(n)->widget()->isRegistering()) if (static_cast<KitNode *>(n)->isRegistering())
return; return;
} }
@@ -306,7 +356,7 @@ void KitModel::removeKit(Kit *k)
{ {
QList<KitNode *> nodes = m_toRemoveList; QList<KitNode *> nodes = m_toRemoveList;
for (KitNode *n : std::as_const(nodes)) { for (KitNode *n : std::as_const(nodes)) {
if (n->widget()->configures(k)) { if (n->kit() == k) {
m_toRemoveList.removeOne(n); m_toRemoveList.removeOne(n);
if (m_defaultNode == n) if (m_defaultNode == n)
m_defaultNode = nullptr; m_defaultNode = nullptr;
@@ -317,7 +367,7 @@ void KitModel::removeKit(Kit *k)
} }
KitNode *node = findItemAtLevel<2>([k](KitNode *n) { KitNode *node = findItemAtLevel<2>([k](KitNode *n) {
return n->widget()->configures(k); return n->kit() == k;
}); });
if (node == m_defaultNode) if (node == m_defaultNode)
@@ -333,7 +383,7 @@ void KitModel::changeDefaultKit()
{ {
Kit *defaultKit = KitManager::defaultKit(); Kit *defaultKit = KitManager::defaultKit();
KitNode *node = findItemAtLevel<2>([defaultKit](KitNode *n) { KitNode *node = findItemAtLevel<2>([defaultKit](KitNode *n) {
return n->widget()->configures(defaultKit); return n->kit() == defaultKit;
}); });
setDefaultNode(node); setDefaultNode(node);
} }