forked from qt-creator/qt-creator
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:
@@ -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());
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user