ProjectExplorer: More KitOptionsPage simplification

Change-Id: I07244e510e44a3ee2af5e771450ab6413a5a5c2d
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
This commit is contained in:
hjk
2015-01-08 16:37:51 +01:00
parent 41d1c7e0e1
commit 8d3e6b14ee
4 changed files with 81 additions and 116 deletions

View File

@@ -124,22 +124,28 @@ KitModel::KitModel(QBoxLayout *parentLayout, QObject *parent) :
changeDefaultKit(); changeDefaultKit();
connect(KitManager::instance(), SIGNAL(kitAdded(ProjectExplorer::Kit*)), connect(KitManager::instance(), &KitManager::kitAdded,
this, SLOT(addKit(ProjectExplorer::Kit*))); this, &KitModel::addKit);
connect(KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)), connect(KitManager::instance(), &KitManager::kitUpdated,
this, SLOT(updateKit(ProjectExplorer::Kit*))); this, &KitModel::updateKit);
connect(KitManager::instance(), SIGNAL(unmanagedKitUpdated(ProjectExplorer::Kit*)), connect(KitManager::instance(), &KitManager::unmanagedKitUpdated,
this, SLOT(updateKit(ProjectExplorer::Kit*))); this, &KitModel::updateKit);
connect(KitManager::instance(), SIGNAL(kitRemoved(ProjectExplorer::Kit*)), connect(KitManager::instance(), &KitManager::kitRemoved,
this, SLOT(removeKit(ProjectExplorer::Kit*))); this, &KitModel::removeKit);
connect(KitManager::instance(), SIGNAL(defaultkitChanged()), connect(KitManager::instance(), &KitManager::defaultkitChanged,
this, SLOT(changeDefaultKit())); this, &KitModel::changeDefaultKit);
} }
Kit *KitModel::kit(const QModelIndex &index) Kit *KitModel::kit(const QModelIndex &index)
{
KitNode *n = kitNode(index);
return n ? n->widget->workingCopy() : 0;
}
KitNode *KitModel::kitNode(const QModelIndex &index)
{ {
TreeItem *n = itemFromIndex(index); TreeItem *n = itemFromIndex(index);
return n && n->level() == 2 ? static_cast<KitNode *>(n)->widget->workingCopy() : 0; return n && n->level() == 2 ? static_cast<KitNode *>(n) : 0;
} }
QModelIndex KitModel::indexOf(Kit *k) const QModelIndex KitModel::indexOf(Kit *k) const
@@ -150,83 +156,53 @@ QModelIndex KitModel::indexOf(Kit *k) const
void KitModel::setDefaultKit(const QModelIndex &index) void KitModel::setDefaultKit(const QModelIndex &index)
{ {
TreeItem *n = itemFromIndex(index); if (KitNode *n = kitNode(index))
if (n && n->level() == 2) setDefaultNode(n);
setDefaultNode(static_cast<KitNode *>(n));
} }
bool KitModel::isDefaultKit(const QModelIndex &index) bool KitModel::isDefaultKit(Kit *k) const
{ {
TreeItem *n = itemFromIndex(index); return m_defaultNode && m_defaultNode->widget->workingCopy() == k;
return n && n->level() == 2 && n == m_defaultNode;
} }
KitManagerConfigWidget *KitModel::widget(const QModelIndex &index) KitManagerConfigWidget *KitModel::widget(const QModelIndex &index)
{ {
if (!index.isValid()) KitNode *n = kitNode(index);
return 0; return n ? n->widget : 0;
KitNode *node = static_cast<KitNode *>(index.internalPointer());
if (node == m_autoRoot || node == m_manualRoot)
return 0;
return node->widget;
}
bool KitModel::isDirty() const
{
return Utils::anyOf(m_manualRoot->children(), [](TreeItem *n) {
return static_cast<KitNode *>(n)->widget->isDirty();
});
}
bool KitModel::isDirty(Kit *k) const
{
KitNode *n = findWorkingCopy(k);
return n ? n->widget->isDirty() : false;
} }
void KitModel::validateKitNames() void KitModel::validateKitNames()
{ {
QHash<QString, int> nameHash; QHash<QString, int> nameHash;
foreach (TreeItem *group, rootItem()->children()) { foreach (KitNode *n, treeLevelItems<KitNode *>(2)) {
foreach (TreeItem *item, group->children()) { const QString displayName = n->widget->displayName();
KitNode *n = static_cast<KitNode *>(item); if (nameHash.contains(displayName))
const QString displayName = n->widget->displayName(); ++nameHash[displayName];
if (nameHash.contains(displayName)) else
++nameHash[displayName]; nameHash.insert(displayName, 1);
else
nameHash.insert(displayName, 1);
}
} }
foreach (TreeItem *group, rootItem()->children()) { foreach (KitNode *n, treeLevelItems<KitNode *>(2)) {
foreach (TreeItem *item, group->children()) { const QString displayName = n->widget->displayName();
KitNode *n = static_cast<KitNode *>(item); n->widget->setHasUniqueName(nameHash.value(displayName) == 1);
const QString displayName = n->widget->displayName();
n->widget->setHasUniqueName(nameHash.value(displayName) == 1);
}
} }
} }
void KitModel::apply() void KitModel::apply()
{ {
// Remove unused kits: // Remove unused kits:
QList<KitNode *> nodes = m_toRemoveList; foreach (KitNode *n, m_toRemoveList)
foreach (KitNode *n, nodes)
n->widget->removeKit(); n->widget->removeKit();
// Update kits: // Update kits:
foreach (TreeItem *group, rootItem()->children()) { foreach (KitNode *n, treeLevelItems<KitNode *>(2)) {
//QList<TreeItems *> nodes = rootItem()->children(); // These can be dirty due to being made default! if (n->widget->isDirty()) {
//nodes.append(m_manualRoot->children()); n->widget->apply();
foreach (TreeItem *item, group->children()) { updateItem(n);
KitNode *n = static_cast<KitNode *>(item);
Q_ASSERT(n->widget);
if (n->widget->isDirty()) {
n->widget->apply();
updateItem(item);
}
} }
} }
layoutChanged(); // Force update.
} }
void KitModel::markForRemoval(Kit *k) void KitModel::markForRemoval(Kit *k)
@@ -274,12 +250,9 @@ Kit *KitModel::markForAddition(Kit *baseKit)
KitNode *KitModel::findWorkingCopy(Kit *k) const KitNode *KitModel::findWorkingCopy(Kit *k) const
{ {
foreach (TreeItem *group, rootItem()->children()) { foreach (KitNode *n, treeLevelItems<KitNode *>(2)) {
foreach (TreeItem *item, group->children()) { if (n->widget->workingCopy() == k)
KitNode *n = static_cast<KitNode *>(item); return n;
if (n->widget->workingCopy() == k)
return n;
}
} }
return 0; return 0;
} }
@@ -340,13 +313,10 @@ void KitModel::removeKit(Kit *k)
} }
KitNode *node = 0; KitNode *node = 0;
foreach (TreeItem *group, rootItem()->children()) { foreach (KitNode *n, treeLevelItems<KitNode *>(2)) {
foreach (TreeItem *item, group->children()) { if (n->widget->configures(k)) {
KitNode *n = static_cast<KitNode *>(item); node = n;
if (n->widget->configures(k)) { break;
node = n;
break;
}
} }
} }
@@ -362,13 +332,10 @@ void KitModel::removeKit(Kit *k)
void KitModel::changeDefaultKit() void KitModel::changeDefaultKit()
{ {
Kit *defaultKit = KitManager::defaultKit(); Kit *defaultKit = KitManager::defaultKit();
foreach (TreeItem *group, rootItem()->children()) { foreach (KitNode *n, treeLevelItems<KitNode *>(2)) {
foreach (TreeItem *item, group->children()) { if (n->widget->configures(defaultKit)) {
KitNode *n = static_cast<KitNode *>(item); setDefaultNode(n);
if (n->widget->configures(defaultKit)) { return;
setDefaultNode(n);
return;
}
} }
} }
} }

