diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2016-07-12 13:56:52 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2016-07-14 15:33:52 +0000 |
commit | d4624b92970ebe216f1f8fb6da4c7861acfd19df (patch) | |
tree | d3eae781865ec6936449fe2048f520ebdc482299 /src/plugins/projectexplorer/toolchainoptionspage.cpp | |
parent | ca04c4c264220c3a42acb7dca20b5c7765faf4f5 (diff) |
ToolChainOptionsPage: Handle toolchain languages
Properly display toolchain languages in the tree view of the
tool chains options page.
Change-Id: I27cb42cd2c5bf0cd7be8da921b94d8da10110841
Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
Diffstat (limited to 'src/plugins/projectexplorer/toolchainoptionspage.cpp')
-rw-r--r-- | src/plugins/projectexplorer/toolchainoptionspage.cpp | 76 |
1 files changed, 53 insertions, 23 deletions
diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 190d2f52b4..b9ec5bca34 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -114,15 +114,26 @@ public: [](ToolChainFactory *factory) { return factory->canCreate();}); m_model.setHeader({ ToolChainOptionsPage::tr("Name"), ToolChainOptionsPage::tr("Type") }); - m_autoRoot = new StaticTreeItem(ToolChainOptionsPage::tr("Auto-detected")); - m_manualRoot = new StaticTreeItem(ToolChainOptionsPage::tr("Manual")); - m_model.rootItem()->appendChild(m_autoRoot); - m_model.rootItem()->appendChild(m_manualRoot); - foreach (ToolChain *tc, ToolChainManager::toolChains()) { - TreeItem *parent = tc->isAutoDetected() ? m_autoRoot : m_manualRoot; - parent->appendChild(new ToolChainTreeItem(tc, false)); + auto autoRoot = new StaticTreeItem(ToolChainOptionsPage::tr("Auto-detected")); + auto manualRoot = new StaticTreeItem(ToolChainOptionsPage::tr("Manual")); + + foreach (const ToolChain::Language l, ToolChain::allLanguages()) { + const QString dn = ToolChain::languageDisplayName(l); + auto autoNode = new StaticTreeItem(dn); + auto manualNode = new StaticTreeItem(dn); + + autoRoot->appendChild(autoNode); + manualRoot->appendChild(manualNode); + + m_languageMap.insert(l, qMakePair(autoNode, manualNode)); } + m_model.rootItem()->appendChild(autoRoot); + m_model.rootItem()->appendChild(manualRoot); + + foreach (ToolChain *tc, ToolChainManager::toolChains()) + insertToolChain(tc); + m_toolChainView = new QTreeView(this); m_toolChainView->setUniformRowHeights(true); m_toolChainView->setSelectionMode(QAbstractItemView::SingleSelection); @@ -192,9 +203,12 @@ public: ToolChainTreeItem *currentTreeItem(); void markForRemoval(ToolChainTreeItem *item); + ToolChainTreeItem *insertToolChain(ProjectExplorer::ToolChain *tc, bool changed = false); // Insert directly into model void addToolChain(ProjectExplorer::ToolChain *); void removeToolChain(ProjectExplorer::ToolChain *); + StaticTreeItem *parentForToolChain(ToolChain *tc); + void apply(); public: @@ -209,6 +223,8 @@ public: TreeItem *m_autoRoot; TreeItem *m_manualRoot; + QHash<ToolChain::Language, QPair<StaticTreeItem *, StaticTreeItem *>> m_languageMap; + QList<ToolChainTreeItem *> m_toAddList; QList<ToolChainTreeItem *> m_toRemoveList; }; @@ -226,6 +242,14 @@ void ToolChainOptionsWidget::markForRemoval(ToolChainTreeItem *item) } } +ToolChainTreeItem *ToolChainOptionsWidget::insertToolChain(ToolChain *tc, bool changed) +{ + StaticTreeItem *parent = parentForToolChain(tc); + auto item = new ToolChainTreeItem(tc, changed); + parent->appendChild(item); + return item; +} + void ToolChainOptionsWidget::addToolChain(ToolChain *tc) { foreach (ToolChainTreeItem *n, m_toAddList) { @@ -236,8 +260,7 @@ void ToolChainOptionsWidget::addToolChain(ToolChain *tc) } } - TreeItem *parent = m_model.rootItem()->childAt(tc->isAutoDetected() ? 0 : 1); - parent->appendChild(new ToolChainTreeItem(tc, false)); + insertToolChain(tc); updateState(); } @@ -252,14 +275,21 @@ void ToolChainOptionsWidget::removeToolChain(ToolChain *tc) } } - auto item = m_model.findSecondLevelItem([tc](ToolChainTreeItem *item) { - return tc->isAutoDetected() && item->toolChain == tc; + StaticTreeItem *parent = parentForToolChain(tc); + auto item = parent->findFirstLevelChild<ToolChainTreeItem *>([tc](ToolChainTreeItem *item) { + return item->toolChain == tc; }); m_model.destroyItem(item); updateState(); } +StaticTreeItem *ToolChainOptionsWidget::parentForToolChain(ToolChain *tc) +{ + QPair<StaticTreeItem *, StaticTreeItem *> nodes = m_languageMap.value(tc->language()); + return tc->isAutoDetected() ? nodes.first : nodes.second; +} + void ToolChainOptionsWidget::toolChainSelectionChanged() { ToolChainTreeItem *item = currentTreeItem(); @@ -284,15 +314,17 @@ void ToolChainOptionsWidget::apply() Q_ASSERT(m_toRemoveList.isEmpty()); // Update tool chains: - m_model.forSecondLevelItems([this](ToolChainTreeItem *item) { - if (item->parent() == m_manualRoot && item->changed) { - Q_ASSERT(item->toolChain); - if (item->widget) - item->widget->apply(); - item->changed = false; - item->update(); + foreach (ToolChain::Language l, m_languageMap.keys()) { + StaticTreeItem *parent = m_languageMap.value(l).second; + foreach (TreeItem *item, parent->children()) { + auto tcItem = static_cast<ToolChainTreeItem *>(item); + Q_ASSERT(tcItem->toolChain); + if (tcItem->widget) + tcItem->widget->apply(); + tcItem->changed = false; + tcItem->update(); } - }); + } // Add new (and already updated) tool chains QStringList removedTcs; @@ -344,11 +376,9 @@ void ToolChainOptionsWidget::createToolChain(ToolChainFactory *factory) if (!tc) return; - auto item = new ToolChainTreeItem(tc, true); + auto item = insertToolChain(tc, true); m_toAddList.append(item); - m_manualRoot->appendChild(item); - m_toolChainView->setCurrentIndex(m_model.indexForItem(item)); } @@ -370,7 +400,7 @@ ToolChainTreeItem *ToolChainOptionsWidget::currentTreeItem() { QModelIndex index = m_toolChainView->currentIndex(); TreeItem *item = m_model.itemForIndex(index); - return (item && item->level() == 2) ? static_cast<ToolChainTreeItem *>(item) : nullptr; + return (item && item->level() == 3) ? static_cast<ToolChainTreeItem *>(item) : nullptr; } // -------------------------------------------------------------------------- |