diff options
Diffstat (limited to 'src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp')
-rw-r--r-- | src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp new file mode 100644 index 0000000000..5efb108686 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp @@ -0,0 +1,257 @@ +/*************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** +** Non-Open Source Usage +** +** Licensees may use this file in accordance with the Qt Beta Version +** License Agreement, Agreement version 2.2 provided with the Software or, +** alternatively, in accordance with the terms contained in a written +** agreement between you and Nokia. +** +** GNU General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the packaging +** of this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt GPL Exception version +** 1.2, included in the file GPL_EXCEPTION.txt in this package. +** +***************************************************************************/ +#include "qt4buildconfigwidget.h" +#include "ui_qt4buildconfigwidget.h" +#include "qt4project.h" +#include "qt4projectmanager.h" +#include "qmakestep.h" +#include "makestep.h" + +#include <QtGui/QFileDialog> + +namespace { +bool debug = false; +} + +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; + +Qt4BuildConfigWidget::Qt4BuildConfigWidget(Qt4Project *project) + : BuildStepConfigWidget(), + m_pro(project) +{ + m_ui = new Ui::Qt4BuildConfigWidget(); + m_ui->setupUi(this); + m_ui->invalidQtWarningLabel->setVisible(false); + + connect(m_ui->nameLineEdit, SIGNAL(textEdited(QString)), + this, SLOT(changeConfigName(QString))); + + connect(m_ui->shadowBuildCheckBox, SIGNAL(clicked(bool)), + this, SLOT(shadowBuildCheckBoxClicked(bool))); + + connect(m_ui->shadowBuildButton, SIGNAL(clicked(bool)), + this, SLOT(shadowBuildButtonClicked())); + + connect(m_ui->shadowBuildLineEdit, SIGNAL(textEdited(QString)), + this, SLOT(shadowBuildLineEditTextChanged())); + + connect(m_ui->qtVersionComboBox, SIGNAL(currentIndexChanged(QString)), + this, SLOT(qtVersionComboBoxCurrentIndexChanged(QString))); + + connect(m_ui->importLabel, SIGNAL(linkActivated(QString)), + this, SLOT(importLabelClicked())); + + connect(m_pro->qt4ProjectManager()->versionManager(), SIGNAL(qtVersionsChanged()), + this, SLOT(setupQtVersionsComboBox())); + +} + +Qt4BuildConfigWidget::~Qt4BuildConfigWidget() +{ + delete m_ui; +} + +QString Qt4BuildConfigWidget::displayName() const +{ + return tr("General"); +} + +void Qt4BuildConfigWidget::init(const QString &buildConfiguration) +{ + if (debug) + qDebug() << "Qt4BuildConfigWidget::init()"; + + m_buildConfiguration = buildConfiguration; + + m_ui->nameLineEdit->setText(m_pro->displayNameFor(m_buildConfiguration)); + + setupQtVersionsComboBox(); + + bool shadowBuild = m_pro->value(buildConfiguration, "useShadowBuild").toBool(); + m_ui->shadowBuildCheckBox->setChecked(shadowBuild); + m_ui->shadowBuildLineEdit->setEnabled(shadowBuild); + m_ui->shadowBuildLineEdit->setText(m_pro->buildDirectory(buildConfiguration)); + shadowBuildLineEditTextChanged(); // Update the import label + m_ui->shadowBuildButton->setEnabled(shadowBuild); +} + +void Qt4BuildConfigWidget::changeConfigName(const QString &newName) +{ + m_pro->setDisplayNameFor(m_buildConfiguration, newName); +} + +void Qt4BuildConfigWidget::setupQtVersionsComboBox() +{ + if (m_buildConfiguration.isEmpty()) // not yet initialized + return; + + disconnect(m_ui->qtVersionComboBox, SIGNAL(currentIndexChanged(const QString &)), + this, SLOT(qtVersionComboBoxCurrentIndexChanged(const QString &))); + + m_ui->qtVersionComboBox->clear(); + m_ui->qtVersionComboBox->addItem(tr("Default Qt Version"), 0); + + if(m_pro->qtVersionId(m_buildConfiguration) == 0) { + m_ui->qtVersionComboBox->setCurrentIndex(0); + m_ui->invalidQtWarningLabel->setVisible(false); + } + // Add Qt Versions to the combo box + QtVersionManager *vm = m_pro->qt4ProjectManager()->versionManager(); + const QList<QtVersion *> &versions = vm->versions(); + for(int i=0; i<versions.size(); ++i) { + m_ui->qtVersionComboBox->addItem(versions.at(i)->name(), versions.at(i)->uniqueId()); + + if(versions.at(i)->uniqueId() == m_pro->qtVersionId(m_buildConfiguration)) { + m_ui->qtVersionComboBox->setCurrentIndex(i+1); + m_ui->invalidQtWarningLabel->setVisible(!versions.at(i)->isValid()); + } + } + + // And connect again + connect(m_ui->qtVersionComboBox, SIGNAL(currentIndexChanged(const QString &)), + this, SLOT(qtVersionComboBoxCurrentIndexChanged(const QString &))); +} + +void Qt4BuildConfigWidget::shadowBuildButtonClicked() +{ + QString initialDirectory = m_ui->shadowBuildLineEdit->text(); + if (initialDirectory.isEmpty()) + initialDirectory = QFileInfo(m_pro->file()->fileName()).absolutePath(); + + QString shadowBuildDirectory = + QFileDialog::getExistingDirectory(this, tr("Shadow Build Directory"), initialDirectory ); + + if (shadowBuildDirectory != QString::null) + m_ui->shadowBuildLineEdit->setText(shadowBuildDirectory); + shadowBuildLineEditTextChanged(); +} + +void Qt4BuildConfigWidget::shadowBuildCheckBoxClicked(bool checked) +{ + m_ui->shadowBuildLineEdit->setEnabled(checked); + m_ui->shadowBuildButton->setEnabled(checked); + bool b = m_ui->shadowBuildCheckBox->isChecked(); + m_pro->setValue(m_buildConfiguration, "useShadowBuild", b); + if (b) + m_pro->setValue(m_buildConfiguration, "buildDirectory", m_ui->shadowBuildLineEdit->text()); + else + m_pro->setValue(m_buildConfiguration, "buildDirectory", QVariant(QString::null)); +} + +void Qt4BuildConfigWidget::shadowBuildLineEditTextChanged() +{ + m_pro->setValue(m_buildConfiguration, "buildDirectory", m_ui->shadowBuildLineEdit->text()); + // if the directory already exists + // check if we have a build in there and + // offer to import it + m_ui->importLabel->setVisible(false); + if (m_ui->shadowBuildCheckBox->isChecked()) { + QString qtPath = m_pro->qt4ProjectManager()->versionManager()->findQtVersionFromMakefile(m_ui->shadowBuildLineEdit->text()); + if(!qtPath.isEmpty()) { + m_ui->importLabel->setVisible(true); + } + } + +// QFileInfo fi(m_ui->shadowBuildLineEdit->text()); +// if (fi.exists()) { +// m_ui->shadowBuildLineEdit->setStyleSheet(""); +// m_ui->shadowBuildLineEdit->setToolTip(""); +// } else { +// m_ui->shadowBuildLineEdit->setStyleSheet("background: red;"); +// m_ui->shadowBuildLineEdit->setToolTip(tr("Directory does not exist.")); +// } +} + +void Qt4BuildConfigWidget::importLabelClicked() +{ + if (m_ui->shadowBuildCheckBox->isChecked()) { + QString directory = m_ui->shadowBuildLineEdit->text(); + if (!directory.isEmpty()) { + QtVersionManager *vm = m_pro->qt4ProjectManager()->versionManager(); + QString qtPath = vm->findQtVersionFromMakefile(directory); + if (!qtPath.isEmpty()) { + QtVersion *version = vm->qtVersionForDirectory(qtPath); + if (!version) { + version = new QtVersion(QFileInfo(qtPath).baseName(), qtPath); + vm->addVersion(version); + } + QtVersion::QmakeBuildConfig qmakeBuildConfig = version->defaultBuildConfig(); + qmakeBuildConfig = vm->scanMakefileForQmakeConfig(directory, qmakeBuildConfig); + + // So we got all the information now apply it... + m_pro->setQtVersion(m_buildConfiguration, version->uniqueId()); + // Combo box will be updated at the end + + // Find qmakestep... + QMakeStep *qmakeStep = m_pro->qmakeStep(); + MakeStep *makeStep = m_pro->makeStep(); + + qmakeStep->setValue(m_buildConfiguration, "buildConfiguration", int(qmakeBuildConfig)); + // Adjust command line arguments, this is ugly as hell + // If we are switching to BuildAll we want "release" in there and no "debug" + // or "debug" in there and no "release" + // If we are switching to not BuildAl we want neither "release" nor "debug" in there + QStringList makeCmdArguments = makeStep->value(m_buildConfiguration, "makeargs").toStringList(); + bool debug = qmakeBuildConfig & QtVersion::DebugBuild; + if (qmakeBuildConfig & QtVersion::BuildAll) { + makeCmdArguments.removeAll(debug ? "release" : "debug"); + if (!makeCmdArguments.contains(debug ? "debug" : "release")) + makeCmdArguments.append(debug ? "debug" : "release"); + } else { + makeCmdArguments.removeAll("debug"); + makeCmdArguments.removeAll("remove"); + } + makeStep->setValue(m_buildConfiguration, "makeargs", makeCmdArguments); + } + } + } + setupQtVersionsComboBox(); +} + +void Qt4BuildConfigWidget::qtVersionComboBoxCurrentIndexChanged(const QString &) +{ + //Qt Version + int newQtVersion; + if (m_ui->qtVersionComboBox->currentIndex() == 0) { + newQtVersion = 0; + } else { + newQtVersion = m_ui->qtVersionComboBox->itemData(m_ui->qtVersionComboBox->currentIndex()).toInt(); + } + bool isValid = m_pro->qt4ProjectManager()->versionManager()->version(newQtVersion)->isValid(); + m_ui->invalidQtWarningLabel->setVisible(!isValid); + if(newQtVersion != m_pro->qtVersionId(m_buildConfiguration)) { + m_pro->setQtVersion(m_buildConfiguration, newQtVersion); + m_pro->update(); + } +} |