Commit e398225c authored by Kai Koehne's avatar Kai Koehne

QmlProject: Allow user to change process environment

Task-number: QTCREATORBUG-2600
parent b1ce0af3
...@@ -39,6 +39,9 @@ const char * const QML_VIEWER_ARGUMENTS_KEY = "QmlProjectManager.QmlRunConfigura ...@@ -39,6 +39,9 @@ const char * const QML_VIEWER_ARGUMENTS_KEY = "QmlProjectManager.QmlRunConfigura
const char * const QML_VIEWER_TARGET_ID = "QmlProjectManager.QmlTarget"; const char * const QML_VIEWER_TARGET_ID = "QmlProjectManager.QmlTarget";
const char * const QML_VIEWER_TARGET_DISPLAY_NAME = "QML Viewer"; const char * const QML_VIEWER_TARGET_DISPLAY_NAME = "QML Viewer";
const char * const QML_MAINSCRIPT_KEY = "QmlProjectManager.QmlRunConfiguration.MainScript"; const char * const QML_MAINSCRIPT_KEY = "QmlProjectManager.QmlRunConfiguration.MainScript";
const char * const USER_ENVIRONMENT_CHANGES_KEY("QmlProjectManager.QmlRunConfiguration.UserEnvironmentChanges");
const char * const BASE_ENVIRONMENT_BASE_KEY("QmlProjectManager.QmlRunConfiguration.BaseEnvironmentBase");
} // namespace Constants } // namespace Constants
} // namespace QmlProjectManager } // namespace QmlProjectManager
...@@ -57,7 +57,8 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(QmlProjectTarget *parent) ...@@ -57,7 +57,8 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(QmlProjectTarget *parent)
m_qtVersionId(-1), m_qtVersionId(-1),
m_projectTarget(parent), m_projectTarget(parent),
m_usingCurrentFile(true), m_usingCurrentFile(true),
m_isEnabled(false) m_isEnabled(false),
m_baseEnvironmentBase(BuildEnvironmentBase)
{ {
ctor(); ctor();
updateQtVersions(); updateQtVersions();
...@@ -68,7 +69,9 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(QmlProjectTarget *parent, ...@@ -68,7 +69,9 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(QmlProjectTarget *parent,
ProjectExplorer::RunConfiguration(parent, source), ProjectExplorer::RunConfiguration(parent, source),
m_qtVersionId(source->m_qtVersionId), m_qtVersionId(source->m_qtVersionId),
m_qmlViewerArgs(source->m_qmlViewerArgs), m_qmlViewerArgs(source->m_qmlViewerArgs),
m_projectTarget(parent) m_projectTarget(parent),
m_userEnvironmentChanges(source->m_userEnvironmentChanges),
m_baseEnvironmentBase(source->m_baseEnvironmentBase)
{ {
ctor(); ctor();
setMainScript(source->m_scriptFile); setMainScript(source->m_scriptFile);
...@@ -215,6 +218,13 @@ void QmlProjectRunConfiguration::setMainScript(const QString &scriptFile) ...@@ -215,6 +218,13 @@ void QmlProjectRunConfiguration::setMainScript(const QString &scriptFile)
} }
} }
Utils::Environment QmlProjectRunConfiguration::environment() const
{
Utils::Environment env = baseEnvironment();
env.modify(userEnvironmentChanges());
return env;
}
QVariantMap QmlProjectRunConfiguration::toMap() const QVariantMap QmlProjectRunConfiguration::toMap() const
{ {
QVariantMap map(ProjectExplorer::RunConfiguration::toMap()); QVariantMap map(ProjectExplorer::RunConfiguration::toMap());
...@@ -222,6 +232,10 @@ QVariantMap QmlProjectRunConfiguration::toMap() const ...@@ -222,6 +232,10 @@ QVariantMap QmlProjectRunConfiguration::toMap() const
map.insert(QLatin1String(Constants::QML_VIEWER_QT_KEY), m_qtVersionId); map.insert(QLatin1String(Constants::QML_VIEWER_QT_KEY), m_qtVersionId);
map.insert(QLatin1String(Constants::QML_VIEWER_ARGUMENTS_KEY), m_qmlViewerArgs); map.insert(QLatin1String(Constants::QML_VIEWER_ARGUMENTS_KEY), m_qmlViewerArgs);
map.insert(QLatin1String(Constants::QML_MAINSCRIPT_KEY), m_scriptFile); map.insert(QLatin1String(Constants::QML_MAINSCRIPT_KEY), m_scriptFile);
map.insert(QLatin1String(Constants::USER_ENVIRONMENT_CHANGES_KEY),
Utils::EnvironmentItem::toStringList(m_userEnvironmentChanges));
map.insert(QLatin1String(Constants::BASE_ENVIRONMENT_BASE_KEY),
static_cast<int>(m_baseEnvironmentBase));
return map; return map;
} }
...@@ -230,6 +244,14 @@ bool QmlProjectRunConfiguration::fromMap(const QVariantMap &map) ...@@ -230,6 +244,14 @@ bool QmlProjectRunConfiguration::fromMap(const QVariantMap &map)
setQtVersionId(map.value(QLatin1String(Constants::QML_VIEWER_QT_KEY), -1).toInt()); setQtVersionId(map.value(QLatin1String(Constants::QML_VIEWER_QT_KEY), -1).toInt());
m_qmlViewerArgs = map.value(QLatin1String(Constants::QML_VIEWER_ARGUMENTS_KEY)).toString(); m_qmlViewerArgs = map.value(QLatin1String(Constants::QML_VIEWER_ARGUMENTS_KEY)).toString();
m_scriptFile = map.value(QLatin1String(Constants::QML_MAINSCRIPT_KEY), M_CURRENT_FILE).toString(); m_scriptFile = map.value(QLatin1String(Constants::QML_MAINSCRIPT_KEY), M_CURRENT_FILE).toString();
m_userEnvironmentChanges = Utils::EnvironmentItem::fromStringList(
map.value(QLatin1String(Constants::USER_ENVIRONMENT_CHANGES_KEY)).toStringList());
m_baseEnvironmentBase
= static_cast<BaseEnvironmentBase>(
map.value(QLatin1String(Constants::BASE_ENVIRONMENT_BASE_KEY),
static_cast<int>(BuildEnvironmentBase)).toInt());
updateQtVersions(); updateQtVersions();
setMainScript(m_scriptFile); setMainScript(m_scriptFile);
...@@ -317,4 +339,48 @@ bool QmlProjectRunConfiguration::isValidVersion(Qt4ProjectManager::QtVersion *ve ...@@ -317,4 +339,48 @@ bool QmlProjectRunConfiguration::isValidVersion(Qt4ProjectManager::QtVersion *ve
return false; return false;
} }
Utils::Environment QmlProjectRunConfiguration::baseEnvironment() const
{
Utils::Environment env;
if (m_baseEnvironmentBase == QmlProjectRunConfiguration::CleanEnvironmentBase) {
// Nothing
} else if (m_baseEnvironmentBase == QmlProjectRunConfiguration::SystemEnvironmentBase) {
env = Utils::Environment::systemEnvironment();
} else if (m_baseEnvironmentBase == QmlProjectRunConfiguration::BuildEnvironmentBase) {
env = qtVersion()->qmlToolsEnvironment();
}
return env;
}
void QmlProjectRunConfiguration::setBaseEnvironmentBase(BaseEnvironmentBase env)
{
if (m_baseEnvironmentBase == env)
return;
m_baseEnvironmentBase = env;
if (m_configurationWidget)
m_configurationWidget.data()->baseEnvironmentChanged();
}
QmlProjectRunConfiguration::BaseEnvironmentBase
QmlProjectRunConfiguration::baseEnvironmentBase() const
{
return m_baseEnvironmentBase;
}
void QmlProjectRunConfiguration::setUserEnvironmentChanges(const QList<Utils::EnvironmentItem> &diff)
{
if (m_userEnvironmentChanges != diff) {
m_userEnvironmentChanges = diff;
if (m_configurationWidget)
m_configurationWidget.data()->userEnvironmentChangesChanged();
}
}
QList<Utils::EnvironmentItem> QmlProjectRunConfiguration::userEnvironmentChanges() const
{
return m_userEnvironmentChanges;
}
} // namespace QmlProjectManager } // namespace QmlProjectManager
...@@ -42,6 +42,11 @@ namespace Core { ...@@ -42,6 +42,11 @@ namespace Core {
class IEditor; class IEditor;
} }
namespace Utils {
class Environment;
class EnvironmentItem;
}
namespace Qt4ProjectManager { namespace Qt4ProjectManager {
class QtVersion; class QtVersion;
} }
...@@ -79,6 +84,8 @@ public: ...@@ -79,6 +84,8 @@ public:
QString mainScript() const; QString mainScript() const;
void setMainScript(const QString &scriptFile); void setMainScript(const QString &scriptFile);
Utils::Environment environment() const;
// RunConfiguration // RunConfiguration
bool isEnabled(ProjectExplorer::BuildConfiguration *bc) const; bool isEnabled(ProjectExplorer::BuildConfiguration *bc) const;
virtual QWidget *createConfigurationWidget(); virtual QWidget *createConfigurationWidget();
...@@ -103,6 +110,16 @@ private: ...@@ -103,6 +110,16 @@ private:
static bool isValidVersion(Qt4ProjectManager::QtVersion *version); static bool isValidVersion(Qt4ProjectManager::QtVersion *version);
void setQtVersionId(int id); void setQtVersionId(int id);
Utils::Environment baseEnvironment() const;
enum BaseEnvironmentBase { CleanEnvironmentBase = 0,
SystemEnvironmentBase = 1,
BuildEnvironmentBase = 2};
void setBaseEnvironmentBase(BaseEnvironmentBase env);
BaseEnvironmentBase baseEnvironmentBase() const;
void setUserEnvironmentChanges(const QList<Utils::EnvironmentItem> &diff);
QList<Utils::EnvironmentItem> userEnvironmentChanges() const;
// absolute path to current file (if being used) // absolute path to current file (if being used)
QString m_currentFileFilename; QString m_currentFileFilename;
// absolute path to selected main script (if being used) // absolute path to selected main script (if being used)
...@@ -117,6 +134,9 @@ private: ...@@ -117,6 +134,9 @@ private:
bool m_usingCurrentFile; bool m_usingCurrentFile;
bool m_isEnabled; bool m_isEnabled;
QList<Utils::EnvironmentItem> m_userEnvironmentChanges;
BaseEnvironmentBase m_baseEnvironmentBase;
}; };
} // namespace QmlProjectManager } // namespace QmlProjectManager
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "qmlproject.h" #include "qmlproject.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <projectexplorer/environmenteditmodel.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <utils/debuggerlanguagechooser.h> #include <utils/debuggerlanguagechooser.h>
#include <utils/detailswidget.h> #include <utils/detailswidget.h>
...@@ -58,6 +59,12 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun ...@@ -58,6 +59,12 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun
m_fileListCombo(0), m_fileListCombo(0),
m_fileListModel(new QStringListModel(this)) m_fileListModel(new QStringListModel(this))
{ {
QVBoxLayout *layout = new QVBoxLayout(this);
//
// Qt Version, Arguments
//
Utils::DetailsWidget *detailsWidget = new Utils::DetailsWidget(); Utils::DetailsWidget *detailsWidget = new Utils::DetailsWidget();
detailsWidget->setState(Utils::DetailsWidget::NoSummary); detailsWidget->setState(Utils::DetailsWidget::NoSummary);
...@@ -68,7 +75,6 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun ...@@ -68,7 +75,6 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun
m_fileListCombo = new QComboBox; m_fileListCombo = new QComboBox;
m_fileListCombo->setModel(m_fileListModel); m_fileListCombo->setModel(m_fileListModel);
updateFileComboBox();
connect(m_fileListCombo, SIGNAL(activated(QString)), this, SLOT(setMainScript(QString))); connect(m_fileListCombo, SIGNAL(activated(QString)), this, SLOT(setMainScript(QString)));
connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(fileListChanged()), connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(fileListChanged()),
...@@ -93,6 +99,16 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun ...@@ -93,6 +99,16 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun
form->addRow(tr("Qt version:"), qtVersionLayout); form->addRow(tr("Qt version:"), qtVersionLayout);
form->addRow(tr("Arguments:"), qmlViewerArgs); form->addRow(tr("Arguments:"), qmlViewerArgs);
form->addRow(tr("Main QML file:"), m_fileListCombo);
layout->addWidget(detailsWidget);
updateFileComboBox();
updateQtVersionComboBox();
//
// Debugging
//
QWidget *debuggerLabelWidget = new QWidget; QWidget *debuggerLabelWidget = new QWidget;
QVBoxLayout *debuggerLabelLayout = new QVBoxLayout(debuggerLabelWidget); QVBoxLayout *debuggerLabelLayout = new QVBoxLayout(debuggerLabelWidget);
...@@ -104,8 +120,6 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun ...@@ -104,8 +120,6 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun
debuggerLabelLayout->addStretch(10); debuggerLabelLayout->addStretch(10);
DebuggerLanguageChooser *debuggerLanguageChooser = new DebuggerLanguageChooser(formWidget); DebuggerLanguageChooser *debuggerLanguageChooser = new DebuggerLanguageChooser(formWidget);
form->addRow(tr("Main QML file:"), m_fileListCombo);
form->addRow(debuggerLabelWidget, debuggerLanguageChooser); form->addRow(debuggerLabelWidget, debuggerLanguageChooser);
debuggerLanguageChooser->setCppChecked(rc->useCppDebugger()); debuggerLanguageChooser->setCppChecked(rc->useCppDebugger());
...@@ -123,10 +137,45 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun ...@@ -123,10 +137,45 @@ QmlProjectRunConfigurationWidget::QmlProjectRunConfigurationWidget(QmlProjectRun
connect(qtVersions, SIGNAL(qtVersionsChanged(QList<int>)), connect(qtVersions, SIGNAL(qtVersionsChanged(QList<int>)),
this, SLOT(updateQtVersionComboBox())); this, SLOT(updateQtVersionComboBox()));
updateQtVersionComboBox(); //
// Environment
QVBoxLayout *layout = new QVBoxLayout(this); //
layout->addWidget(detailsWidget);
QLabel *environmentLabel = new QLabel(this);
environmentLabel->setText(tr("Run Environment"));
QFont f = environmentLabel->font();
f.setBold(true);
f.setPointSizeF(f.pointSizeF() *1.2);
environmentLabel->setFont(f);
layout->addWidget(environmentLabel);
QWidget *baseEnvironmentWidget = new QWidget;
QHBoxLayout *baseEnvironmentLayout = new QHBoxLayout(baseEnvironmentWidget);
baseEnvironmentLayout->setMargin(0);
QLabel *label = new QLabel(tr("Base environment for this runconfiguration:"), this);
baseEnvironmentLayout->addWidget(label);
m_baseEnvironmentComboBox = new QComboBox(this);
m_baseEnvironmentComboBox->addItems(QStringList()
<< tr("Clean Environment")
<< tr("System Environment")
<< tr("Build Environment"));
m_baseEnvironmentComboBox->setCurrentIndex(rc->baseEnvironmentBase());
connect(m_baseEnvironmentComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(baseEnvironmentSelected(int)));
baseEnvironmentLayout->addWidget(m_baseEnvironmentComboBox);
baseEnvironmentLayout->addStretch(10);
m_environmentWidget = new ProjectExplorer::EnvironmentWidget(this, baseEnvironmentWidget);
m_environmentWidget->setBaseEnvironment(rc->baseEnvironment());
m_environmentWidget->setBaseEnvironmentText(baseEnvironmentText());
m_environmentWidget->setUserChanges(rc->userEnvironmentChanges());
connect(m_environmentWidget, SIGNAL(userChangesChanged()),
this, SLOT(userChangesChanged()));
layout->addWidget(m_environmentWidget);
} }
static bool caseInsensitiveLessThan(const QString &s1, const QString &s2) static bool caseInsensitiveLessThan(const QString &s1, const QString &s2)
...@@ -228,6 +277,51 @@ void QmlProjectRunConfigurationWidget::updateQtVersionComboBox() ...@@ -228,6 +277,51 @@ void QmlProjectRunConfigurationWidget::updateQtVersionComboBox()
} }
} }
void QmlProjectRunConfigurationWidget::userChangesChanged()
{
m_runConfiguration->setUserEnvironmentChanges(m_environmentWidget->userChanges());
}
void QmlProjectRunConfigurationWidget::baseEnvironmentChanged()
{
// if (m_ignoreChange)
// return;
int index = QmlProjectRunConfiguration::BaseEnvironmentBase(
m_runConfiguration->baseEnvironmentBase());
m_baseEnvironmentComboBox->setCurrentIndex(index);
m_environmentWidget->setBaseEnvironment(m_runConfiguration->baseEnvironment());
m_environmentWidget->setBaseEnvironmentText(baseEnvironmentText());
}
void QmlProjectRunConfigurationWidget::userEnvironmentChangesChanged()
{
m_environmentWidget->setUserChanges(m_runConfiguration->userEnvironmentChanges());
}
void QmlProjectRunConfigurationWidget::baseEnvironmentSelected(int index)
{
// m_ignoreChange = true;
m_runConfiguration->setBaseEnvironmentBase(
QmlProjectRunConfiguration::BaseEnvironmentBase(index));
m_environmentWidget->setBaseEnvironment(m_runConfiguration->baseEnvironment());
m_environmentWidget->setBaseEnvironmentText(baseEnvironmentText());
// m_ignoreChange = false;
}
QString QmlProjectRunConfigurationWidget::baseEnvironmentText() const
{
if (m_runConfiguration->m_baseEnvironmentBase
== QmlProjectRunConfiguration::CleanEnvironmentBase) {
return tr("Clean Environment");
} else if (m_runConfiguration->m_baseEnvironmentBase
== QmlProjectRunConfiguration::SystemEnvironmentBase) {
return tr("System Environment");
} else {
return tr("Build Environment");
}
}
} // namespace Internal } // namespace Internal
} // namespace QmlProjectManager } // namespace QmlProjectManager
...@@ -35,6 +35,12 @@ ...@@ -35,6 +35,12 @@
QT_FORWARD_DECLARE_CLASS(QComboBox); QT_FORWARD_DECLARE_CLASS(QComboBox);
QT_FORWARD_DECLARE_CLASS(QStringListModel); QT_FORWARD_DECLARE_CLASS(QStringListModel);
namespace ProjectExplorer {
class EnvironmentWidget;
} // namespace Qt4ProjectManager
namespace QmlProjectManager { namespace QmlProjectManager {
class QmlProjectRunConfiguration; class QmlProjectRunConfiguration;
...@@ -51,6 +57,8 @@ public: ...@@ -51,6 +57,8 @@ public:
public slots: public slots:
void updateQtVersionComboBox(); void updateQtVersionComboBox();
void baseEnvironmentChanged();
void userEnvironmentChangesChanged();
private slots: private slots:
void updateFileComboBox(); void updateFileComboBox();
...@@ -62,14 +70,23 @@ private slots: ...@@ -62,14 +70,23 @@ private slots:
void useQmlDebuggerToggled(bool toggled); void useQmlDebuggerToggled(bool toggled);
void qmlDebugServerPortChanged(uint port); void qmlDebugServerPortChanged(uint port);
void userChangesChanged();
void baseEnvironmentSelected(int index);
void manageQtVersions(); void manageQtVersions();
private: private:
QString baseEnvironmentText() const;
QmlProjectRunConfiguration *m_runConfiguration; QmlProjectRunConfiguration *m_runConfiguration;
QComboBox *m_qtVersionComboBox; QComboBox *m_qtVersionComboBox;
QComboBox *m_fileListCombo; QComboBox *m_fileListCombo;
QStringListModel *m_fileListModel; QStringListModel *m_fileListModel;
ProjectExplorer::EnvironmentWidget *m_environmentWidget;
QComboBox *m_baseEnvironmentComboBox;
}; };
} // namespace Internal } // namespace Internal
......
...@@ -64,10 +64,7 @@ namespace Internal { ...@@ -64,10 +64,7 @@ namespace Internal {
QmlRunControl::QmlRunControl(QmlProjectRunConfiguration *runConfiguration, QString mode) QmlRunControl::QmlRunControl(QmlProjectRunConfiguration *runConfiguration, QString mode)
: RunControl(runConfiguration, mode) : RunControl(runConfiguration, mode)
{ {
if (Qt4ProjectManager::QtVersion *qtVersion = runConfiguration->qtVersion()) m_applicationLauncher.setEnvironment(runConfiguration->environment());
m_applicationLauncher.setEnvironment(qtVersion->qmlToolsEnvironment());
else
m_applicationLauncher.setEnvironment(Utils::Environment::systemEnvironment());
m_applicationLauncher.setWorkingDirectory(runConfiguration->workingDirectory()); m_applicationLauncher.setWorkingDirectory(runConfiguration->workingDirectory());
if (mode == ProjectExplorer::Constants::RUNMODE) { if (mode == ProjectExplorer::Constants::RUNMODE) {
...@@ -206,8 +203,7 @@ ProjectExplorer::RunControl *QmlRunControlFactory::createDebugRunControl(QmlProj ...@@ -206,8 +203,7 @@ ProjectExplorer::RunControl *QmlRunControlFactory::createDebugRunControl(QmlProj
Utils::QtcProcess::addArg(&params.processArgs, Utils::QtcProcess::addArg(&params.processArgs,
QLatin1String("-qmljsdebugger=port:") + QString::number(runConfig->qmlDebugServerPort())); QLatin1String("-qmljsdebugger=port:") + QString::number(runConfig->qmlDebugServerPort()));
params.workingDirectory = runConfig->workingDirectory(); params.workingDirectory = runConfig->workingDirectory();
if (Qt4ProjectManager::QtVersion *qtVersion = runConfig->qtVersion()) params.environment = runConfig->environment();
params.environment = qtVersion->qmlToolsEnvironment();
params.displayName = runConfig->displayName(); params.displayName = runConfig->displayName();
if (params.executable.isEmpty()) { if (params.executable.isEmpty()) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment