From 90eb7c62611e130147ddb2577f06fe618eba0835 Mon Sep 17 00:00:00 2001 From: Lasse Holmstedt Date: Fri, 5 Mar 2010 11:11:05 +0100 Subject: Disable run controls if no qml file is selected Task-number: BAUHAUS-396 Reviewed-by: dt (cherry picked from commit cba54bf47db89ef1f1c0e595eaecf3e5490a85bf) --- src/plugins/projectexplorer/projectexplorer.cpp | 12 +++- src/plugins/projectexplorer/runconfiguration.h | 3 + .../qmlprojectrunconfiguration.cpp | 64 +++++++++++++++++++--- .../qmlprojectmanager/qmlprojectrunconfiguration.h | 21 +++++++ 4 files changed, 89 insertions(+), 11 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index f2d67e2bf5..470ad5cfbd 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1344,6 +1344,7 @@ void ProjectExplorerPlugin::setCurrent(Project *project, QString filePath, Node newContext = project->projectManager()->projectContext(); newLanguageID = project->projectManager()->projectLanguage(); } + core->removeAdditionalContext(oldContext); core->removeAdditionalContext(oldLanguageID); core->addAdditionalContext(newContext); @@ -1685,6 +1686,9 @@ void ProjectExplorerPlugin::startupProjectChanged() if (previousStartupProject) { disconnect(previousStartupProject, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), this, SLOT(updateRunActions())); + disconnect(previousStartupProject->activeTarget()->activeRunConfiguration(), + SIGNAL(isEnabledChanged(bool)), this, SLOT(updateRunActions())); + foreach (Target *t, previousStartupProject->targets()) disconnect(t, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), this, SLOT(updateActions())); @@ -1695,6 +1699,8 @@ void ProjectExplorerPlugin::startupProjectChanged() if (project) { connect(project, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), this, SLOT(updateRunActions())); + connect(previousStartupProject->activeTarget()->activeRunConfiguration(), SIGNAL(isEnabledChanged(bool)), + this, SLOT(updateRunActions())); foreach (Target *t, project->targets()) connect(t, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), this, SLOT(updateActions())); @@ -1726,8 +1732,10 @@ void ProjectExplorerPlugin::updateRunActions() return; } - bool canRun = findRunControlFactory(project->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::RUNMODE); - const bool canDebug = !d->m_debuggingRunControl && findRunControlFactory(project->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::DEBUGMODE); + bool canRun = findRunControlFactory(project->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::RUNMODE) + && project->activeTarget()->activeRunConfiguration()->isEnabled(); + const bool canDebug = !d->m_debuggingRunControl && findRunControlFactory(project->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::DEBUGMODE) + && project->activeTarget()->activeRunConfiguration()->isEnabled(); const bool building = d->m_buildManager->isBuilding(); d->m_runAction->setEnabled(canRun && !building); diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index a7b918210b..76b9c612a2 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -79,6 +79,9 @@ public: Target *target() const; +signals: + void isEnabledChanged(bool value); + protected: RunConfiguration(Target *parent, const QString &id); RunConfiguration(Target *parent, RunConfiguration *source); diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index e0a6e4ee13..a8c21398b9 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -32,6 +32,8 @@ #include "qmlprojectrunconfiguration.h" #include "qmlprojecttarget.h" +#include +#include #include #include #include @@ -51,7 +53,9 @@ namespace QmlProjectManager { QmlProjectRunConfiguration::QmlProjectRunConfiguration(Internal::QmlProjectTarget *parent) : ProjectExplorer::RunConfiguration(parent, QLatin1String(Constants::QML_RC_ID)), m_debugServerAddress("127.0.0.1"), - m_debugServerPort(Constants::QML_DEFAULT_DEBUG_SERVER_PORT) + m_debugServerPort(Constants::QML_DEFAULT_DEBUG_SERVER_PORT), + m_usingCurrentFile(false), + m_isEnabled(false) { ctor(); } @@ -67,8 +71,24 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Internal::QmlProjectTarge ctor(); } +bool QmlProjectRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *bc) const +{ + Q_UNUSED(bc); + + if (!QFile::exists(mainScript()) + || !Core::ICore::instance()->mimeDatabase()->findByFile(mainScript()).matchesType(QLatin1String("application/x-qml"))) + { + return false; + } + return true; +} + void QmlProjectRunConfiguration::ctor() { + Core::EditorManager *em = Core::EditorManager::instance(); + connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)), + this, SLOT(changeCurrentFile(Core::IEditor*))); + setDisplayName(tr("QML Viewer", "QMLRunConfiguration display name.")); // prepend creator/bin dir to search path (only useful for special creator-qml package) @@ -193,14 +213,10 @@ QWidget *QmlProjectRunConfiguration::configurationWidget() QString QmlProjectRunConfiguration::mainScript() const { - if (m_scriptFile.isEmpty() || m_scriptFile == tr("")) { - Core::EditorManager *editorManager = Core::ICore::instance()->editorManager(); - if (Core::IEditor *editor = editorManager->currentEditor()) { - return editor->file()->fileName(); - } - } + if (m_usingCurrentFile) + return m_currentFileFilename; - return qmlTarget()->qmlProject()->projectDir().absoluteFilePath(m_scriptFile); + return m_mainScriptFilename; } void QmlProjectRunConfiguration::onDebugServerAddressChanged() @@ -212,6 +228,15 @@ void QmlProjectRunConfiguration::onDebugServerAddressChanged() void QmlProjectRunConfiguration::setMainScript(const QString &scriptFile) { m_scriptFile = scriptFile; + + if (m_scriptFile.isEmpty() || m_scriptFile == CURRENT_FILE) { + m_usingCurrentFile = true; + changeCurrentFile(Core::EditorManager::instance()->currentEditor()); + } else { + m_usingCurrentFile = false; + m_mainScriptFilename = qmlTarget()->qmlProject()->projectDir().absoluteFilePath(scriptFile); + setEnabled(true); + } } void QmlProjectRunConfiguration::onViewerChanged() @@ -250,11 +275,32 @@ bool QmlProjectRunConfiguration::fromMap(const QVariantMap &map) { m_qmlViewerCustomPath = map.value(QLatin1String(Constants::QML_VIEWER_KEY)).toString(); m_qmlViewerArgs = map.value(QLatin1String(Constants::QML_VIEWER_ARGUMENTS_KEY)).toString(); - m_scriptFile = map.value(QLatin1String(Constants::QML_MAINSCRIPT_KEY), tr("")).toString(); + m_scriptFile = map.value(QLatin1String(Constants::QML_MAINSCRIPT_KEY), CURRENT_FILE).toString(); m_debugServerPort = map.value(QLatin1String(Constants::QML_DEBUG_SERVER_PORT_KEY), Constants::QML_DEFAULT_DEBUG_SERVER_PORT).toUInt(); m_debugServerAddress = map.value(QLatin1String(Constants::QML_DEBUG_SERVER_ADDRESS_KEY), QLatin1String("127.0.0.1")).toString(); + setMainScript(m_scriptFile); return RunConfiguration::fromMap(map); } +void QmlProjectRunConfiguration::changeCurrentFile(Core::IEditor *editor) +{ + if (m_usingCurrentFile) { + bool enable = false; + if (editor) { + m_currentFileFilename = editor->file()->fileName(); + if (Core::ICore::instance()->mimeDatabase()->findByFile(mainScript()).matchesType(QLatin1String("application/x-qml"))) + enable = true; + } + + setEnabled(enable); + } +} + +void QmlProjectRunConfiguration::setEnabled(bool value) +{ + m_isEnabled = value; + emit isEnabledChanged(m_isEnabled); +} + } // namespace QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h index 89db90b4e2..76efd3147e 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h @@ -33,13 +33,20 @@ #include "qmlprojectmanager_global.h" #include +namespace Core { + class IEditor; +} + namespace QmlProjectManager { namespace Internal { class QmlProjectTarget; class QmlProjectRunConfigurationFactory; + } +const char * const CURRENT_FILE = QT_TRANSLATE_NOOP("QmlManager", ""); + class QMLPROJECTMANAGER_EXPORT QmlProjectRunConfiguration : public ProjectExplorer::RunConfiguration { Q_OBJECT @@ -51,6 +58,8 @@ public: Internal::QmlProjectTarget *qmlTarget() const; + bool isEnabled(ProjectExplorer::BuildConfiguration *bc) const; + QString viewerPath() const; QStringList viewerArguments() const; QString workingDirectory() const; @@ -63,8 +72,10 @@ public: QVariantMap toMap() const; private slots: + void changeCurrentFile(Core::IEditor*); QString mainScript() const; void setMainScript(const QString &scriptFile); + void onViewerChanged(); void onViewerArgsChanged(); void onDebugServerAddressChanged(); @@ -73,16 +84,26 @@ private slots: protected: QmlProjectRunConfiguration(Internal::QmlProjectTarget *parent, QmlProjectRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); + void setEnabled(bool value); private: void ctor(); + // absolute path to current file (if being used) + QString m_currentFileFilename; + // absolute path to selected main script (if being used) + QString m_mainScriptFilename; + QString m_scriptFile; QString m_qmlViewerCustomPath; QString m_qmlViewerDefaultPath; QString m_qmlViewerArgs; QString m_debugServerAddress; uint m_debugServerPort; + + bool m_usingCurrentFile; + bool m_isEnabled; + }; } // namespace QmlProjectManager -- cgit v1.2.3