From 0b55b71633637aa515511971394ffb9284f7d05f Mon Sep 17 00:00:00 2001 From: Tobias Hunger <tobias.hunger@nokia.com> Date: Tue, 22 Jun 2010 17:20:12 +0200 Subject: [PATCH] Allow for users to disable shadowbuilding * Doubleclicking the directory in the targetsetuppage now switches between shadowbuilding (default) and in source building. Not very obvious, but then we do want to encourage people to use shadowbuilding. Task-number: QTCREATORBUG-1668 --- .../qt4projectmanager/wizards/qtwizard.cpp | 1 - .../wizards/targetsetuppage.cpp | 125 +++++++++++------- .../wizards/targetsetuppage.h | 5 +- 3 files changed, 81 insertions(+), 50 deletions(-) diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp index 65954e9394e..f4c38458a22 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp @@ -240,7 +240,6 @@ int BaseQt4ProjectWizardDialog::addTargetSetupPage(QSet<QString> targets, bool m if (!targets.isEmpty()) infos = TargetSetupPage::filterImportInfos(targets, infos); m_targetSetupPage->setImportDirectoryBrowsingEnabled(false); - m_targetSetupPage->setShowLocationInformation(false); m_targetSetupPage->setPreferMobile(mobile); if (infos.count() <= 1) diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index e4655964a55..b93e2eb85c2 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -49,6 +49,14 @@ using namespace Qt4ProjectManager::Internal; +namespace { +enum Columns { + NAME_COLUMN = 0, + STATUS_COLUMN, + DIRECTORY_COLUMN +}; +} // namespace + TargetSetupPage::TargetSetupPage(QWidget *parent) : QWizardPage(parent), m_preferMobile(false), @@ -60,6 +68,8 @@ TargetSetupPage::TargetSetupPage(QWidget *parent) : connect(m_ui->importButton, SIGNAL(clicked()), this, SLOT(addShadowBuildLocation())); + connect(m_ui->versionTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), + this, SLOT(handleDoubleClicks(QTreeWidgetItem*,int))); } TargetSetupPage::~TargetSetupPage() @@ -121,10 +131,10 @@ void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos) foreach (const QString &t, targets) { QTreeWidgetItem *targetItem = new QTreeWidgetItem(m_ui->versionTree); const QString targetName = factory.displayNameForId(t); - targetItem->setText(0, targetName); - targetItem->setToolTip(0, targetName); + targetItem->setText(NAME_COLUMN, targetName); + targetItem->setToolTip(NAME_COLUMN, targetName); targetItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - targetItem->setData(0, Qt::UserRole, t); + targetItem->setData(NAME_COLUMN, Qt::UserRole, t); targetItem->setExpanded(true); int pos = -1; @@ -134,21 +144,8 @@ void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos) if (!i.version->supportsTargetId(t)) continue; QTreeWidgetItem *versionItem = new QTreeWidgetItem(targetItem); - QPair<QIcon, QString> issues = reportIssues(i.version); - - QString toolTip = QLatin1String("<nobr>"); - toolTip = toolTip.append(i.version->displayName()); - toolTip.append(tr("<br>using %1", "%1: qmake used (incl. full path)"). - arg(QDir::toNativeSeparators(i.version->qmakeCommand()))); - if (!issues.second.isEmpty()) - toolTip.append(QString::fromLatin1("<br><br>%1").arg(issues.second)); - - // Column 0: - versionItem->setToolTip(0, toolTip); - versionItem->setIcon(0, issues.first); - versionItem->setText(0, i.version->displayName()); - versionItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - versionItem->setData(0, Qt::UserRole, pos); + updateVersionItem(versionItem, pos); + // Prefer imports to creating new builds, but precheck any // Qt that exists (if there is no import with that version) bool shouldCheck = true; @@ -160,29 +157,11 @@ void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos) } } } + shouldCheck = shouldCheck && (m_preferMobile == i.version->supportsMobileTarget()); shouldCheck = shouldCheck || i.isExistingBuild; // always check imports shouldCheck = shouldCheck || m_infos.count() == 1; // always check only option - versionItem->setCheckState(0, shouldCheck ? Qt::Checked : Qt::Unchecked); - - // Column 1 (status): - const QString status = i.isExistingBuild ? tr("Import", "Is this an import of an existing build or a new one?") : - tr("New", "Is this an import of an existing build or a new one?"); - versionItem->setText(1, status); - versionItem->setToolTip(1, status); - - // Column 2 (directory): - QString dir; - if (i.directory.isEmpty()) { - if (i.version->supportsShadowBuilds()) - dir = QDir::toNativeSeparators(Qt4Target::defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(m_proFilePath), t)); - else - dir = QDir::toNativeSeparators(Qt4Project::projectDirectory(m_proFilePath)); - } else { - dir = QDir::toNativeSeparators(i.directory); - } - versionItem->setText(2, dir); - versionItem->setToolTip(2, dir); + versionItem->setCheckState(NAME_COLUMN, shouldCheck ? Qt::Checked : Qt::Unchecked); } } @@ -203,7 +182,7 @@ bool TargetSetupPage::hasSelection() const QTreeWidgetItem * current = m_ui->versionTree->topLevelItem(i); for (int j = 0; j < current->childCount(); ++j) { QTreeWidgetItem * child = current->child(j); - if (child->checkState(0) == Qt::Checked) + if (child->checkState(NAME_COLUMN) == Qt::Checked) return true; } } @@ -214,11 +193,11 @@ bool TargetSetupPage::isTargetSelected(const QString &targetid) const { for (int i = 0; i < m_ui->versionTree->topLevelItemCount(); ++i) { QTreeWidgetItem * current = m_ui->versionTree->topLevelItem(i); - if (current->data(0, Qt::UserRole).toString() != targetid) + if (current->data(NAME_COLUMN, Qt::UserRole).toString() != targetid) continue; for (int j = 0; j < current->childCount(); ++j) { QTreeWidgetItem * child = current->child(j); - if (child->checkState(0) == Qt::Checked) + if (child->checkState(NAME_COLUMN) == Qt::Checked) return true; } } @@ -232,7 +211,7 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) for (int i = 0; i < m_ui->versionTree->topLevelItemCount(); ++i) { QTreeWidgetItem *current = m_ui->versionTree->topLevelItem(i); - QString targetId = current->data(0, Qt::UserRole).toString(); + QString targetId = current->data(NAME_COLUMN, Qt::UserRole).toString(); QList<BuildConfigurationInfo> targetInfos; for (int j = 0; j < current->childCount(); ++j) { @@ -240,7 +219,7 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) if (child->checkState(0) != Qt::Checked) continue; - ImportInfo &info = m_infos[child->data(0, Qt::UserRole).toInt()]; + ImportInfo &info = m_infos[child->data(NAME_COLUMN, Qt::UserRole).toInt()]; // Register temporary Qt version if (info.isTemporary) { @@ -298,11 +277,6 @@ void TargetSetupPage::setImportDirectoryBrowsingLocation(const QString &director m_defaultShadowBuildLocation = directory; } -void TargetSetupPage::setShowLocationInformation(bool location) -{ - m_ui->versionTree->setColumnCount(location ? 3 : 1); -} - void TargetSetupPage::setPreferMobile(bool mobile) { m_preferMobile = mobile; @@ -332,6 +306,7 @@ QList<TargetSetupPage::ImportInfo> TargetSetupPage::importInfosForKnownQtVersion ImportInfo info; info.isExistingBuild = false; info.isTemporary = false; + info.isShadowBuild = v->supportsShadowBuilds(); info.version = v; results.append(info); } @@ -376,6 +351,7 @@ TargetSetupPage::recursivelyCheckDirectoryForBuild(const QString &directory, con QtVersionManager * vm = QtVersionManager::instance(); TargetSetupPage::ImportInfo info; info.directory = directory; + info.isShadowBuild = true; // This also means we have a build in there // First get the qt version @@ -435,6 +411,17 @@ void TargetSetupPage::addShadowBuildLocation() setImportInfos(tmp); } +void TargetSetupPage::handleDoubleClicks(QTreeWidgetItem *item, int column) +{ + int idx = item->data(NAME_COLUMN, Qt::UserRole).toInt(); + if (column == DIRECTORY_COLUMN && item->parent()) { + if (m_infos[idx].isExistingBuild || !m_infos[idx].version->supportsShadowBuilds()) + return; + m_infos[idx].isShadowBuild = !m_infos[idx].isShadowBuild; + updateVersionItem(item, idx); + } +} + void TargetSetupPage::resetInfos() { m_ui->versionTree->clear(); @@ -478,3 +465,45 @@ QPair<QIcon, QString> TargetSetupPage::reportIssues(Qt4ProjectManager::QtVersion text = QLatin1String("<nobr>") + text; return qMakePair(icon, text); } + +void TargetSetupPage::updateVersionItem(QTreeWidgetItem *versionItem, int index) +{ + ImportInfo &info = m_infos[index]; + QPair<QIcon, QString> issues = reportIssues(info.version); + + QString toolTip = QLatin1String("<nobr>"); + toolTip = toolTip.append(info.version->displayName()); + toolTip.append(tr("<br>using %1", "%1: qmake used (incl. full path)"). + arg(QDir::toNativeSeparators(info.version->qmakeCommand()))); + if (!issues.second.isEmpty()) + toolTip.append(QString::fromLatin1("<br><br>%1").arg(issues.second)); + + // Column 0: + versionItem->setToolTip(NAME_COLUMN, toolTip); + versionItem->setIcon(NAME_COLUMN, issues.first); + versionItem->setText(NAME_COLUMN, info.version->displayName()); + versionItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + versionItem->setData(NAME_COLUMN, Qt::UserRole, index); + + // Column 1 (status): + const QString status = info.isExistingBuild ? + tr("Import", "Is this an import of an existing build or a new one?") : + tr("New", "Is this an import of an existing build or a new one?"); + versionItem->setText(STATUS_COLUMN, status); + versionItem->setToolTip(STATUS_COLUMN, status); + + // Column 2 (directory): + Q_ASSERT(versionItem->parent()); + QString target = versionItem->parent()->data(NAME_COLUMN, Qt::UserRole).toString(); + QString dir; + if (info.directory.isEmpty()) { + if (info.version->supportsShadowBuilds() && info.isShadowBuild) + dir = QDir::toNativeSeparators(Qt4Target::defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(m_proFilePath), target)); + else + dir = QDir::toNativeSeparators(Qt4Project::projectDirectory(m_proFilePath)); + } else { + dir = QDir::toNativeSeparators(info.directory); + } + versionItem->setText(DIRECTORY_COLUMN, dir); + versionItem->setToolTip(DIRECTORY_COLUMN, dir); +} diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h index 27985d76227..464c9399f99 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h @@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE class QLabel; class QPushButton; class QTreeWidget; +class QTreeWidgetItem; QT_END_NAMESPACE namespace Qt4ProjectManager { @@ -86,6 +87,7 @@ public: QStringList additionalArguments; QString directory; bool isExistingBuild; + bool isShadowBuild; }; explicit TargetSetupPage(QWidget* parent = 0); @@ -96,7 +98,6 @@ public: void setImportDirectoryBrowsingEnabled(bool browsing); void setImportDirectoryBrowsingLocation(const QString &directory); - void setShowLocationInformation(bool location); void setPreferMobile(bool mobile); static QList<ImportInfo> importInfosForKnownQtVersions(); @@ -118,10 +119,12 @@ public slots: private slots: void itemWasChanged(); void addShadowBuildLocation(); + void handleDoubleClicks(QTreeWidgetItem *, int); private: void resetInfos(); QPair<QIcon, QString> reportIssues(QtVersion *version); + void updateVersionItem(QTreeWidgetItem *, int); QList<ImportInfo> m_infos; bool m_preferMobile; -- GitLab