From c72043f57867c310bb0abeb7b2e49a2642b8acd2 Mon Sep 17 00:00:00 2001
From: Lasse Holmstedt <lasse.holmstedt@nokia.com>
Date: Tue, 13 Apr 2010 10:58:30 +0200
Subject: [PATCH] Sorting to QML project file selector, and update when files
 change

Task-number: BAUHAUS-548
Reviewed-by: kkoehne
---
 .../qmlprojectrunconfiguration.cpp            | 71 +++++++++++--------
 .../qmlprojectrunconfiguration.h              | 10 +++
 2 files changed, 52 insertions(+), 29 deletions(-)

diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
index 1ff5925ffd5..89bfd302a93 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
@@ -31,6 +31,7 @@
 #include "qmlprojectmanagerconstants.h"
 #include "qmlprojectrunconfiguration.h"
 #include "qmlprojecttarget.h"
+#include "projectexplorer/projectexplorer.h"
 
 #include <coreplugin/mimedatabase.h>
 #include <projectexplorer/buildconfiguration.h>
@@ -46,6 +47,7 @@
 #include <QCoreApplication>
 #include <QLineEdit>
 #include <QSpinBox>
+#include <QStringListModel>
 #include <QDebug>
 
 namespace QmlProjectManager {
@@ -54,6 +56,7 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Internal::QmlProjectTarge
     ProjectExplorer::RunConfiguration(parent, QLatin1String(Constants::QML_RC_ID)),
     m_debugServerAddress("127.0.0.1"),
     m_debugServerPort(Constants::QML_DEFAULT_DEBUG_SERVER_PORT),
+    m_fileListModel(new QStringListModel(this)),
     m_projectTarget(parent),
     m_usingCurrentFile(true),
     m_isEnabled(false)
@@ -161,35 +164,12 @@ QWidget *QmlProjectRunConfiguration::configurationWidget()
     QWidget *config = new QWidget;
     QFormLayout *form = new QFormLayout(config);
 
-    QComboBox *combo = new QComboBox;
+    m_fileListCombo = new QComboBox;
+    m_fileListCombo.data()->setModel(m_fileListModel);
+    updateFileComboBox();
 
-    QDir projectDir = qmlTarget()->qmlProject()->projectDir();
-    QStringList files;
-
-    files.append(CURRENT_FILE);
-
-    int currentIndex = -1;
-
-    QStringList sortedFiles = qmlTarget()->qmlProject()->files();
-    qStableSort(sortedFiles.begin(), sortedFiles.end(), caseInsensitiveLessThan);
-
-    foreach (const QString &fn, sortedFiles) {
-        QFileInfo fileInfo(fn);
-        if (fileInfo.suffix() != QLatin1String("qml"))
-            continue;
-
-        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)));
+    connect(m_fileListCombo.data(), SIGNAL(activated(QString)), this, SLOT(setMainScript(QString)));
+    connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(fileListChanged()), SLOT(updateFileComboBox()));
 
     Utils::PathChooser *qmlViewer = new Utils::PathChooser;
     qmlViewer->setExpectedKind(Utils::PathChooser::Command);
@@ -212,13 +192,14 @@ QWidget *QmlProjectRunConfiguration::configurationWidget()
 
     form->addRow(tr("QML Runtime"), qmlViewer);
     form->addRow(tr("QML Runtime arguments:"), qmlViewerArgs);
-    form->addRow(tr("Main QML File:"), combo);
+    form->addRow(tr("Main QML File:"), m_fileListCombo.data());
     form->addRow(tr("Debugging Address:"), debugServer);
     form->addRow(tr("Debugging Port:"), debugPort);
 
     return config;
 }
 
+
 QString QmlProjectRunConfiguration::mainScript() const
 {
     if (m_usingCurrentFile)
@@ -227,6 +208,38 @@ QString QmlProjectRunConfiguration::mainScript() const
     return m_mainScriptFilename;
 }
 
+void QmlProjectRunConfiguration::updateFileComboBox()
+{
+    if (m_fileListCombo.isNull())
+        return;
+
+    QDir projectDir = qmlTarget()->qmlProject()->projectDir();
+    QStringList files;
+
+    files.append(CURRENT_FILE);
+    int currentIndex = -1;
+    QStringList sortedFiles = qmlTarget()->qmlProject()->files();
+    qStableSort(sortedFiles.begin(), sortedFiles.end(), caseInsensitiveLessThan);
+
+    foreach (const QString &fn, sortedFiles) {
+        QFileInfo fileInfo(fn);
+        if (fileInfo.suffix() != QLatin1String("qml"))
+            continue;
+
+        QString fileName = projectDir.relativeFilePath(fn);
+        if (fileName == m_scriptFile)
+            currentIndex = files.size();
+
+        files.append(fileName);
+    }
+    m_fileListModel->setStringList(files);
+
+    if (currentIndex != -1)
+        m_fileListCombo.data()->setCurrentIndex(currentIndex);
+    else
+        m_fileListCombo.data()->setCurrentIndex(0);
+}
+
 void QmlProjectRunConfiguration::onDebugServerAddressChanged()
 {
     if (QLineEdit *lineEdit = qobject_cast<QLineEdit*>(sender()))
diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h
index 9bf631d05d2..d61d972fb97 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h
@@ -32,6 +32,10 @@
 
 #include "qmlprojectmanager_global.h"
 #include <projectexplorer/runconfiguration.h>
+#include <QWeakPointer>
+#include <QComboBox>
+
+QT_FORWARD_DECLARE_CLASS(QStringListModel);
 
 namespace Core {
     class IEditor;
@@ -79,12 +83,14 @@ private slots:
 
     QString mainScript() const;
     void setMainScript(const QString &scriptFile);
+    void updateFileComboBox();
 
     void onViewerChanged();
     void onViewerArgsChanged();
     void onDebugServerAddressChanged();
     void onDebugServerPortChanged();
 
+
 protected:
     QmlProjectRunConfiguration(Internal::QmlProjectTarget *parent, QmlProjectRunConfiguration *source);
     virtual bool fromMap(const QVariantMap &map);
@@ -104,6 +110,10 @@ private:
     QString m_qmlViewerArgs;
     QString m_debugServerAddress;
     uint m_debugServerPort;
+    QStringListModel *m_fileListModel;
+    // weakpointer is used to make sure we don't try to manipulate
+    // widget which was deleted already, as can be the case here.
+    QWeakPointer<QComboBox> m_fileListCombo;
 
     Internal::QmlProjectTarget *m_projectTarget;
 
-- 
GitLab