From e5f8a31b9ef7ab90959c6ed62af14b838b3934d6 Mon Sep 17 00:00:00 2001 From: dt <qtc-committer@nokia.com> Date: Tue, 24 Aug 2010 17:17:11 +0200 Subject: [PATCH] Fix File/New in the deployment folders. That is tell the user that those files need not be added to any project, and show "<Implicitly Add>" for them on the last wizard page. This fixes Add/New for the QML/OTHER_FILES folder structure, except for the virtual folder itself. Reviewed-By: Jarek Kobus <jaroslaw.kobus@nokia.com> --- .../genericprojectnodes.cpp | 3 +- .../projectexplorer/projectexplorer.cpp | 13 ++--- .../projectfilewizardextension.cpp | 49 ++++++++++++++++--- src/plugins/projectexplorer/projectnodes.cpp | 6 +++ src/plugins/projectexplorer/projectnodes.h | 11 ++++- .../projectexplorer/projectwizardpage.cpp | 11 +++++ .../projectexplorer/projectwizardpage.h | 3 ++ .../projectexplorer/projectwizardpage.ui | 25 +++++++--- .../qmlprojectmanager/qmlprojectnodes.cpp | 2 +- src/plugins/qt4projectmanager/qt4nodes.cpp | 26 ++++++++-- src/plugins/qt4projectmanager/qt4nodes.h | 2 + .../qtsingleapplication.cpp | 1 - 12 files changed, 127 insertions(+), 25 deletions(-) diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp index 2664f5a26c6..61e43a82046 100644 --- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp +++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp @@ -174,7 +174,8 @@ QList<ProjectExplorer::ProjectNode::ProjectAction> GenericProjectNode::supported { Q_UNUSED(node); return QList<ProjectAction>() - << AddFile + << AddNewFile + << AddExistingFile << RemoveFile; } diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index d8584451a1c..227d20e0ed4 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -162,12 +162,12 @@ struct ProjectExplorerPluginPrivate { QAction *m_debugAction; QAction *m_addNewFileAction; QAction *m_addExistingFilesAction; - QAction *m_openFileAction; - QAction *m_showInGraphicalShell; - QAction *m_openTerminalHere; QAction *m_removeFileAction; QAction *m_deleteFileAction; QAction *m_renameFileAction; + QAction *m_openFileAction; + QAction *m_showInGraphicalShell; + QAction *m_openTerminalHere; QAction *m_projectSelectorAction; QAction *m_projectSelectorActionMenu; @@ -724,6 +724,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er globalcontext); mfilec->addAction(cmd, Constants::G_FILE_OTHER); + // delete file action d->m_deleteFileAction = new QAction(tr("Delete File..."), this); cmd = am->registerAction(d->m_deleteFileAction, ProjectExplorer::Constants::DELETEFILE, globalcontext); @@ -1968,6 +1969,7 @@ void ProjectExplorerPlugin::updateContextMenuActions(Node *node) d->m_removeFileAction->setEnabled(false); d->m_deleteFileAction->setEnabled(false); + d->m_addExistingFilesAction->setVisible(true); d->m_removeFileAction->setVisible(true); d->m_deleteFileAction->setVisible(true); @@ -1976,9 +1978,8 @@ void ProjectExplorerPlugin::updateContextMenuActions(Node *node) d->m_currentNode->projectNode()->supportedActions(node); if (qobject_cast<FolderNode*>(d->m_currentNode)) { - bool addFilesEnabled = actions.contains(ProjectNode::AddFile); - d->m_addExistingFilesAction->setEnabled(addFilesEnabled); - d->m_addNewFileAction->setEnabled(addFilesEnabled); + d->m_addNewFileAction->setEnabled(actions.contains(ProjectNode::AddNewFile)); + d->m_addExistingFilesAction->setEnabled(actions.contains(ProjectNode::AddExistingFile)); d->m_renameFileAction->setEnabled(actions.contains(ProjectNode::Rename)); } else if (qobject_cast<FileNode*>(d->m_currentNode)) { // Enable and show remove / delete in magic ways: diff --git a/src/plugins/projectexplorer/projectfilewizardextension.cpp b/src/plugins/projectexplorer/projectfilewizardextension.cpp index 69df21df82d..a432e5cfb1a 100644 --- a/src/plugins/projectexplorer/projectfilewizardextension.cpp +++ b/src/plugins/projectexplorer/projectfilewizardextension.cpp @@ -65,24 +65,29 @@ namespace Internal { class AllProjectNodesVisitor : public NodesVisitor { public: - static ProjectNodeList allProjects(); + AllProjectNodesVisitor(ProjectNode::ProjectAction action) + : m_action(action) + {} + + static ProjectNodeList allProjects(ProjectNode::ProjectAction action); virtual void visitProjectNode(ProjectNode *node); private: ProjectNodeList m_projectNodes; + ProjectNode::ProjectAction m_action; }; -ProjectNodeList AllProjectNodesVisitor::allProjects() +ProjectNodeList AllProjectNodesVisitor::allProjects(ProjectNode::ProjectAction action) { - AllProjectNodesVisitor visitor; + AllProjectNodesVisitor visitor(action); ProjectExplorerPlugin::instance()->session()->sessionNode()->accept(&visitor); return visitor.m_projectNodes; } void AllProjectNodesVisitor::visitProjectNode(ProjectNode *node) { - if (node->supportedActions(node).contains(ProjectNode::AddFile)) + if (node->supportedActions(node).contains(m_action)) m_projectNodes.push_back(node); } @@ -179,6 +184,16 @@ ProjectFileWizardExtension::~ProjectFileWizardExtension() delete m_context; } +static QList<ProjectEntry> findDeployProject(const QList<ProjectEntry> &projects, + QString &commonPath) +{ + QList<ProjectEntry> filtered; + foreach (const ProjectEntry &project, projects) + if (project.node->deploysFolder(commonPath)) + filtered << project; + return filtered; +} + // Find the project the new files should be added to given their common // path. Either a direct match on the directory or the directory with // the longest matching path (list containing"/project/subproject1" matching @@ -219,7 +234,28 @@ void ProjectFileWizardExtension::firstExtensionPageShown(const QList<Core::Gener m_context->commonDirectory = Utils::commonPath(fileNames); m_context->page->setFilesDisplay(m_context->commonDirectory, fileNames); // Find best project (Entry at 0 is 'None'). - const int bestProjectIndex = findMatchingProject(m_context->projects, m_context->commonDirectory); + + int bestProjectIndex = -1; + + QList<ProjectEntry> deployingProjects = findDeployProject(m_context->projects, m_context->commonDirectory); + if (!deployingProjects.isEmpty()) { + // Oh we do have someone that deploys it + // then the best match is NONE + // We display a label explaining that and rename <None> to + // <Implictly Add> + m_context->page->setNoneLabel(tr("<Implictly Add>")); + + QString text = tr("The files are implicitly added to the projects:\n"); + foreach (ProjectEntry project, deployingProjects) + text += project.fileName + "\n"; + + m_context->page->setAdditionalInfo(text); + bestProjectIndex = -1; + } else { + bestProjectIndex = findMatchingProject(m_context->projects, m_context->commonDirectory); + m_context->page->setNoneLabel(tr("<None>")); + } + if (bestProjectIndex == -1) { m_context->page->setCurrentProjectIndex(0); } else { @@ -290,7 +326,8 @@ void ProjectFileWizardExtension::initProjectChoices(bool enabled) // Sort by base name and purge duplicated entries (resulting from dependencies) // via Map. ProjectEntryMap entryMap; - foreach(ProjectNode *n, AllProjectNodesVisitor::allProjects()) + + foreach(ProjectNode *n, AllProjectNodesVisitor::allProjects(ProjectNode::AddNewFile)) entryMap.insert(ProjectEntry(n), true); // Collect names const ProjectEntryMap::const_iterator cend = entryMap.constEnd(); diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index b5516691df3..581c19b62c7 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -261,6 +261,12 @@ QList<ProjectNode*> ProjectNode::subProjectNodes() const \function bool ProjectNode::renameFile(const FileType, const QString &, const QString &) */ +bool ProjectNode::deploysFolder(const QString &folder) const +{ + Q_UNUSED(folder); + return false; +} + QList<NodesWatcher*> ProjectNode::watchers() const { return m_watchers; diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index f8de9aeea0b..1545f33ccba 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -159,8 +159,15 @@ public: enum ProjectAction { AddSubProject, RemoveSubProject, - AddFile, + // Let's the user select to which project file + // the file is added + AddNewFile, + AddExistingFile, + // Removes a file from the project, optionally also + // delete it on disc RemoveFile, + // Deletes a file from the file system, informs the project + // that a file was deleted // DeleteFile is a define on windows... EraseFile, Rename @@ -191,6 +198,8 @@ public: virtual bool renameFile(const FileType fileType, const QString &filePath, const QString &newFilePath) = 0; + // by default returns false + virtual bool deploysFolder(const QString &folder) const; QList<NodesWatcher*> watchers() const; diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index 3053548daa4..b37f529e2b7 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -74,6 +74,17 @@ void ProjectWizardPage::setCurrentProjectIndex(int idx) m_ui->projectComboBox->setCurrentIndex(idx); } +void ProjectWizardPage::setNoneLabel(const QString &label) +{ + m_ui->projectComboBox->setItemText(0, label); +} + +void ProjectWizardPage::setAdditionalInfo(const QString &text) +{ + m_ui->additionalInfo->setText(text); + m_ui->additionalInfo->setVisible(!text.isEmpty()); +} + void ProjectWizardPage::setVersionControls(const QStringList &vcs) { m_ui->addToVersionControlComboBox->clear(); diff --git a/src/plugins/projectexplorer/projectwizardpage.h b/src/plugins/projectexplorer/projectwizardpage.h index f06bf74d69e..73df81e9a48 100644 --- a/src/plugins/projectexplorer/projectwizardpage.h +++ b/src/plugins/projectexplorer/projectwizardpage.h @@ -52,6 +52,9 @@ public: int currentProjectIndex() const; void setCurrentProjectIndex(int); + void setNoneLabel(const QString &label); + void setAdditionalInfo(const QString &text); + void setVersionControls(const QStringList &); int versionControlIndex() const; diff --git a/src/plugins/projectexplorer/projectwizardpage.ui b/src/plugins/projectexplorer/projectwizardpage.ui index 716c33413eb..5c98f5ed692 100644 --- a/src/plugins/projectexplorer/projectwizardpage.ui +++ b/src/plugins/projectexplorer/projectwizardpage.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>619</width> - <height>414</height> + <width>226</width> + <height>184</height> </rect> </property> <property name="title"> @@ -37,9 +37,12 @@ <property name="enabled"> <bool>false</bool> </property> + <property name="sizeAdjustPolicy"> + <enum>QComboBox::AdjustToContents</enum> + </property> </widget> </item> - <item row="1" column="0"> + <item row="2" column="0"> <widget class="QLabel" name="addToVersionControlLabel"> <property name="text"> <string>Add to &version control:</string> @@ -49,9 +52,19 @@ </property> </widget> </item> - <item row="1" column="1"> + <item row="2" column="1"> <widget class="QComboBox" name="addToVersionControlComboBox"/> </item> + <item row="1" column="1"> + <widget class="QLabel" name="additionalInfo"> + <property name="text"> + <string/> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> </layout> </item> <item> @@ -89,8 +102,8 @@ <rect> <x>0</x> <y>0</y> - <width>611</width> - <height>328</height> + <width>218</width> + <height>83</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> diff --git a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp index 3f4b2da88a3..2be16f01eb2 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp @@ -176,7 +176,7 @@ QList<ProjectExplorer::ProjectNode::ProjectAction> QmlProjectNode::supportedActi { Q_UNUSED(node); QList<ProjectAction> actions; - actions.append(AddFile); + actions.append(AddNewFile); return actions; } diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 630179d89c7..9f3087634b2 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -702,6 +702,20 @@ void Qt4PriFileNode::folderChanged(const QString &) contents.updateSubFolders(this, this); } +bool Qt4PriFileNode::deploysFolder(const QString &folder) const +{ + QString f = folder; + if (!f.endsWith('/')) + f.append('/'); + foreach (const QString &wf, m_watchedFolders) { + if (f.startsWith(wf) + && (wf.endsWith('/') + || (wf.length() < f.length() && f.at(wf.length()) == '/'))) + return true; + } + return false; +} + QList<ProjectNode::ProjectAction> Qt4PriFileNode::supportedActions(Node *node) const { QList<ProjectAction> actions; @@ -715,11 +729,17 @@ QList<ProjectNode::ProjectAction> Qt4PriFileNode::supportedActions(Node *node) c switch (proFileNode->projectType()) { case ApplicationTemplate: case LibraryTemplate: - actions << AddFile; - if (m_recursiveEnumerateFiles.contains(node->path())) + actions << AddNewFile; + if (m_recursiveEnumerateFiles.contains(node->path())) { actions << EraseFile; - else + } else { actions << RemoveFile; + } + + // Only enable 'add existing file' if we don't deploy the folder + if (!deploysFolder(node->path())) + actions << AddExistingFile; + break; case SubDirsTemplate: actions << AddSubProject << RemoveSubProject; diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index b0d3c9dfccb..001c45c807f 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -154,6 +154,8 @@ public: void folderChanged(const QString &folder); + bool deploysFolder(const QString &folder) const; + protected: void clear(); static QStringList varNames(FileType type); diff --git a/src/shared/qtsingleapplication/qtsingleapplication.cpp b/src/shared/qtsingleapplication/qtsingleapplication.cpp index 28fa69657d6..a621a29a15f 100644 --- a/src/shared/qtsingleapplication/qtsingleapplication.cpp +++ b/src/shared/qtsingleapplication/qtsingleapplication.cpp @@ -100,7 +100,6 @@ bool QtSingleApplication::isRunning() return peer->isClient(); } - bool QtSingleApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); -- GitLab