OSDN Git Service

New File Dialog: Choose right default project for adding
authorDaniel Teske <daniel.teske@nokia.com>
Mon, 2 Apr 2012 12:55:56 +0000 (14:55 +0200)
committerDaniel Teske <daniel.teske@nokia.com>
Tue, 3 Apr 2012 12:11:47 +0000 (14:11 +0200)
So far we used a heuristic that prefers .pro files in the same directory
as the new files. That fails if there are multiple .pro files in the
same directory. So instead introduce a mechanism to pass extra data
through the wizard.

Task-number: QTCREATORBUG-7157
Change-Id: I615f7292e16a0a6cb1e84f090016879f1038409f
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Eike Ziller <eike.ziller@nokia.com>
15 files changed:
src/plugins/coreplugin/basefilewizard.cpp
src/plugins/coreplugin/basefilewizard.h
src/plugins/coreplugin/dialogs/iwizard.h
src/plugins/coreplugin/icore.cpp
src/plugins/coreplugin/icore.h
src/plugins/coreplugin/ifilewizardextension.h
src/plugins/coreplugin/mainwindow.cpp
src/plugins/coreplugin/mainwindow.h
src/plugins/projectexplorer/projectexplorer.cpp
src/plugins/projectexplorer/projectexplorerconstants.h
src/plugins/projectexplorer/projectfilewizardextension.cpp
src/plugins/projectexplorer/projectfilewizardextension.h
src/plugins/qt4projectmanager/wizards/subdirsprojectwizard.cpp
src/plugins/vcsbase/basecheckoutwizard.cpp
src/plugins/vcsbase/basecheckoutwizard.h

index b47ff94..2e19226 100644 (file)
@@ -434,7 +434,7 @@ QString BaseFileWizard::descriptionImage() const
        return d->m_parameters.descriptionImage();
 }
 
-void BaseFileWizard::runWizard(const QString &path, QWidget *parent, const QString &platform)
+void BaseFileWizard::runWizard(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &extraValues)
 {
     QTC_ASSERT(!path.isEmpty(), return);
 
@@ -493,7 +493,7 @@ void BaseFileWizard::runWizard(const QString &path, QWidget *parent, const QStri
         }
         if (firstExtensionPageHit)
             foreach (IFileWizardExtension *ex, extensions)
-                ex->firstExtensionPageShown(files);
+                ex->firstExtensionPageShown(files, extraValues);
         if (accepted)
             break;
     }
index 9701857..6f4fc76 100644 (file)
@@ -158,7 +158,7 @@ public:
 
     virtual QString descriptionImage() const;
 
-    virtual void runWizard(const QString &path, QWidget *parent, const QString &platform);
+    virtual void runWizard(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &extraValues);
     virtual Core::FeatureSet requiredFeatures() const;
     virtual WizardFlags flags() const;
 
index 50383da..8347cd0 100644 (file)
@@ -37,6 +37,7 @@
 #include <coreplugin/featureprovider.h>
 
 #include <QObject>
+#include <QVariantMap>
 
 QT_BEGIN_NAMESPACE
 class QIcon;
@@ -77,7 +78,7 @@ public:
     virtual FeatureSet requiredFeatures() const = 0;
     virtual WizardFlags flags() const = 0;
 
-    virtual void runWizard(const QString &path, QWidget *parent, const QString &platform) = 0;
+    virtual void runWizard(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &variables) = 0;
 
     bool isAvailable(const QString &platformName) const;
     QStringList supportedPlatforms() const;
index ff9f861..185ed48 100644 (file)
@@ -385,9 +385,10 @@ ICore::~ICore()
 
 void ICore::showNewItemDialog(const QString &title,
                               const QList<IWizard *> &wizards,
-                              const QString &defaultLocation)
+                              const QString &defaultLocation,
+                              const QVariantMap &extraVariables)
 {
-    m_mainwindow->showNewItemDialog(title, wizards, defaultLocation);
+    m_mainwindow->showNewItemDialog(title, wizards, defaultLocation, extraVariables);
 }
 
 bool ICore::showOptionsDialog(const QString &group, const QString &page, QWidget *parent)