View File

@@ -46,8 +46,8 @@ class KitFactory;
class KitManager; class KitManager;
namespace Internal { namespace Internal {
class KitManagerConfigWidget;
class KitManagerConfigWidget;
class KitNode; class KitNode;
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -62,16 +62,14 @@ public:
explicit KitModel(QBoxLayout *parentLayout, QObject *parent = 0); explicit KitModel(QBoxLayout *parentLayout, QObject *parent = 0);
Kit *kit(const QModelIndex &); Kit *kit(const QModelIndex &);
KitNode *kitNode(const QModelIndex &);
QModelIndex indexOf(Kit *k) const; QModelIndex indexOf(Kit *k) const;
void setDefaultKit(const QModelIndex &index); void setDefaultKit(const QModelIndex &index);
bool isDefaultKit(const QModelIndex &index); bool isDefaultKit(Kit *k) const;
ProjectExplorer::Internal::KitManagerConfigWidget *widget(const QModelIndex &); ProjectExplorer::Internal::KitManagerConfigWidget *widget(const QModelIndex &);
bool isDirty() const;
bool isDirty(Kit *k) const;
void apply(); void apply();
void markForRemoval(Kit *k); void markForRemoval(Kit *k);
@@ -80,15 +78,13 @@ public:
signals: signals:
void kitStateChanged(); void kitStateChanged();
private slots: private:
void addKit(ProjectExplorer::Kit *k); void addKit(ProjectExplorer::Kit *k);
void updateKit(ProjectExplorer::Kit *k); void updateKit(ProjectExplorer::Kit *k);
void removeKit(ProjectExplorer::Kit *k); void removeKit(ProjectExplorer::Kit *k);
void changeDefaultKit(); void changeDefaultKit();
void validateKitNames(); void validateKitNames();
private:
QModelIndex index(KitNode *, int column = 0) const;
KitNode *findWorkingCopy(Kit *k) const; KitNode *findWorkingCopy(Kit *k) const;
KitNode *createNode(Kit *k); KitNode *createNode(Kit *k);
void setDefaultNode(KitNode *node); void setDefaultNode(KitNode *node);

View File

@@ -93,7 +93,7 @@ QWidget *KitOptionsPage::widget()
verticalLayout->addLayout(horizontalLayout); verticalLayout->addLayout(horizontalLayout);
m_model = new Internal::KitModel(verticalLayout); m_model = new Internal::KitModel(verticalLayout);
connect(m_model, SIGNAL(kitStateChanged()), this, SLOT(updateState())); connect(m_model, &Internal::KitModel::kitStateChanged, this, &KitOptionsPage::updateState);
verticalLayout->setStretch(0, 1); verticalLayout->setStretch(0, 1);
verticalLayout->setStretch(1, 0); verticalLayout->setStretch(1, 0);
@@ -102,20 +102,20 @@ QWidget *KitOptionsPage::widget()
m_kitsView->expandAll(); m_kitsView->expandAll();
m_selectionModel = m_kitsView->selectionModel(); m_selectionModel = m_kitsView->selectionModel();
connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), connect(m_selectionModel, &QItemSelectionModel::selectionChanged,
this, SLOT(kitSelectionChanged())); this, &KitOptionsPage::kitSelectionChanged);
connect(KitManager::instance(), SIGNAL(kitAdded(ProjectExplorer::Kit*)), connect(KitManager::instance(), &KitManager::kitAdded,
this, SLOT(kitSelectionChanged())); this, &KitOptionsPage::kitSelectionChanged);
connect(KitManager::instance(), SIGNAL(kitRemoved(ProjectExplorer::Kit*)), connect(KitManager::instance(), &KitManager::kitRemoved,
this, SLOT(kitSelectionChanged())); this, &KitOptionsPage::kitSelectionChanged);
connect(KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)), connect(KitManager::instance(), &KitManager::kitUpdated,
this, SLOT(kitSelectionChanged())); this, &KitOptionsPage::kitSelectionChanged);
// Set up add menu: // Set up add menu:
connect(m_addButton, SIGNAL(clicked()), this, SLOT(addNewKit())); connect(m_addButton, &QAbstractButton::clicked, this, &KitOptionsPage::addNewKit);
connect(m_cloneButton, SIGNAL(clicked()), this, SLOT(cloneKit())); connect(m_cloneButton, &QAbstractButton::clicked, this, &KitOptionsPage::cloneKit);
connect(m_delButton, SIGNAL(clicked()), this, SLOT(removeKit())); connect(m_delButton, &QAbstractButton::clicked, this, &KitOptionsPage::removeKit);
connect(m_makeDefaultButton, SIGNAL(clicked()), this, SLOT(makeDefaultKit())); connect(m_makeDefaultButton, &QAbstractButton::clicked, this, &KitOptionsPage::makeDefaultKit);
updateState(); updateState();
@@ -148,7 +148,7 @@ void KitOptionsPage::finish()
delete m_configWidget; delete m_configWidget;
m_selectionModel = 0; // child of m_configWidget m_selectionModel = 0; // child of m_configWidget
m_kitsView = 0; // child of m_configWidget m_kitsView = 0; // child of m_configWidget
m_currentWidget = 0; // deleted by the model m_currentWidget = 0; // not owned
m_toShow = 0; m_toShow = 0;
} }
@@ -160,7 +160,7 @@ void KitOptionsPage::showKit(Kit *k)
void KitOptionsPage::kitSelectionChanged() void KitOptionsPage::kitSelectionChanged()
{ {
QModelIndex current = currentIndex(); QModelIndex current = currentIndex();
QWidget *newWidget = current.isValid() ? m_model->widget(current) : 0; QWidget *newWidget = m_model->widget(current);
if (newWidget == m_currentWidget) if (newWidget == m_currentWidget)
return; return;
@@ -187,9 +187,14 @@ void KitOptionsPage::addNewKit()
| QItemSelectionModel::Rows); | QItemSelectionModel::Rows);
} }
Kit *KitOptionsPage::currentKit() const
{
return m_model->kit(currentIndex());
}
void KitOptionsPage::cloneKit() void KitOptionsPage::cloneKit()
{ {
Kit *current = m_model->kit(currentIndex()); Kit *current = currentKit();
if (!current) if (!current)
return; return;
@@ -204,10 +209,8 @@ void KitOptionsPage::cloneKit()
void KitOptionsPage::removeKit() void KitOptionsPage::removeKit()
{ {
Kit *k = m_model->kit(currentIndex()); if (Kit *k = currentKit())
if (!k) m_model->markForRemoval(k);
return;
m_model->markForRemoval(k);
} }
void KitOptionsPage::makeDefaultKit() void KitOptionsPage::makeDefaultKit()
@@ -224,12 +227,11 @@ void KitOptionsPage::updateState()
bool canCopy = false; bool canCopy = false;
bool canDelete = false; bool canDelete = false;
bool canMakeDefault = false; bool canMakeDefault = false;
QModelIndex index = currentIndex();
Kit *k = m_model->kit(index); if (Kit *k = currentKit()) {
if (k) {
canCopy = true; canCopy = true;
canDelete = !k->isAutoDetected(); canDelete = !k->isAutoDetected();
canMakeDefault = !m_model->isDefaultKit(index); canMakeDefault = !m_model->isDefaultKit(k);
} }
m_cloneButton->setEnabled(canCopy); m_cloneButton->setEnabled(canCopy);

View File

@@ -66,7 +66,6 @@ public:
void finish(); void finish();
void showKit(Kit *k); void showKit(Kit *k);
private slots: private slots:
void kitSelectionChanged(); void kitSelectionChanged();
void addNewKit(); void addNewKit();
@@ -77,6 +76,7 @@ private slots:
private: private:
QModelIndex currentIndex() const; QModelIndex currentIndex() const;
Kit *currentKit() const;
QTreeView *m_kitsView; QTreeView *m_kitsView;
QPushButton *m_addButton; QPushButton *m_addButton;