diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index c24a2cca90cac18cf2410c5ea76768a0cd31457a..5b6521715bfdc27f4218c976dd439bf45d77d8af 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -39,6 +39,7 @@ #include <coreplugin/editormanager/editormanager.h> #include <utils/synchronousprocess.h> +#include <utils/pathchooser.h> #include <QtCore/QtDebug> #include <QtCore/QDir> @@ -49,62 +50,10 @@ #include <QtGui/QFormLayout> #include <QtGui/QMainWindow> #include <QtGui/QComboBox> -#include <QtGui/QStringListModel> -#include <QtGui/QListWidget> -#include <QtGui/QPushButton> using namespace QmlProjectManager; using namespace QmlProjectManager::Internal; -namespace { - -/** - * An editable string list model. New strings can be added by editing the entry - * called "<new>", displayed at the end. - */ -class ListModel: public QStringListModel -{ -public: - ListModel(QObject *parent) - : QStringListModel(parent) {} - - virtual ~ListModel() {} - - virtual int rowCount(const QModelIndex &parent) const - { return 1 + QStringListModel::rowCount(parent); } - - virtual Qt::ItemFlags flags(const QModelIndex &index) const - { return QStringListModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; } - - virtual QModelIndex index(int row, int column, const QModelIndex &parent) const - { - if (row == stringList().size()) - return createIndex(row, column); - - return QStringListModel::index(row, column, parent); - } - - virtual QVariant data(const QModelIndex &index, int role) const - { - if (role == Qt::DisplayRole || role == Qt::EditRole) { - if (index.row() == stringList().size()) - return QCoreApplication::translate("QmlProject", "<new>"); - } - - return QStringListModel::data(index, role); - } - - virtual bool setData(const QModelIndex &index, const QVariant &value, int role) - { - if (role == Qt::EditRole && index.row() == stringList().size()) - insertRow(index.row(), QModelIndex()); - - return QStringListModel::setData(index, value, role); - } -}; - -} // end of anonymous namespace - //////////////////////////////////////////////////////////////////////////////////// // QmlProject //////////////////////////////////////////////////////////////////////////////////// @@ -120,9 +69,6 @@ QmlProject::QmlProject(Manager *manager, const QString &fileName) m_rootNode = new QmlProjectNode(this, m_file); m_manager->registerProject(this); - - QSharedPointer<QmlApplicationRunConfiguration> runConf(new QmlApplicationRunConfiguration(this)); - addRunConfiguration(runConf); } QmlProject::~QmlProject() @@ -254,7 +200,7 @@ QString QmlProject::buildDirectory(const QString &) const ProjectExplorer::BuildStepConfigWidget *QmlProject::createConfigWidget() { - return new QmlBuildSettingsWidget(this); + return 0; } QList<ProjectExplorer::BuildStepConfigWidget*> QmlProject::subConfigWidgets() @@ -291,6 +237,11 @@ void QmlProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader & { Project::restoreSettingsImpl(reader); + if (runConfigurations().isEmpty()) { + QSharedPointer<QmlRunConfiguration> runConf(new QmlRunConfiguration(this)); + addRunConfiguration(runConf); + } + refresh(Everything); } @@ -299,25 +250,6 @@ void QmlProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &wri Project::saveSettingsImpl(writer); } -//////////////////////////////////////////////////////////////////////////////////// -// QmlBuildSettingsWidget -//////////////////////////////////////////////////////////////////////////////////// - -QmlBuildSettingsWidget::QmlBuildSettingsWidget(QmlProject *project) - : m_project(project) -{ -} - -QmlBuildSettingsWidget::~QmlBuildSettingsWidget() -{ } - -QString QmlBuildSettingsWidget::displayName() const -{ return tr("QML Manager"); } - -void QmlBuildSettingsWidget::init(const QString &) -{ -} - //////////////////////////////////////////////////////////////////////////////////// // QmlProjectFile //////////////////////////////////////////////////////////////////////////////////// @@ -375,40 +307,42 @@ void QmlProjectFile::modified(ReloadBehavior *) { } -QmlApplicationRunConfiguration::QmlApplicationRunConfiguration(QmlProject *pro) +QmlRunConfiguration::QmlRunConfiguration(QmlProject *pro) : ProjectExplorer::ApplicationRunConfiguration(pro), - m_project(pro) + m_project(pro), + m_type(Constants::QMLRUNCONFIGURATION) { setName(tr("QML Viewer")); + + m_qmlViewer = Core::Utils::SynchronousProcess::locateBinary(QLatin1String("qmlviewer")); } -QmlApplicationRunConfiguration::~QmlApplicationRunConfiguration() +QmlRunConfiguration::~QmlRunConfiguration() { } -QString QmlApplicationRunConfiguration::type() const +QString QmlRunConfiguration::type() const { - return QLatin1String("QmlProject.QmlApplicationRunConfiguration"); + return m_type; } -QString QmlApplicationRunConfiguration::executable() const +QString QmlRunConfiguration::executable() const { - const QString executable = Core::Utils::SynchronousProcess::locateBinary(QLatin1String("qmlviewer")); - return executable; + return m_qmlViewer; } -QmlApplicationRunConfiguration::RunMode QmlApplicationRunConfiguration::runMode() const +QmlRunConfiguration::RunMode QmlRunConfiguration::runMode() const { return Gui; } -QString QmlApplicationRunConfiguration::workingDirectory() const +QString QmlRunConfiguration::workingDirectory() const { QFileInfo projectFile(m_project->file()->fileName()); return projectFile.filePath(); } -QStringList QmlApplicationRunConfiguration::commandLineArguments() const +QStringList QmlRunConfiguration::commandLineArguments() const { QStringList args; @@ -419,44 +353,60 @@ QStringList QmlApplicationRunConfiguration::commandLineArguments() const return args; } -ProjectExplorer::Environment QmlApplicationRunConfiguration::environment() const +ProjectExplorer::Environment QmlRunConfiguration::environment() const { return ProjectExplorer::Environment::systemEnvironment(); } -QString QmlApplicationRunConfiguration::dumperLibrary() const +QString QmlRunConfiguration::dumperLibrary() const { return QString(); } -QWidget *QmlApplicationRunConfiguration::configurationWidget() +QWidget *QmlRunConfiguration::configurationWidget() { QWidget *config = new QWidget; QFormLayout *form = new QFormLayout(config); QComboBox *combo = new QComboBox; - combo->addItem(tr("<Current File>")); - connect(combo, SIGNAL(activated(QString)), this, SLOT(setMainScript(QString))); QDir projectDir = m_project->projectDir(); QStringList files; + files.append(tr("<Current File>")); + + int currentIndex = -1; + foreach (const QString &fn, m_project->files()) { QFileInfo fileInfo(fn); if (fileInfo.suffix() != QLatin1String("qml")) continue; - files.append(projectDir.relativeFilePath(fn)); + QString fileName = projectDir.relativeFilePath(fn); + if (fileName == m_scriptFile) + currentIndex = files.size(); + + files.append(fileName); } combo->addItems(files); + if (currentIndex != -1) + combo->setCurrentIndex(currentIndex); + + connect(combo, SIGNAL(activated(QString)), this, SLOT(setMainScript(QString))); + Core::Utils::PathChooser *qmlViewer = new Core::Utils::PathChooser; + qmlViewer->setExpectedKind(Core::Utils::PathChooser::Command); + qmlViewer->setPath(executable()); + connect(qmlViewer, SIGNAL(changed()), this, SLOT(onQmlViewerChanged())); + + form->addRow(tr("QML Viewer"), qmlViewer); form->addRow(tr("Main QML File:"), combo); return config; } -QString QmlApplicationRunConfiguration::mainScript() const +QString QmlRunConfiguration::mainScript() const { if (m_scriptFile.isEmpty() || m_scriptFile == tr("<Current File>")) { Core::EditorManager *editorManager = Core::ICore::instance()->editorManager(); @@ -468,17 +418,73 @@ QString QmlApplicationRunConfiguration::mainScript() const return m_project->projectDir().absoluteFilePath(m_scriptFile); } -void QmlApplicationRunConfiguration::setMainScript(const QString &scriptFile) +void QmlRunConfiguration::setMainScript(const QString &scriptFile) { m_scriptFile = scriptFile; } -void QmlApplicationRunConfiguration::save(ProjectExplorer::PersistentSettingsWriter &writer) const +void QmlRunConfiguration::onQmlViewerChanged() +{ + if (Core::Utils::PathChooser *chooser = qobject_cast<Core::Utils::PathChooser *>(sender())) { + m_qmlViewer = chooser->path(); + } +} + +void QmlRunConfiguration::save(ProjectExplorer::PersistentSettingsWriter &writer) const { ProjectExplorer::ApplicationRunConfiguration::save(writer); + + writer.saveValue(QLatin1String("qmlviewer"), m_qmlViewer); + writer.saveValue(QLatin1String("mainscript"), m_scriptFile); } -void QmlApplicationRunConfiguration::restore(const ProjectExplorer::PersistentSettingsReader &reader) +void QmlRunConfiguration::restore(const ProjectExplorer::PersistentSettingsReader &reader) { ProjectExplorer::ApplicationRunConfiguration::restore(reader); + + m_qmlViewer = reader.restoreValue(QLatin1String("qmlviewer")).toString(); + m_scriptFile = reader.restoreValue(QLatin1String("mainscript")).toString(); + + if (m_qmlViewer.isEmpty()) + m_qmlViewer = Core::Utils::SynchronousProcess::locateBinary(QLatin1String("qmlviewer")); + + if (m_scriptFile.isEmpty()) + m_scriptFile = tr("<Current File>"); +} + +QmlRunConfigurationFactory::QmlRunConfigurationFactory() + : m_type(Constants::QMLRUNCONFIGURATION) +{ +} + +QmlRunConfigurationFactory::~QmlRunConfigurationFactory() +{ +} + +bool QmlRunConfigurationFactory::canCreate(const QString &type) const +{ + if (type.startsWith(m_type)) + return true; + + return false; +} + +QStringList QmlRunConfigurationFactory::canCreate(ProjectExplorer::Project *) const +{ + return QStringList(); } + +QString QmlRunConfigurationFactory::nameForType(const QString &type) const +{ + return type; +} + +QSharedPointer<ProjectExplorer::RunConfiguration> QmlRunConfigurationFactory::create(ProjectExplorer::Project *project, + const QString &) +{ + QmlProject *pro = qobject_cast<QmlProject *>(project); + QSharedPointer<ProjectExplorer::RunConfiguration> rc(new QmlRunConfiguration(pro)); + return rc; +} + + diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index f8e867e904e7a4ab2fc132a088abe5dad7a2ba6f..9cf9b9f8687be288728ff973d02adc566350ca24 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -136,28 +136,12 @@ private: QString m_fileName; }; -class QmlBuildSettingsWidget : public ProjectExplorer::BuildStepConfigWidget +class QmlRunConfiguration : public ProjectExplorer::ApplicationRunConfiguration { Q_OBJECT - public: - QmlBuildSettingsWidget(QmlProject *project); - virtual ~QmlBuildSettingsWidget(); - - virtual QString displayName() const; - - virtual void init(const QString &buildConfiguration); - -private: - QmlProject *m_project; -}; - -class QmlApplicationRunConfiguration : public ProjectExplorer::ApplicationRunConfiguration -{ - Q_OBJECT -public: - QmlApplicationRunConfiguration(QmlProject *pro); - virtual ~QmlApplicationRunConfiguration(); + QmlRunConfiguration(QmlProject *pro); + virtual ~QmlRunConfiguration(); virtual QString type() const; virtual QString executable() const; @@ -173,6 +157,8 @@ public: private Q_SLOTS: void setMainScript(const QString &scriptFile); + void onQmlViewerChanged(); + private: QString mainScript() const; @@ -180,8 +166,35 @@ private: private: QmlProject *m_project; QString m_scriptFile; + QString m_qmlViewer; + QLatin1String m_type; }; +class QmlRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory +{ + Q_OBJECT + +public: + QmlRunConfigurationFactory(); + virtual ~QmlRunConfigurationFactory(); + + // used to recreate the runConfigurations when restoring settings + virtual bool canCreate(const QString &type) const; + + // used to show the list of possible additons to a project, returns a list of types + virtual QStringList canCreate(ProjectExplorer::Project *pro) const; + + // used to translate the types to names to display to the user + virtual QString nameForType(const QString &type) const; + + virtual QSharedPointer<ProjectExplorer::RunConfiguration> create(ProjectExplorer::Project *project, + const QString &type); + +private: + QLatin1String m_type; +}; + + } // namespace Internal } // namespace QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlprojectconstants.h b/src/plugins/qmlprojectmanager/qmlprojectconstants.h index d459afc50d72276f857260e33c10a98dab2690de..273513a2ee9cd99434e868370a223614f115e6b6 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectconstants.h +++ b/src/plugins/qmlprojectmanager/qmlprojectconstants.h @@ -35,7 +35,8 @@ namespace Constants { const char *const PROJECTCONTEXT = "QmlProject.ProjectContext"; const char *const QMLMIMETYPE = "text/x-qml-project"; // ### FIXME -const char *const MAKESTEP = "QmlProjectManager.MakeStep"; + +const char *const QMLRUNCONFIGURATION = "QmlProject.QmlApplicationRunConfiguration"; // contexts const char *const C_FILESEDITOR = ".files Editor"; diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp index 1f4b0cbc001f8f77f7b036e264384bcfa6334b53..4187f520e0db9cd4e80b30675b21e2312aa1e020 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp @@ -32,6 +32,7 @@ #include "qmlprojectwizard.h" #include "qmlprojectconstants.h" #include "qmlprojectfileseditor.h" +#include "qmlproject.h" #include <coreplugin/icore.h> #include <coreplugin/mimedatabase.h> @@ -75,6 +76,7 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage) addObject(m_projectFilesEditorFactory); addAutoReleasedObject(manager); + addAutoReleasedObject(new QmlRunConfigurationFactory); addAutoReleasedObject(new QmlProjectWizard); return true;