index 5b06c7f..169fd0d 100644 (file)
@@ -81,7 +81,8 @@ public:
 
     static void showNewItemDialog(const QString &title,
                                   const QList<IWizard *> &wizards,
-                                  const QString &defaultLocation = QString());
+                                  const QString &defaultLocation = QString(),
+                                  const QVariantMap &extraVariables = QVariantMap());
 
     static bool showOptionsDialog(const QString &group = QString(),
                                   const QString &page = QString(),
index 0d0cf5c..cadb2b4 100644 (file)
@@ -37,6 +37,7 @@
 
 #include <QObject>
 #include <QList>
+#include <QVariantMap>
 
 QT_BEGIN_NAMESPACE
 class QWizardPage;
@@ -71,8 +72,9 @@ public:
 
 public slots:
     /* Notification about the first extension page being shown. */
-    virtual void firstExtensionPageShown(const QList<GeneratedFile> &files) {
+    virtual void firstExtensionPageShown(const QList<GeneratedFile> &files, const QVariantMap &extraValues) {
         Q_UNUSED(files)
+        Q_UNUSED(extraValues)
         }
 };
 
index baa881d..4397688 100644 (file)
@@ -937,7 +937,8 @@ void MainWindow::setFocusToEditor()
 
 void MainWindow::showNewItemDialog(const QString &title,
                                           const QList<IWizard *> &wizards,
-                                          const QString &defaultLocation)
+                                          const QString &defaultLocation,
+                                          const QVariantMap &extraVariables)
 {
     // Scan for wizards matching the filter and pick one. Don't show
     // dialog if there is only one.
@@ -978,7 +979,7 @@ void MainWindow::showNewItemDialog(const QString &title,
             break;
         }
     }
-    wizard->runWizard(path, this, selectedPlatform);
+    wizard->runWizard(path, this, selectedPlatform, extraVariables);
 }
 
 bool MainWindow::showOptionsDialog(const QString &category,
index ed60198..86d77f7 100644 (file)
@@ -137,7 +137,8 @@ public slots:
 
     void showNewItemDialog(const QString &title,
                            const QList<IWizard *> &wizards,
-                           const QString &defaultLocation = QString());
+                           const QString &defaultLocation = QString(),
+                           const QVariantMap &extraVariables = QVariantMap());
 
     bool showOptionsDialog(const QString &category = QString(),
                            const QString &page = QString(),
index ceb45ca..016644b 100644 (file)
@@ -2569,10 +2569,12 @@ void ProjectExplorerPlugin::addNewFile()
     QTC_ASSERT(d->m_currentNode, return)
     QString location = directoryFor(d->m_currentNode);
 
+    QVariantMap map;
+    map.insert(QLatin1String(Constants::PREFERED_PROJECT_NODE), d->m_currentNode->projectNode()->path());
     Core::ICore::showNewItemDialog(tr("New File", "Title of dialog"),
                                Core::IWizard::wizardsOfKind(Core::IWizard::FileWizard)
                                + Core::IWizard::wizardsOfKind(Core::IWizard::ClassWizard),
-                               location);
+                               location, map);
 }
 
 void ProjectExplorerPlugin::addNewSubproject()
@@ -2583,9 +2585,11 @@ void ProjectExplorerPlugin::addNewSubproject()
     if (d->m_currentNode->nodeType() == ProjectNodeType
             && d->m_currentNode->projectNode()->supportedActions(
                 d->m_currentNode->projectNode()).contains(ProjectNode::AddSubProject)) {
+        QVariantMap map;
+        map.insert(QLatin1String(Constants::PREFERED_PROJECT_NODE), d->m_currentNode->projectNode()->path());
         Core::ICore::showNewItemDialog(tr("New Subproject", "Title of dialog"),
                               Core::IWizard::wizardsOfKind(Core::IWizard::ProjectWizard),
-                              location);
+                              location, map);
     }
 }
 
index 3d1be9a..5c6c18c 100644 (file)
@@ -205,6 +205,9 @@ const char PROJECT_WIZARD_CATEGORY_DISPLAY[] = QT_TRANSLATE_NOOP("ProjectExplore
 const char IMPORT_WIZARD_CATEGORY[] = "T.Import";
 const char IMPORT_WIZARD_CATEGORY_DISPLAY[] = QT_TRANSLATE_NOOP("ProjectExplorer", "Import Project");
 
+// Wizard extra values
+const char PREFERED_PROJECT_NODE[] = "ProjectExplorer.PreferedProjectNode";
+
 // Build step lists ids:
 const char BUILDSTEPS_CLEAN[] = "ProjectExplorer.BuildSteps.Clean";
 const char BUILDSTEPS_BUILD[] = "ProjectExplorer.BuildSteps.Build";
index 828948d..2386645 100644 (file)
@@ -231,15 +231,23 @@ static QList<ProjectEntry> findDeployProject(const QList<ProjectEntry> &projects
 // the longest matching path (list containing"/project/subproject1" matching
 // common path "/project/subproject1/newuserpath").
 static int findMatchingProject(const QList<ProjectEntry> &projects,
-                               const QString &commonPath)
+                               const QString &commonPath,
+                               const QString &preferedProjectNode)
 {
     if (projects.isEmpty() || commonPath.isEmpty())
         return -1;
 
+    const int count = projects.size();
+    if (!preferedProjectNode.isEmpty()) {
+        for (int p = 0; p < count; ++p) {
+            if (projects.at(p).node->path() == preferedProjectNode)
+                return p;
+        }
+    }
+
     int bestMatch = -1;
     int bestMatchLength = 0;
     bool bestMatchIsProFile = false;
-    const int count = projects.size();
     for (int p = 0; p < count; p++) {
         // Direct match or better match? (note that the wizards' files are native).
         const ProjectEntry &entry = projects.at(p);
@@ -268,7 +276,8 @@ static QString generatedProjectFilePath(const QList<Core::GeneratedFile> &files)
 }
 
 void ProjectFileWizardExtension::firstExtensionPageShown(
-        const QList<Core::GeneratedFile> &files)
+        const QList<Core::GeneratedFile> &files,
+        const QVariantMap &extraValues)
 {
     initProjectChoices(generatedProjectFilePath(files));
 
@@ -302,7 +311,8 @@ void ProjectFileWizardExtension::firstExtensionPageShown(
         m_context->page->setAdditionalInfo(text);
         bestProjectIndex = -1;
     } else {
-        bestProjectIndex = findMatchingProject(m_context->projects, m_context->commonDirectory);
+        bestProjectIndex = findMatchingProject(m_context->projects, m_context->commonDirectory,
+                                               extraValues.value(QLatin1String(Constants::PREFERED_PROJECT_NODE)).toString());
         m_context->page->setNoneLabel(tr("<None>"));
     }
 
index f413c4f..c8e3167 100644 (file)
@@ -54,7 +54,7 @@ public:
     void applyCodeStyle(Core::GeneratedFile *file) const;
 
 public slots:
-    void firstExtensionPageShown(const QList<Core::GeneratedFile> &files);
+    void firstExtensionPageShown(const QList<Core::GeneratedFile> &files, const QVariantMap &extraValues);
     void initializeVersionControlChoices();
 
 private:
index 0c58f4a..fb603ca 100644 (file)
@@ -83,9 +83,15 @@ bool SubdirsProjectWizard::postGenerateFiles(const QWizard *w, const Core::Gener
 {
     const SubdirsProjectWizardDialog *wizard = qobject_cast< const SubdirsProjectWizardDialog *>(w);
     if (QtWizard::qt4ProjectPostGenerateFiles(wizard, files, errorMessage)) {
+        const QtProjectParameters params = wizard->parameters();
+        const QString projectPath = params.projectPath();
+        const QString profileName = Core::BaseFileWizard::buildFileName(projectPath, params.fileName, profileSuffix());
+        QVariantMap map;
+        map.insert(QLatin1String(ProjectExplorer::Constants::PREFERED_PROJECT_NODE), profileName);
         Core::ICore::showNewItemDialog(tr("New Subproject", "Title of dialog"),
                               Core::IWizard::wizardsOfKind(Core::IWizard::ProjectWizard),
-                              wizard->parameters().projectPath());
+                              wizard->parameters().projectPath(),
+                              map);
     } else {
         return false;
     }
index b19c281..6b0892c 100644 (file)
@@ -129,8 +129,9 @@ void BaseCheckoutWizard::setId(const QString &id)
     d->id = id;
 }
 
-void BaseCheckoutWizard::runWizard(const QString &path, QWidget *parent, const QString & /*platform*/)
+void BaseCheckoutWizard::runWizard(const QString &path, QWidget *parent, const QString & /*platform*/, const QVariantMap &extraValues)
 {
+    Q_UNUSED(extraValues)
     // Create dialog and launch
     d->parameterPages = createParameterPages(path);
     Internal::CheckoutWizardDialog dialog(d->parameterPages, parent);
index 0a46d18..1148b73 100644 (file)
@@ -66,7 +66,7 @@ public:
 
     virtual QString descriptionImage() const;
 
-    virtual void runWizard(const QString &path, QWidget *parent, const QString &platform);
+    virtual void runWizard(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &extraValues);
 
     virtual Core::FeatureSet requiredFeatures() const;