forked from qt-creator/qt-creator
Refactor ProjectExplorer::Node and remove NodesWatcher
The idea behind NodesWatcher was that it was the central place to catch node related signals, so that users didn't need to connect to each individual node and the nodes didn't need to be QObjects. Somehow Nodes ended up being QObjects anyway. Both the recently added ProjectTree and the FlatModels consume the signals the NodesWatcher sends. Unfortunately there's a ordering dependency between the ProjectTree and the FlatModels. This patch removes all NodesWatcher and instead makes the ProjectTree singleton the emitter of various project tree related signals. The ProjectTree also ensures that the ordering between the FlatModel and itself is taken into account. And it makes Node not derive from QObject, saving some memory in that process. Task-number: QTCREATORBUG-13756 Change-Id: I8b0d357863f1dc1d2d440ce8172502594138b9fb Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
This commit is contained in:
@@ -53,8 +53,6 @@ class AutotoolsProject;
|
|||||||
*/
|
*/
|
||||||
class AutotoolsProjectNode : public ProjectExplorer::ProjectNode
|
class AutotoolsProjectNode : public ProjectExplorer::ProjectNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AutotoolsProjectNode(AutotoolsProject *project, Core::IDocument *projectFile);
|
AutotoolsProjectNode(AutotoolsProject *project, Core::IDocument *projectFile);
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ namespace Internal {
|
|||||||
|
|
||||||
class CMakeProjectNode : public ProjectExplorer::ProjectNode
|
class CMakeProjectNode : public ProjectExplorer::ProjectNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
friend class CMakeProject;
|
friend class CMakeProject;
|
||||||
public:
|
public:
|
||||||
CMakeProjectNode(const QString &fileName);
|
CMakeProjectNode(const QString &fileName);
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
#include <projectexplorer/projectnodes.h>
|
#include <projectexplorer/projectnodes.h>
|
||||||
#include <projectexplorer/nodesvisitor.h>
|
#include <projectexplorer/nodesvisitor.h>
|
||||||
#include <projectexplorer/project.h>
|
#include <projectexplorer/project.h>
|
||||||
|
#include <projectexplorer/projecttree.h>
|
||||||
#include <projectexplorer/session.h>
|
#include <projectexplorer/session.h>
|
||||||
#include <resourceeditor/resourcenode.h>
|
#include <resourceeditor/resourcenode.h>
|
||||||
|
|
||||||
@@ -75,7 +76,7 @@ void QrcFilesVisitor::visitFolderNode(FolderNode *folderNode)
|
|||||||
if (fileNode->fileType() == ProjectExplorer::ResourceType)
|
if (fileNode->fileType() == ProjectExplorer::ResourceType)
|
||||||
m_qrcFiles.append(fileNode->path());
|
m_qrcFiles.append(fileNode->path());
|
||||||
}
|
}
|
||||||
if (qobject_cast<ResourceEditor::ResourceTopLevelNode *>(folderNode))
|
if (dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(folderNode))
|
||||||
m_qrcFiles.append(folderNode->path());
|
m_qrcFiles.append(folderNode->path());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,25 +84,23 @@ void QrcFilesVisitor::visitFolderNode(FolderNode *folderNode)
|
|||||||
ResourceHandler::ResourceHandler(QDesignerFormWindowInterface *fw) :
|
ResourceHandler::ResourceHandler(QDesignerFormWindowInterface *fw) :
|
||||||
QObject(fw),
|
QObject(fw),
|
||||||
m_form(fw),
|
m_form(fw),
|
||||||
m_sessionNode(0),
|
m_initialized(false),
|
||||||
m_sessionWatcher(0),
|
|
||||||
m_handlingResources(false)
|
m_handlingResources(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceHandler::ensureInitialized()
|
void ResourceHandler::ensureInitialized()
|
||||||
{
|
{
|
||||||
if (m_sessionNode)
|
if (m_initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_sessionNode = ProjectExplorer::SessionManager::sessionNode();
|
m_initialized = true;
|
||||||
m_sessionWatcher = new ProjectExplorer::NodesWatcher();
|
ProjectTree *tree = ProjectTree::instance();
|
||||||
|
|
||||||
connect(m_sessionWatcher, SIGNAL(filesAdded()), this, SLOT(updateResources()));
|
connect(tree, SIGNAL(filesAdded()), this, SLOT(updateResources()));
|
||||||
connect(m_sessionWatcher, SIGNAL(filesRemoved()), this, SLOT(updateResources()));
|
connect(tree, SIGNAL(filesRemoved()), this, SLOT(updateResources()));
|
||||||
connect(m_sessionWatcher, SIGNAL(foldersAdded()), this, SLOT(updateResources()));
|
connect(tree, SIGNAL(foldersAdded()), this, SLOT(updateResources()));
|
||||||
connect(m_sessionWatcher, SIGNAL(foldersRemoved()), this, SLOT(updateResources()));
|
connect(tree, SIGNAL(foldersRemoved()), this, SLOT(updateResources()));
|
||||||
m_sessionNode->registerWatcher(m_sessionWatcher);
|
|
||||||
m_originalUiQrcPaths = m_form->activeResourceFilePaths();
|
m_originalUiQrcPaths = m_form->activeResourceFilePaths();
|
||||||
if (Designer::Constants::Internal::debug)
|
if (Designer::Constants::Internal::debug)
|
||||||
qDebug() << "ResourceHandler::ensureInitialized() origPaths=" << m_originalUiQrcPaths;
|
qDebug() << "ResourceHandler::ensureInitialized() origPaths=" << m_originalUiQrcPaths;
|
||||||
@@ -109,11 +108,7 @@ void ResourceHandler::ensureInitialized()
|
|||||||
|
|
||||||
ResourceHandler::~ResourceHandler()
|
ResourceHandler::~ResourceHandler()
|
||||||
{
|
{
|
||||||
// Close: Delete the Designer form window via embedding widget
|
|
||||||
if (m_sessionNode && m_sessionWatcher) {
|
|
||||||
m_sessionNode->unregisterWatcher(m_sessionWatcher);
|
|
||||||
delete m_sessionWatcher;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceHandler::updateResources(bool updateProjectResources)
|
void ResourceHandler::updateResources(bool updateProjectResources)
|
||||||
|
|||||||
@@ -38,10 +38,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
class QDesignerFormWindowInterface;
|
class QDesignerFormWindowInterface;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer { class SessionNode; }
|
||||||
class SessionNode;
|
|
||||||
class NodesWatcher;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Designer {
|
namespace Designer {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
@@ -70,8 +67,7 @@ private:
|
|||||||
void ensureInitialized();
|
void ensureInitialized();
|
||||||
QDesignerFormWindowInterface * const m_form;
|
QDesignerFormWindowInterface * const m_form;
|
||||||
QStringList m_originalUiQrcPaths;
|
QStringList m_originalUiQrcPaths;
|
||||||
ProjectExplorer::SessionNode *m_sessionNode;
|
bool m_initialized;
|
||||||
ProjectExplorer::NodesWatcher *m_sessionWatcher;
|
|
||||||
bool m_handlingResources;
|
bool m_handlingResources;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,6 @@
|
|||||||
|
|
||||||
#include <QFutureInterface>
|
#include <QFutureInterface>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <QPointer>
|
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
|
|
||||||
@@ -57,7 +56,7 @@ private slots:
|
|||||||
void markFilesAsOutOfDate();
|
void markFilesAsOutOfDate();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QPointer<Project> m_project;
|
Project *m_project;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -1935,7 +1935,7 @@ static QString pathOrDirectoryFor(Node *node, bool dir)
|
|||||||
{
|
{
|
||||||
QString path = node->path();
|
QString path = node->path();
|
||||||
QString location;
|
QString location;
|
||||||
FolderNode *folder = qobject_cast<FolderNode *>(node);
|
FolderNode *folder = dynamic_cast<FolderNode *>(node);
|
||||||
if (node->nodeType() == VirtualFolderNodeType && folder) {
|
if (node->nodeType() == VirtualFolderNodeType && folder) {
|
||||||
// Virtual Folder case
|
// Virtual Folder case
|
||||||
// If there are files directly below or no subfolders, take the folder path
|
// If there are files directly below or no subfolders, take the folder path
|
||||||
@@ -2291,7 +2291,7 @@ void ProjectExplorerPlugin::runProjectWithoutDeploy()
|
|||||||
|
|
||||||
void ProjectExplorerPlugin::runProjectContextMenu()
|
void ProjectExplorerPlugin::runProjectContextMenu()
|
||||||
{
|
{
|
||||||
ProjectNode *projectNode = qobject_cast<ProjectNode*>(ProjectTree::currentNode());
|
ProjectNode *projectNode = dynamic_cast<ProjectNode*>(ProjectTree::currentNode());
|
||||||
if (projectNode == ProjectTree::currentProject()->rootProjectNode() || !projectNode) {
|
if (projectNode == ProjectTree::currentProject()->rootProjectNode() || !projectNode) {
|
||||||
runProject(ProjectTree::currentProject(), NormalRunMode);
|
runProject(ProjectTree::currentProject(), NormalRunMode);
|
||||||
} else {
|
} else {
|
||||||
@@ -2810,7 +2810,7 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions()
|
|||||||
if (currentNode && currentNode->projectNode()) {
|
if (currentNode && currentNode->projectNode()) {
|
||||||
QList<ProjectAction> actions = currentNode->supportedActions(currentNode);
|
QList<ProjectAction> actions = currentNode->supportedActions(currentNode);
|
||||||
|
|
||||||
if (ProjectNode *pn = qobject_cast<ProjectNode *>(currentNode)) {
|
if (ProjectNode *pn = dynamic_cast<ProjectNode *>(currentNode)) {
|
||||||
if (ProjectTree::currentProject() && pn == ProjectTree::currentProject()->rootProjectNode()) {
|
if (ProjectTree::currentProject() && pn == ProjectTree::currentProject()->rootProjectNode()) {
|
||||||
dd->m_runActionContextMenu->setVisible(true);
|
dd->m_runActionContextMenu->setVisible(true);
|
||||||
} else {
|
} else {
|
||||||
@@ -2831,7 +2831,7 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (qobject_cast<FolderNode*>(currentNode)) {
|
if (dynamic_cast<FolderNode*>(currentNode)) {
|
||||||
// Also handles ProjectNode
|
// Also handles ProjectNode
|
||||||
dd->m_addNewFileAction->setEnabled(actions.contains(AddNewFile)
|
dd->m_addNewFileAction->setEnabled(actions.contains(AddNewFile)
|
||||||
&& !ICore::isNewItemDialogRunning());
|
&& !ICore::isNewItemDialogRunning());
|
||||||
@@ -2843,7 +2843,7 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions()
|
|||||||
dd->m_addExistingFilesAction->setEnabled(actions.contains(AddExistingFile));
|
dd->m_addExistingFilesAction->setEnabled(actions.contains(AddExistingFile));
|
||||||
dd->m_addExistingDirectoryAction->setEnabled(actions.contains(AddExistingDirectory));
|
dd->m_addExistingDirectoryAction->setEnabled(actions.contains(AddExistingDirectory));
|
||||||
dd->m_renameFileAction->setEnabled(actions.contains(Rename));
|
dd->m_renameFileAction->setEnabled(actions.contains(Rename));
|
||||||
} else if (qobject_cast<FileNode*>(currentNode)) {
|
} else if (dynamic_cast<FileNode*>(currentNode)) {
|
||||||
// Enable and show remove / delete in magic ways:
|
// Enable and show remove / delete in magic ways:
|
||||||
// If both are disabled show Remove
|
// If both are disabled show Remove
|
||||||
// If both are enabled show both (can't happen atm)
|
// If both are enabled show both (can't happen atm)
|
||||||
@@ -2942,7 +2942,7 @@ void ProjectExplorerPlugin::addExistingDirectory()
|
|||||||
|
|
||||||
void ProjectExplorerPlugin::addExistingFiles(const QStringList &filePaths)
|
void ProjectExplorerPlugin::addExistingFiles(const QStringList &filePaths)
|
||||||
{
|
{
|
||||||
FolderNode *folderNode = qobject_cast<FolderNode *>(ProjectTree::currentNode());
|
FolderNode *folderNode = dynamic_cast<FolderNode *>(ProjectTree::currentNode());
|
||||||
addExistingFiles(folderNode, filePaths);
|
addExistingFiles(folderNode, filePaths);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2971,8 +2971,8 @@ void ProjectExplorerPlugin::addExistingFiles(FolderNode *folderNode, const QStri
|
|||||||
|
|
||||||
void ProjectExplorerPlugin::removeProject()
|
void ProjectExplorerPlugin::removeProject()
|
||||||
{
|
{
|
||||||
ProjectNode *subProjectNode = qobject_cast<ProjectNode*>(ProjectTree::currentNode()->projectNode());
|
ProjectNode *subProjectNode = dynamic_cast<ProjectNode*>(ProjectTree::currentNode()->projectNode());
|
||||||
ProjectNode *projectNode = qobject_cast<ProjectNode *>(subProjectNode->parentFolderNode());
|
ProjectNode *projectNode = dynamic_cast<ProjectNode *>(subProjectNode->parentFolderNode());
|
||||||
if (projectNode) {
|
if (projectNode) {
|
||||||
RemoveFileDialog removeFileDialog(subProjectNode->path(), ICore::mainWindow());
|
RemoveFileDialog removeFileDialog(subProjectNode->path(), ICore::mainWindow());
|
||||||
removeFileDialog.setDeleteFileVisible(false);
|
removeFileDialog.setDeleteFileVisible(false);
|
||||||
@@ -3010,7 +3010,7 @@ void ProjectExplorerPlugin::removeFile()
|
|||||||
Node *currentNode = ProjectTree::currentNode();
|
Node *currentNode = ProjectTree::currentNode();
|
||||||
QTC_ASSERT(currentNode && currentNode->nodeType() == FileNodeType, return);
|
QTC_ASSERT(currentNode && currentNode->nodeType() == FileNodeType, return);
|
||||||
|
|
||||||
FileNode *fileNode = qobject_cast<FileNode*>(currentNode);
|
FileNode *fileNode = dynamic_cast<FileNode*>(currentNode);
|
||||||
|
|
||||||
QString filePath = currentNode->path();
|
QString filePath = currentNode->path();
|
||||||
RemoveFileDialog removeFileDialog(filePath, ICore::mainWindow());
|
RemoveFileDialog removeFileDialog(filePath, ICore::mainWindow());
|
||||||
@@ -3039,7 +3039,7 @@ void ProjectExplorerPlugin::deleteFile()
|
|||||||
Node *currentNode = ProjectTree::currentNode();
|
Node *currentNode = ProjectTree::currentNode();
|
||||||
QTC_ASSERT(currentNode && currentNode->nodeType() == FileNodeType, return);
|
QTC_ASSERT(currentNode && currentNode->nodeType() == FileNodeType, return);
|
||||||
|
|
||||||
FileNode *fileNode = qobject_cast<FileNode*>(currentNode);
|
FileNode *fileNode = dynamic_cast<FileNode*>(currentNode);
|
||||||
|
|
||||||
QString filePath = currentNode->path();
|
QString filePath = currentNode->path();
|
||||||
QMessageBox::StandardButton button =
|
QMessageBox::StandardButton button =
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include "project.h"
|
#include "project.h"
|
||||||
#include "projectnodes.h"
|
#include "projectnodes.h"
|
||||||
#include "projectexplorer.h"
|
#include "projectexplorer.h"
|
||||||
|
#include "projecttree.h"
|
||||||
|
|
||||||
#include <coreplugin/fileiconprovider.h>
|
#include <coreplugin/fileiconprovider.h>
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
@@ -58,8 +59,8 @@ bool sortNodes(Node *n1, Node *n2)
|
|||||||
const NodeType n2Type = n2->nodeType();
|
const NodeType n2Type = n2->nodeType();
|
||||||
|
|
||||||
// project files
|
// project files
|
||||||
FileNode *file1 = qobject_cast<FileNode*>(n1);
|
FileNode *file1 = dynamic_cast<FileNode*>(n1);
|
||||||
FileNode *file2 = qobject_cast<FileNode*>(n2);
|
FileNode *file2 = dynamic_cast<FileNode*>(n2);
|
||||||
if (file1 && file1->fileType() == ProjectFileType) {
|
if (file1 && file1->fileType() == ProjectFileType) {
|
||||||
if (file2 && file2->fileType() == ProjectFileType) {
|
if (file2 && file2->fileType() == ProjectFileType) {
|
||||||
const QString fileName1 = QFileInfo(file1->path()).fileName();
|
const QString fileName1 = QFileInfo(file1->path()).fileName();
|
||||||
@@ -177,42 +178,41 @@ FlatModel::FlatModel(SessionNode *rootNode, QObject *parent)
|
|||||||
m_startupProject(0),
|
m_startupProject(0),
|
||||||
m_parentFolderForChange(0)
|
m_parentFolderForChange(0)
|
||||||
{
|
{
|
||||||
NodesWatcher *watcher = new NodesWatcher(this);
|
ProjectTree *tree = ProjectTree::instance();
|
||||||
m_rootNode->registerWatcher(watcher);
|
|
||||||
|
|
||||||
connect(watcher, SIGNAL(aboutToChangeShowInSimpleTree(ProjectExplorer::FolderNode*)),
|
connect(tree, &ProjectTree::aboutToChangeShowInSimpleTree,
|
||||||
this, SLOT(aboutToShowInSimpleTreeChanged(ProjectExplorer::FolderNode*)));
|
this, &FlatModel::aboutToShowInSimpleTreeChanged);
|
||||||
|
|
||||||
connect(watcher, SIGNAL(showInSimpleTreeChanged(ProjectExplorer::FolderNode*)),
|
connect(tree, &ProjectTree::showInSimpleTreeChanged,
|
||||||
this, SLOT(showInSimpleTreeChanged(ProjectExplorer::FolderNode*)));
|
this, &FlatModel::showInSimpleTreeChanged);
|
||||||
|
|
||||||
connect(watcher, SIGNAL(foldersAboutToBeAdded(FolderNode*,QList<FolderNode*>)),
|
connect(tree, &ProjectTree::foldersAboutToBeAdded,
|
||||||
this, SLOT(foldersAboutToBeAdded(FolderNode*,QList<FolderNode*>)));
|
this, &FlatModel::foldersAboutToBeAdded);
|
||||||
connect(watcher, SIGNAL(foldersAdded()),
|
connect(tree, &ProjectTree::foldersAdded,
|
||||||
this, SLOT(foldersAdded()));
|
this, &FlatModel::foldersAdded);
|
||||||
|
|
||||||
connect(watcher, SIGNAL(foldersAboutToBeRemoved(FolderNode*,QList<FolderNode*>)),
|
connect(tree, &ProjectTree::foldersAboutToBeRemoved,
|
||||||
this, SLOT(foldersAboutToBeRemoved(FolderNode*,QList<FolderNode*>)));
|
this, &FlatModel::foldersAboutToBeRemoved);
|
||||||
connect(watcher, SIGNAL(foldersRemoved()),
|
connect(tree, &ProjectTree::foldersRemoved,
|
||||||
this, SLOT(foldersRemoved()));
|
this, &FlatModel::foldersRemoved);
|
||||||
|
|
||||||
connect(watcher, SIGNAL(filesAboutToBeAdded(FolderNode*,QList<FileNode*>)),
|
connect(tree, &ProjectTree::filesAboutToBeAdded,
|
||||||
this, SLOT(filesAboutToBeAdded(FolderNode*,QList<FileNode*>)));
|
this, &FlatModel::filesAboutToBeAdded);
|
||||||
connect(watcher, SIGNAL(filesAdded()),
|
connect(tree, &ProjectTree::filesAdded,
|
||||||
this, SLOT(filesAdded()));
|
this, &FlatModel::filesAdded);
|
||||||
|
|
||||||
connect(watcher, SIGNAL(filesAboutToBeRemoved(FolderNode*,QList<FileNode*>)),
|
connect(tree, &ProjectTree::filesAboutToBeRemoved,
|
||||||
this, SLOT(filesAboutToBeRemoved(FolderNode*,QList<FileNode*>)));
|
this, &FlatModel::filesAboutToBeRemoved);
|
||||||
connect(watcher, SIGNAL(filesRemoved()),
|
connect(tree, &ProjectTree::filesRemoved,
|
||||||
this, SLOT(filesRemoved()));
|
this, &FlatModel::filesRemoved);
|
||||||
|
|
||||||
connect(watcher, SIGNAL(nodeSortKeyAboutToChange(Node*)),
|
connect(tree, &ProjectTree::nodeSortKeyAboutToChange,
|
||||||
this, SLOT(nodeSortKeyAboutToChange(Node*)));
|
this, &FlatModel::nodeSortKeyAboutToChange);
|
||||||
connect(watcher, SIGNAL(nodeSortKeyChanged()),
|
connect(tree, &ProjectTree::nodeSortKeyChanged,
|
||||||
this, SLOT(nodeSortKeyChanged()));
|
this, &FlatModel::nodeSortKeyChanged);
|
||||||
|
|
||||||
connect(watcher, SIGNAL(nodeUpdated(ProjectExplorer::Node*)),
|
connect(tree, &ProjectTree::nodeUpdated,
|
||||||
this, SLOT(nodeUpdated(ProjectExplorer::Node*)));
|
this, &FlatModel::nodeUpdated);
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex FlatModel::index(int row, int column, const QModelIndex &parent) const
|
QModelIndex FlatModel::index(int row, int column, const QModelIndex &parent) const
|
||||||
@@ -221,7 +221,7 @@ QModelIndex FlatModel::index(int row, int column, const QModelIndex &parent) con
|
|||||||
if (!parent.isValid() && row == 0 && column == 0) { // session
|
if (!parent.isValid() && row == 0 && column == 0) { // session
|
||||||
result = createIndex(0, 0, m_rootNode);
|
result = createIndex(0, 0, m_rootNode);
|
||||||
} else if (parent.isValid() && column == 0) {
|
} else if (parent.isValid() && column == 0) {
|
||||||
FolderNode *parentNode = qobject_cast<FolderNode*>(nodeForIndex(parent));
|
FolderNode *parentNode = dynamic_cast<FolderNode*>(nodeForIndex(parent));
|
||||||
Q_ASSERT(parentNode);
|
Q_ASSERT(parentNode);
|
||||||
QHash<FolderNode*, QList<Node*> >::const_iterator it = m_childNodes.constFind(parentNode);
|
QHash<FolderNode*, QList<Node*> >::const_iterator it = m_childNodes.constFind(parentNode);
|
||||||
if (it == m_childNodes.constEnd()) {
|
if (it == m_childNodes.constEnd()) {
|
||||||
@@ -270,7 +270,7 @@ QVariant FlatModel::data(const QModelIndex &index, int role) const
|
|||||||
QVariant result;
|
QVariant result;
|
||||||
|
|
||||||
if (Node *node = nodeForIndex(index)) {
|
if (Node *node = nodeForIndex(index)) {
|
||||||
FolderNode *folderNode = qobject_cast<FolderNode*>(node);
|
FolderNode *folderNode = dynamic_cast<FolderNode*>(node);
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case Qt::DisplayRole: {
|
case Qt::DisplayRole: {
|
||||||
QString name = node->displayName();
|
QString name = node->displayName();
|
||||||
@@ -334,11 +334,11 @@ Qt::ItemFlags FlatModel::flags(const QModelIndex &index) const
|
|||||||
if (Node *node = nodeForIndex(index)) {
|
if (Node *node = nodeForIndex(index)) {
|
||||||
if (node == m_rootNode)
|
if (node == m_rootNode)
|
||||||
return 0; // no flags for session node...
|
return 0; // no flags for session node...
|
||||||
if (!qobject_cast<ProjectNode *>(node)) {
|
if (!dynamic_cast<ProjectNode *>(node)) {
|
||||||
// either folder or file node
|
// either folder or file node
|
||||||
if (node->supportedActions(node).contains(Rename))
|
if (node->supportedActions(node).contains(Rename))
|
||||||
f = f | Qt::ItemIsEditable;
|
f = f | Qt::ItemIsEditable;
|
||||||
if (qobject_cast<FileNode *>(node))
|
if (dynamic_cast<FileNode *>(node))
|
||||||
f = f | Qt::ItemIsDragEnabled;
|
f = f | Qt::ItemIsDragEnabled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -369,7 +369,7 @@ int FlatModel::rowCount(const QModelIndex &parent) const
|
|||||||
if (!parent.isValid()) {
|
if (!parent.isValid()) {
|
||||||
rows = 1;
|
rows = 1;
|
||||||
} else {
|
} else {
|
||||||
FolderNode *folderNode = qobject_cast<FolderNode*>(nodeForIndex(parent));
|
FolderNode *folderNode = dynamic_cast<FolderNode*>(nodeForIndex(parent));
|
||||||
if (folderNode && m_childNodes.contains(folderNode))
|
if (folderNode && m_childNodes.contains(folderNode))
|
||||||
rows = m_childNodes.value(folderNode).size();
|
rows = m_childNodes.value(folderNode).size();
|
||||||
}
|
}
|
||||||
@@ -386,7 +386,7 @@ bool FlatModel::hasChildren(const QModelIndex &parent) const
|
|||||||
if (!parent.isValid())
|
if (!parent.isValid())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
FolderNode *folderNode = qobject_cast<FolderNode*>(nodeForIndex(parent));
|
FolderNode *folderNode = dynamic_cast<FolderNode*>(nodeForIndex(parent));
|
||||||
if (!folderNode)
|
if (!folderNode)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -403,7 +403,7 @@ bool FlatModel::canFetchMore(const QModelIndex & parent) const
|
|||||||
if (!parent.isValid()) {
|
if (!parent.isValid()) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
if (FolderNode *folderNode = qobject_cast<FolderNode*>(nodeForIndex(parent)))
|
if (FolderNode *folderNode = dynamic_cast<FolderNode*>(nodeForIndex(parent)))
|
||||||
return !m_childNodes.contains(folderNode);
|
return !m_childNodes.contains(folderNode);
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
@@ -473,7 +473,7 @@ void FlatModel::fetchMore(FolderNode *folderNode) const
|
|||||||
|
|
||||||
void FlatModel::fetchMore(const QModelIndex &parent)
|
void FlatModel::fetchMore(const QModelIndex &parent)
|
||||||
{
|
{
|
||||||
FolderNode *folderNode = qobject_cast<FolderNode*>(nodeForIndex(parent));
|
FolderNode *folderNode = dynamic_cast<FolderNode*>(nodeForIndex(parent));
|
||||||
Q_ASSERT(folderNode);
|
Q_ASSERT(folderNode);
|
||||||
|
|
||||||
fetchMore(folderNode);
|
fetchMore(folderNode);
|
||||||
@@ -514,7 +514,7 @@ QMimeData *FlatModel::mimeData(const QModelIndexList &indexes) const
|
|||||||
auto data = new Utils::FileDropMimeData;
|
auto data = new Utils::FileDropMimeData;
|
||||||
foreach (const QModelIndex &index, indexes) {
|
foreach (const QModelIndex &index, indexes) {
|
||||||
Node *node = nodeForIndex(index);
|
Node *node = nodeForIndex(index);
|
||||||
if (qobject_cast<FileNode *>(node))
|
if (dynamic_cast<FileNode *>(node))
|
||||||
data->addFile(node->path());
|
data->addFile(node->path());
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
@@ -601,10 +601,10 @@ FolderNode *FlatModel::visibleFolderNode(FolderNode *node) const
|
|||||||
bool FlatModel::filter(Node *node) const
|
bool FlatModel::filter(Node *node) const
|
||||||
{
|
{
|
||||||
bool isHidden = false;
|
bool isHidden = false;
|
||||||
if (FolderNode *folderNode = qobject_cast<FolderNode*>(node)) {
|
if (FolderNode *folderNode = dynamic_cast<FolderNode*>(node)) {
|
||||||
if (m_filterProjects)
|
if (m_filterProjects)
|
||||||
isHidden = !folderNode->showInSimpleTree();
|
isHidden = !folderNode->showInSimpleTree();
|
||||||
} else if (FileNode *fileNode = qobject_cast<FileNode*>(node)) {
|
} else if (FileNode *fileNode = dynamic_cast<FileNode*>(node)) {
|
||||||
if (m_filterGeneratedFiles)
|
if (m_filterGeneratedFiles)
|
||||||
isHidden = fileNode->isGenerated();
|
isHidden = fileNode->isGenerated();
|
||||||
}
|
}
|
||||||
@@ -803,7 +803,7 @@ void FlatModel::aboutToShowInSimpleTreeChanged(FolderNode* node)
|
|||||||
QList<Node *> staleFolders;
|
QList<Node *> staleFolders;
|
||||||
recursiveAddFolderNodesImpl(node, &staleFolders);
|
recursiveAddFolderNodesImpl(node, &staleFolders);
|
||||||
foreach (Node *n, staleFolders)
|
foreach (Node *n, staleFolders)
|
||||||
if (FolderNode *fn = qobject_cast<FolderNode *>(n))
|
if (FolderNode *fn = dynamic_cast<FolderNode *>(n))
|
||||||
m_childNodes.remove(fn);
|
m_childNodes.remove(fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "nodesvisitor.h"
|
#include "nodesvisitor.h"
|
||||||
#include "projectexplorerconstants.h"
|
#include "projectexplorerconstants.h"
|
||||||
|
#include "projecttree.h"
|
||||||
|
|
||||||
#include <coreplugin/mimedatabase.h>
|
#include <coreplugin/mimedatabase.h>
|
||||||
#include <coreplugin/fileiconprovider.h>
|
#include <coreplugin/fileiconprovider.h>
|
||||||
@@ -65,30 +66,30 @@ using namespace ProjectExplorer;
|
|||||||
|
|
||||||
Node::Node(NodeType nodeType,
|
Node::Node(NodeType nodeType,
|
||||||
const QString &filePath, int line)
|
const QString &filePath, int line)
|
||||||
: QObject(),
|
: m_nodeType(nodeType),
|
||||||
m_nodeType(nodeType),
|
m_line(line),
|
||||||
m_projectNode(0),
|
m_projectNode(0),
|
||||||
m_folderNode(0),
|
m_folderNode(0),
|
||||||
m_path(filePath),
|
m_path(filePath)
|
||||||
m_line(line)
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Node::~Node()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::emitNodeSortKeyAboutToChange()
|
void Node::emitNodeSortKeyAboutToChange()
|
||||||
{
|
{
|
||||||
if (ProjectNode *project = projectNode()) {
|
if (parentFolderNode())
|
||||||
foreach (NodesWatcher *watcher, project->watchers())
|
ProjectTree::instance()->emitNodeSortKeyAboutToChange(this);
|
||||||
emit watcher->nodeSortKeyAboutToChange(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::emitNodeSortKeyChanged()
|
void Node::emitNodeSortKeyChanged()
|
||||||
{
|
{
|
||||||
if (ProjectNode *project = projectNode()) {
|
if (parentFolderNode())
|
||||||
foreach (NodesWatcher *watcher, project->watchers())
|
ProjectTree::instance()->emitNodeSortKeyChanged();
|
||||||
emit watcher->nodeSortKeyChanged();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -199,9 +200,8 @@ void Node::setProjectNode(ProjectNode *project)
|
|||||||
|
|
||||||
void Node::emitNodeUpdated()
|
void Node::emitNodeUpdated()
|
||||||
{
|
{
|
||||||
if (ProjectNode *node = projectNode())
|
if (parentFolderNode())
|
||||||
foreach (NodesWatcher *watcher, node->watchers())
|
ProjectTree::instance()->emitNodeUpdated(this);
|
||||||
emit watcher->nodeUpdated(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::setParentFolderNode(FolderNode *parentFolder)
|
void Node::setParentFolderNode(FolderNode *parentFolder)
|
||||||
@@ -362,19 +362,17 @@ FolderNode::AddNewInformation FolderNode::addNewInformation(const QStringList &f
|
|||||||
void FolderNode::addFileNodes(const QList<FileNode *> &files)
|
void FolderNode::addFileNodes(const QList<FileNode *> &files)
|
||||||
{
|
{
|
||||||
Q_ASSERT(projectNode());
|
Q_ASSERT(projectNode());
|
||||||
ProjectNode *pn = projectNode();
|
|
||||||
if (files.isEmpty())
|
if (files.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, pn->watchers())
|
emit ProjectTree::instance()->emitFilesAboutToBeAdded(this, files);
|
||||||
emit watcher->filesAboutToBeAdded(this, files);
|
|
||||||
|
|
||||||
foreach (FileNode *file, files) {
|
foreach (FileNode *file, files) {
|
||||||
QTC_ASSERT(!file->parentFolderNode(),
|
QTC_ASSERT(!file->parentFolderNode(),
|
||||||
qDebug("File node has already a parent folder"));
|
qDebug("File node has already a parent folder"));
|
||||||
|
|
||||||
file->setParentFolderNode(this);
|
file->setParentFolderNode(this);
|
||||||
file->setProjectNode(pn);
|
file->setProjectNode(projectNode());
|
||||||
// Now find the correct place to insert file
|
// Now find the correct place to insert file
|
||||||
if (m_fileNodes.count() == 0
|
if (m_fileNodes.count() == 0
|
||||||
|| m_fileNodes.last() < file) {
|
|| m_fileNodes.last() < file) {
|
||||||
@@ -389,8 +387,7 @@ void FolderNode::addFileNodes(const QList<FileNode *> &files)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, pn->watchers())
|
ProjectTree::instance()->emitFilesAdded();
|
||||||
emit watcher->filesAdded();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -404,7 +401,6 @@ void FolderNode::addFileNodes(const QList<FileNode *> &files)
|
|||||||
void FolderNode::removeFileNodes(const QList<FileNode *> &files)
|
void FolderNode::removeFileNodes(const QList<FileNode *> &files)
|
||||||
{
|
{
|
||||||
Q_ASSERT(projectNode());
|
Q_ASSERT(projectNode());
|
||||||
ProjectNode *pn = projectNode();
|
|
||||||
|
|
||||||
if (files.isEmpty())
|
if (files.isEmpty())
|
||||||
return;
|
return;
|
||||||
@@ -412,8 +408,7 @@ void FolderNode::removeFileNodes(const QList<FileNode *> &files)
|
|||||||
QList<FileNode*> toRemove = files;
|
QList<FileNode*> toRemove = files;
|
||||||
Utils::sort(toRemove);
|
Utils::sort(toRemove);
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, pn->watchers())
|
ProjectTree::instance()->emitFilesAboutToBeRemoved(this, toRemove);
|
||||||
emit watcher->filesAboutToBeRemoved(this, toRemove);
|
|
||||||
|
|
||||||
QList<FileNode*>::const_iterator toRemoveIter = toRemove.constBegin();
|
QList<FileNode*>::const_iterator toRemoveIter = toRemove.constBegin();
|
||||||
QList<FileNode*>::iterator filesIter = m_fileNodes.begin();
|
QList<FileNode*>::iterator filesIter = m_fileNodes.begin();
|
||||||
@@ -427,8 +422,7 @@ void FolderNode::removeFileNodes(const QList<FileNode *> &files)
|
|||||||
filesIter = m_fileNodes.erase(filesIter);
|
filesIter = m_fileNodes.erase(filesIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, pn->watchers())
|
ProjectTree::instance()->emitFilesRemoved();
|
||||||
emit watcher->filesRemoved();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -438,19 +432,16 @@ void FolderNode::removeFileNodes(const QList<FileNode *> &files)
|
|||||||
void FolderNode::addFolderNodes(const QList<FolderNode*> &subFolders)
|
void FolderNode::addFolderNodes(const QList<FolderNode*> &subFolders)
|
||||||
{
|
{
|
||||||
Q_ASSERT(projectNode());
|
Q_ASSERT(projectNode());
|
||||||
ProjectNode *pn = projectNode();
|
|
||||||
|
|
||||||
if (subFolders.isEmpty())
|
if (subFolders.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, pn->watchers())
|
ProjectTree::instance()->emitFoldersAboutToBeAdded(this, subFolders);
|
||||||
watcher->foldersAboutToBeAdded(this, subFolders);
|
|
||||||
|
|
||||||
foreach (FolderNode *folder, subFolders) {
|
foreach (FolderNode *folder, subFolders) {
|
||||||
QTC_ASSERT(!folder->parentFolderNode(),
|
QTC_ASSERT(!folder->parentFolderNode(),
|
||||||
qDebug("Project node has already a parent folder"));
|
qDebug("Project node has already a parent folder"));
|
||||||
folder->setParentFolderNode(this);
|
folder->setParentFolderNode(this);
|
||||||
folder->setProjectNode(pn);
|
folder->setProjectNode(projectNode());
|
||||||
|
|
||||||
// Find the correct place to insert
|
// Find the correct place to insert
|
||||||
if (m_subFolderNodes.count() == 0
|
if (m_subFolderNodes.count() == 0
|
||||||
@@ -471,8 +462,7 @@ void FolderNode::addFolderNodes(const QList<FolderNode*> &subFolders)
|
|||||||
qDebug("project nodes have to be added via addProjectNodes"));
|
qDebug("project nodes have to be added via addProjectNodes"));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, pn->watchers())
|
ProjectTree::instance()->emitFoldersAdded();
|
||||||
emit watcher->foldersAdded();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -484,7 +474,6 @@ void FolderNode::addFolderNodes(const QList<FolderNode*> &subFolders)
|
|||||||
void FolderNode::removeFolderNodes(const QList<FolderNode*> &subFolders)
|
void FolderNode::removeFolderNodes(const QList<FolderNode*> &subFolders)
|
||||||
{
|
{
|
||||||
Q_ASSERT(projectNode());
|
Q_ASSERT(projectNode());
|
||||||
ProjectNode *pn = projectNode();
|
|
||||||
|
|
||||||
if (subFolders.isEmpty())
|
if (subFolders.isEmpty())
|
||||||
return;
|
return;
|
||||||
@@ -492,8 +481,7 @@ void FolderNode::removeFolderNodes(const QList<FolderNode*> &subFolders)
|
|||||||
QList<FolderNode*> toRemove = subFolders;
|
QList<FolderNode*> toRemove = subFolders;
|
||||||
Utils::sort(toRemove);
|
Utils::sort(toRemove);
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, pn->watchers())
|
ProjectTree::instance()->emitFoldersAboutToBeRemoved(this, toRemove);
|
||||||
emit watcher->foldersAboutToBeRemoved(this, toRemove);
|
|
||||||
|
|
||||||
QList<FolderNode*>::const_iterator toRemoveIter = toRemove.constBegin();
|
QList<FolderNode*>::const_iterator toRemoveIter = toRemove.constBegin();
|
||||||
QList<FolderNode*>::iterator folderIter = m_subFolderNodes.begin();
|
QList<FolderNode*>::iterator folderIter = m_subFolderNodes.begin();
|
||||||
@@ -509,20 +497,7 @@ void FolderNode::removeFolderNodes(const QList<FolderNode*> &subFolders)
|
|||||||
folderIter = m_subFolderNodes.erase(folderIter);
|
folderIter = m_subFolderNodes.erase(folderIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, pn->watchers())
|
ProjectTree::instance()->emitFoldersRemoved();
|
||||||
emit watcher->foldersRemoved();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FolderNode::aboutToChangeShowInSimpleTree()
|
|
||||||
{
|
|
||||||
foreach (NodesWatcher *watcher, projectNode()->watchers())
|
|
||||||
emit watcher->aboutToChangeShowInSimpleTree(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FolderNode::showInSimpleTreeChanged()
|
|
||||||
{
|
|
||||||
foreach (NodesWatcher *watcher, projectNode()->watchers())
|
|
||||||
emit watcher->showInSimpleTreeChanged(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FolderNode::showInSimpleTree() const
|
bool FolderNode::showInSimpleTree() const
|
||||||
@@ -629,40 +604,6 @@ QList<RunConfiguration *> ProjectNode::runConfigurations() const
|
|||||||
return QList<RunConfiguration *>();
|
return QList<RunConfiguration *>();
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<NodesWatcher*> ProjectNode::watchers() const
|
|
||||||
{
|
|
||||||
return m_watchers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Registers \a watcher for the current project and all subprojects.
|
|
||||||
|
|
||||||
It does not take ownership of the watcher.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void ProjectNode::registerWatcher(NodesWatcher *watcher)
|
|
||||||
{
|
|
||||||
if (!watcher)
|
|
||||||
return;
|
|
||||||
connect(watcher, SIGNAL(destroyed(QObject*)),
|
|
||||||
this, SLOT(watcherDestroyed(QObject*)));
|
|
||||||
m_watchers.append(watcher);
|
|
||||||
foreach (ProjectNode *subProject, m_subProjectNodes)
|
|
||||||
subProject->registerWatcher(watcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Removes \a watcher from the current project and all subprojects.
|
|
||||||
*/
|
|
||||||
void ProjectNode::unregisterWatcher(NodesWatcher *watcher)
|
|
||||||
{
|
|
||||||
if (!watcher)
|
|
||||||
return;
|
|
||||||
m_watchers.removeOne(watcher);
|
|
||||||
foreach (ProjectNode *subProject, m_subProjectNodes)
|
|
||||||
subProject->unregisterWatcher(watcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProjectNode::accept(NodesVisitor *visitor)
|
void ProjectNode::accept(NodesVisitor *visitor)
|
||||||
{
|
{
|
||||||
visitor->visitProjectNode(this);
|
visitor->visitProjectNode(this);
|
||||||
@@ -682,23 +623,19 @@ void ProjectNode::addProjectNodes(const QList<ProjectNode*> &subProjects)
|
|||||||
foreach (ProjectNode *projectNode, subProjects)
|
foreach (ProjectNode *projectNode, subProjects)
|
||||||
folderNodes << projectNode;
|
folderNodes << projectNode;
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
ProjectTree::instance()->emitFoldersAboutToBeAdded(this, folderNodes);
|
||||||
emit watcher->foldersAboutToBeAdded(this, folderNodes);
|
|
||||||
|
|
||||||
foreach (ProjectNode *project, subProjects) {
|
foreach (ProjectNode *project, subProjects) {
|
||||||
QTC_ASSERT(!project->parentFolderNode() || project->parentFolderNode() == this,
|
QTC_ASSERT(!project->parentFolderNode() || project->parentFolderNode() == this,
|
||||||
qDebug("Project node has already a parent"));
|
qDebug("Project node has already a parent"));
|
||||||
project->setParentFolderNode(this);
|
project->setParentFolderNode(this);
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
|
||||||
project->registerWatcher(watcher);
|
|
||||||
m_subFolderNodes.append(project);
|
m_subFolderNodes.append(project);
|
||||||
m_subProjectNodes.append(project);
|
m_subProjectNodes.append(project);
|
||||||
}
|
}
|
||||||
Utils::sort(m_subFolderNodes);
|
Utils::sort(m_subFolderNodes);
|
||||||
Utils::sort(m_subProjectNodes);
|
Utils::sort(m_subProjectNodes);
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
ProjectTree::instance()->emitFoldersAdded();
|
||||||
emit watcher->foldersAdded();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -717,8 +654,7 @@ void ProjectNode::removeProjectNodes(const QList<ProjectNode*> &subProjects)
|
|||||||
toRemove << projectNode;
|
toRemove << projectNode;
|
||||||
Utils::sort(toRemove);
|
Utils::sort(toRemove);
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
ProjectTree::instance()->foldersAboutToBeRemoved(this, toRemove);
|
||||||
emit watcher->foldersAboutToBeRemoved(this, toRemove);
|
|
||||||
|
|
||||||
QList<FolderNode*>::const_iterator toRemoveIter = toRemove.constBegin();
|
QList<FolderNode*>::const_iterator toRemoveIter = toRemove.constBegin();
|
||||||
QList<FolderNode*>::iterator folderIter = m_subFolderNodes.begin();
|
QList<FolderNode*>::iterator folderIter = m_subFolderNodes.begin();
|
||||||
@@ -739,26 +675,18 @@ void ProjectNode::removeProjectNodes(const QList<ProjectNode*> &subProjects)
|
|||||||
folderIter = m_subFolderNodes.erase(folderIter);
|
folderIter = m_subFolderNodes.erase(folderIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
ProjectTree::instance()->emitFoldersRemoved();
|
||||||
emit watcher->foldersRemoved();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectNode::watcherDestroyed(QObject *watcher)
|
|
||||||
{
|
|
||||||
// cannot use qobject_cast here
|
|
||||||
unregisterWatcher(static_cast<NodesWatcher*>(watcher));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class ProjectExplorer::SessionNode
|
\class ProjectExplorer::SessionNode
|
||||||
*/
|
*/
|
||||||
|
|
||||||
SessionNode::SessionNode(QObject *parentObject)
|
SessionNode::SessionNode()
|
||||||
: FolderNode(QLatin1String("session"))
|
: FolderNode(QLatin1String("session"))
|
||||||
{
|
{
|
||||||
setParent(parentObject);
|
|
||||||
setNodeType(SessionNodeType);
|
setNodeType(SessionNodeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -768,39 +696,6 @@ QList<ProjectAction> SessionNode::supportedActions(Node *node) const
|
|||||||
return QList<ProjectAction>();
|
return QList<ProjectAction>();
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<NodesWatcher*> SessionNode::watchers() const
|
|
||||||
{
|
|
||||||
return m_watchers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Registers \a watcher for the complete session tree.
|
|
||||||
It does not take ownership of the watcher.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void SessionNode::registerWatcher(NodesWatcher *watcher)
|
|
||||||
{
|
|
||||||
if (!watcher)
|
|
||||||
return;
|
|
||||||
connect(watcher, SIGNAL(destroyed(QObject*)),
|
|
||||||
this, SLOT(watcherDestroyed(QObject*)));
|
|
||||||
m_watchers.append(watcher);
|
|
||||||
foreach (ProjectNode *project, m_projectNodes)
|
|
||||||
project->registerWatcher(watcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Removes \a watcher from the complete session tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void SessionNode::unregisterWatcher(NodesWatcher *watcher)
|
|
||||||
{
|
|
||||||
if (!watcher)
|
|
||||||
return;
|
|
||||||
m_watchers.removeOne(watcher);
|
|
||||||
foreach (ProjectNode *project, m_projectNodes)
|
|
||||||
project->unregisterWatcher(watcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SessionNode::accept(NodesVisitor *visitor)
|
void SessionNode::accept(NodesVisitor *visitor)
|
||||||
{
|
{
|
||||||
@@ -816,10 +711,8 @@ bool SessionNode::showInSimpleTree() const
|
|||||||
|
|
||||||
void SessionNode::projectDisplayNameChanged(Node *node)
|
void SessionNode::projectDisplayNameChanged(Node *node)
|
||||||
{
|
{
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
ProjectTree::instance()->emitNodeSortKeyAboutToChange(node);
|
||||||
emit watcher->nodeSortKeyAboutToChange(node);
|
ProjectTree::instance()->emitNodeSortKeyChanged();
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
|
||||||
emit watcher->nodeSortKeyChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<ProjectNode*> SessionNode::projectNodes() const
|
QList<ProjectNode*> SessionNode::projectNodes() const
|
||||||
@@ -834,15 +727,12 @@ void SessionNode::addProjectNodes(const QList<ProjectNode*> &projectNodes)
|
|||||||
foreach (ProjectNode *projectNode, projectNodes)
|
foreach (ProjectNode *projectNode, projectNodes)
|
||||||
folderNodes << projectNode;
|
folderNodes << projectNode;
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
ProjectTree::instance()->emitFoldersAboutToBeAdded(this, folderNodes);
|
||||||
emit watcher->foldersAboutToBeAdded(this, folderNodes);
|
|
||||||
|
|
||||||
foreach (ProjectNode *project, projectNodes) {
|
foreach (ProjectNode *project, projectNodes) {
|
||||||
QTC_ASSERT(!project->parentFolderNode(),
|
QTC_ASSERT(!project->parentFolderNode(),
|
||||||
qDebug("Project node has already a parent folder"));
|
qDebug("Project node has already a parent folder"));
|
||||||
project->setParentFolderNode(this);
|
project->setParentFolderNode(this);
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
|
||||||
project->registerWatcher(watcher);
|
|
||||||
m_subFolderNodes.append(project);
|
m_subFolderNodes.append(project);
|
||||||
m_projectNodes.append(project);
|
m_projectNodes.append(project);
|
||||||
}
|
}
|
||||||
@@ -850,8 +740,7 @@ void SessionNode::addProjectNodes(const QList<ProjectNode*> &projectNodes)
|
|||||||
Utils::sort(m_subFolderNodes);
|
Utils::sort(m_subFolderNodes);
|
||||||
Utils::sort(m_projectNodes);
|
Utils::sort(m_projectNodes);
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
ProjectTree::instance()->emitFoldersAdded();
|
||||||
emit watcher->foldersAdded();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -864,8 +753,7 @@ void SessionNode::removeProjectNodes(const QList<ProjectNode*> &projectNodes)
|
|||||||
|
|
||||||
Utils::sort(toRemove);
|
Utils::sort(toRemove);
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
ProjectTree::instance()->emitFoldersAboutToBeRemoved(this, toRemove);
|
||||||
emit watcher->foldersAboutToBeRemoved(this, toRemove);
|
|
||||||
|
|
||||||
QList<FolderNode*>::const_iterator toRemoveIter = toRemove.constBegin();
|
QList<FolderNode*>::const_iterator toRemoveIter = toRemove.constBegin();
|
||||||
QList<FolderNode*>::iterator folderIter = m_subFolderNodes.begin();
|
QList<FolderNode*>::iterator folderIter = m_subFolderNodes.begin();
|
||||||
@@ -885,38 +773,6 @@ void SessionNode::removeProjectNodes(const QList<ProjectNode*> &projectNodes)
|
|||||||
folderIter = m_subFolderNodes.erase(folderIter);
|
folderIter = m_subFolderNodes.erase(folderIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, m_watchers)
|
ProjectTree::instance()->emitFoldersRemoved();
|
||||||
emit watcher->foldersRemoved();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SessionNode::watcherDestroyed(QObject *watcher)
|
|
||||||
{
|
|
||||||
// cannot use qobject_cast here
|
|
||||||
unregisterWatcher(static_cast<NodesWatcher*>(watcher));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\class ProjectExplorer::NodesWatcher
|
|
||||||
|
|
||||||
\brief The NodesWatcher class enables you to keep track of changes in the
|
|
||||||
tree.
|
|
||||||
|
|
||||||
Add a watcher by calling ProjectNode::registerWatcher() or
|
|
||||||
SessionNode::registerWatcher(). Whenever the tree underneath the
|
|
||||||
project node or session node changes (for example, nodes are added or removed),
|
|
||||||
the corresponding signals of the watcher are emitted.
|
|
||||||
Watchers can be removed from the complete tree or a subtree
|
|
||||||
by calling ProjectNode::unregisterWatcher and
|
|
||||||
SessionNode::unregisterWatcher().
|
|
||||||
|
|
||||||
The NodesWatcher class is similar to the Observer class in the
|
|
||||||
well-known Observer pattern (Booch et al).
|
|
||||||
|
|
||||||
\sa ProjectExplorer::Node
|
|
||||||
*/
|
|
||||||
|
|
||||||
NodesWatcher::NodesWatcher(QObject *parent)
|
|
||||||
: QObject(parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -100,14 +100,14 @@ class FileNode;
|
|||||||
class FileContainerNode;
|
class FileContainerNode;
|
||||||
class FolderNode;
|
class FolderNode;
|
||||||
class ProjectNode;
|
class ProjectNode;
|
||||||
class NodesWatcher;
|
|
||||||
class NodesVisitor;
|
class NodesVisitor;
|
||||||
class SessionManager;
|
class SessionManager;
|
||||||
|
|
||||||
// Documentation inside.
|
// Documentation inside.
|
||||||
class PROJECTEXPLORER_EXPORT Node : public QObject {
|
class PROJECTEXPLORER_EXPORT Node
|
||||||
Q_OBJECT
|
{
|
||||||
public:
|
public:
|
||||||
|
virtual ~Node();
|
||||||
NodeType nodeType() const;
|
NodeType nodeType() const;
|
||||||
ProjectNode *projectNode() const; // managing project
|
ProjectNode *projectNode() const; // managing project
|
||||||
FolderNode *parentFolderNode() const; // parent folder or project
|
FolderNode *parentFolderNode() const; // parent folder or project
|
||||||
@@ -136,14 +136,14 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
NodeType m_nodeType;
|
NodeType m_nodeType;
|
||||||
|
int m_line;
|
||||||
ProjectNode *m_projectNode;
|
ProjectNode *m_projectNode;
|
||||||
FolderNode *m_folderNode;
|
FolderNode *m_folderNode;
|
||||||
QString m_path;
|
QString m_path;
|
||||||
int m_line;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class PROJECTEXPLORER_EXPORT FileNode : public Node {
|
class PROJECTEXPLORER_EXPORT FileNode : public Node
|
||||||
Q_OBJECT
|
{
|
||||||
public:
|
public:
|
||||||
FileNode(const QString &filePath, const FileType fileType, bool generated, int line = -1);
|
FileNode(const QString &filePath, const FileType fileType, bool generated, int line = -1);
|
||||||
|
|
||||||
@@ -160,8 +160,8 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Documentation inside.
|
// Documentation inside.
|
||||||
class PROJECTEXPLORER_EXPORT FolderNode : public Node {
|
class PROJECTEXPLORER_EXPORT FolderNode : public Node
|
||||||
Q_OBJECT
|
{
|
||||||
public:
|
public:
|
||||||
explicit FolderNode(const QString &folderPath, NodeType nodeType = FolderNodeType,
|
explicit FolderNode(const QString &folderPath, NodeType nodeType = FolderNodeType,
|
||||||
const QString &displayName = QString());
|
const QString &displayName = QString());
|
||||||
@@ -197,8 +197,6 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
// determines if node will be shown in the flat view, by default folder and projects aren't shown
|
// determines if node will be shown in the flat view, by default folder and projects aren't shown
|
||||||
void aboutToChangeShowInSimpleTree();
|
|
||||||
void showInSimpleTreeChanged();
|
|
||||||
virtual bool showInSimpleTree() const;
|
virtual bool showInSimpleTree() const;
|
||||||
|
|
||||||
void addFileNodes(const QList<FileNode*> &files);
|
void addFileNodes(const QList<FileNode*> &files);
|
||||||
@@ -221,7 +219,6 @@ private:
|
|||||||
|
|
||||||
class PROJECTEXPLORER_EXPORT VirtualFolderNode : public FolderNode
|
class PROJECTEXPLORER_EXPORT VirtualFolderNode : public FolderNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
public:
|
public:
|
||||||
explicit VirtualFolderNode(const QString &folderPath, int priority);
|
explicit VirtualFolderNode(const QString &folderPath, int priority);
|
||||||
virtual ~VirtualFolderNode();
|
virtual ~VirtualFolderNode();
|
||||||
@@ -234,8 +231,6 @@ private:
|
|||||||
// Documentation inside.
|
// Documentation inside.
|
||||||
class PROJECTEXPLORER_EXPORT ProjectNode : public FolderNode
|
class PROJECTEXPLORER_EXPORT ProjectNode : public FolderNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QString vcsTopic() const;
|
QString vcsTopic() const;
|
||||||
|
|
||||||
@@ -253,11 +248,6 @@ public:
|
|||||||
|
|
||||||
virtual QList<RunConfiguration *> runConfigurations() const;
|
virtual QList<RunConfiguration *> runConfigurations() const;
|
||||||
|
|
||||||
|
|
||||||
QList<NodesWatcher*> watchers() const;
|
|
||||||
void registerWatcher(NodesWatcher *watcher);
|
|
||||||
void unregisterWatcher(NodesWatcher *watcher);
|
|
||||||
|
|
||||||
void accept(NodesVisitor *visitor);
|
void accept(NodesVisitor *visitor);
|
||||||
|
|
||||||
bool isEnabled() const { return true; }
|
bool isEnabled() const { return true; }
|
||||||
@@ -272,32 +262,24 @@ protected:
|
|||||||
// will add the persistent stuff
|
// will add the persistent stuff
|
||||||
explicit ProjectNode(const QString &projectFilePath);
|
explicit ProjectNode(const QString &projectFilePath);
|
||||||
|
|
||||||
private slots:
|
|
||||||
void watcherDestroyed(QObject *watcher);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<ProjectNode*> m_subProjectNodes;
|
QList<ProjectNode*> m_subProjectNodes;
|
||||||
QList<NodesWatcher*> m_watchers;
|
|
||||||
|
|
||||||
// let SessionNode call setParentFolderNode
|
// let SessionNode call setParentFolderNode
|
||||||
friend class SessionNode;
|
friend class SessionNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Documentation inside.
|
// Documentation inside.
|
||||||
class PROJECTEXPLORER_EXPORT SessionNode : public FolderNode {
|
class PROJECTEXPLORER_EXPORT SessionNode : public FolderNode
|
||||||
Q_OBJECT
|
{
|
||||||
friend class SessionManager;
|
friend class SessionManager;
|
||||||
public:
|
public:
|
||||||
SessionNode(QObject *parentObject);
|
SessionNode();
|
||||||
|
|
||||||
QList<ProjectAction> supportedActions(Node *node) const;
|
QList<ProjectAction> supportedActions(Node *node) const;
|
||||||
|
|
||||||
QList<ProjectNode*> projectNodes() const;
|
QList<ProjectNode*> projectNodes() const;
|
||||||
|
|
||||||
QList<NodesWatcher*> watchers() const;
|
|
||||||
void registerWatcher(NodesWatcher *watcher);
|
|
||||||
void unregisterWatcher(NodesWatcher *watcher);
|
|
||||||
|
|
||||||
void accept(NodesVisitor *visitor);
|
void accept(NodesVisitor *visitor);
|
||||||
|
|
||||||
bool isEnabled() const { return true; }
|
bool isEnabled() const { return true; }
|
||||||
@@ -308,49 +290,8 @@ protected:
|
|||||||
void addProjectNodes(const QList<ProjectNode*> &projectNodes);
|
void addProjectNodes(const QList<ProjectNode*> &projectNodes);
|
||||||
void removeProjectNodes(const QList<ProjectNode*> &projectNodes);
|
void removeProjectNodes(const QList<ProjectNode*> &projectNodes);
|
||||||
|
|
||||||
private slots:
|
|
||||||
void watcherDestroyed(QObject *watcher);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<ProjectNode*> m_projectNodes;
|
QList<ProjectNode*> m_projectNodes;
|
||||||
QList<NodesWatcher*> m_watchers;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Documentation inside.
|
|
||||||
class PROJECTEXPLORER_EXPORT NodesWatcher : public QObject {
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit NodesWatcher(QObject *parent = 0);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
// everything
|
|
||||||
|
|
||||||
// Emitted whenever the model needs to send a update signal.
|
|
||||||
void nodeUpdated(ProjectExplorer::Node *node);
|
|
||||||
|
|
||||||
// projects
|
|
||||||
void aboutToChangeShowInSimpleTree(ProjectExplorer::FolderNode*);
|
|
||||||
void showInSimpleTreeChanged(ProjectExplorer::FolderNode *node);
|
|
||||||
|
|
||||||
// folders & projects
|
|
||||||
void foldersAboutToBeAdded(FolderNode *parentFolder,
|
|
||||||
const QList<FolderNode*> &newFolders);
|
|
||||||
void foldersAdded();
|
|
||||||
|
|
||||||
void foldersAboutToBeRemoved(FolderNode *parentFolder,
|
|
||||||
const QList<FolderNode*> &staleFolders);
|
|
||||||
void foldersRemoved();
|
|
||||||
|
|
||||||
// files
|
|
||||||
void filesAboutToBeAdded(FolderNode *folder,
|
|
||||||
const QList<FileNode*> &newFiles);
|
|
||||||
void filesAdded();
|
|
||||||
|
|
||||||
void filesAboutToBeRemoved(FolderNode *folder,
|
|
||||||
const QList<FileNode*> &staleFiles);
|
|
||||||
void filesRemoved();
|
|
||||||
void nodeSortKeyAboutToChange(Node *node);
|
|
||||||
void nodeSortKeyChanged();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T1, class T3>
|
template<class T1, class T3>
|
||||||
@@ -452,5 +393,6 @@ T1 subtractSortedList(T1 list1, T1 list2, T3 sorter)
|
|||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(ProjectExplorer::Node *)
|
Q_DECLARE_METATYPE(ProjectExplorer::Node *)
|
||||||
|
Q_DECLARE_METATYPE(ProjectExplorer::FolderNode *)
|
||||||
|
|
||||||
#endif // PROJECTNODES_H
|
#endif // PROJECTNODES_H
|
||||||
|
|||||||
@@ -67,52 +67,12 @@ ProjectTree::ProjectTree(QObject *parent)
|
|||||||
connect(Core::DocumentManager::instance(), &Core::DocumentManager::currentFileChanged,
|
connect(Core::DocumentManager::instance(), &Core::DocumentManager::currentFileChanged,
|
||||||
this, &ProjectTree::documentManagerCurrentFileChanged);
|
this, &ProjectTree::documentManagerCurrentFileChanged);
|
||||||
|
|
||||||
SessionManager *session = SessionManager::instance();
|
|
||||||
connect(session, &SessionManager::aboutToRemoveProject,
|
|
||||||
this, &ProjectTree::aboutToRemoveProject);
|
|
||||||
connect(session, &SessionManager::projectRemoved,
|
|
||||||
this, &ProjectTree::projectRemoved);
|
|
||||||
|
|
||||||
|
|
||||||
m_watcher = new NodesWatcher(this);
|
|
||||||
SessionManager::sessionNode()->registerWatcher(m_watcher);
|
|
||||||
|
|
||||||
connect(m_watcher, &NodesWatcher::foldersAboutToBeRemoved,
|
|
||||||
this, &ProjectTree::foldersAboutToBeRemoved);
|
|
||||||
connect(m_watcher, &NodesWatcher::foldersRemoved,
|
|
||||||
this, &ProjectTree::foldersRemoved);
|
|
||||||
|
|
||||||
connect(m_watcher, &NodesWatcher::filesAboutToBeRemoved,
|
|
||||||
this, &ProjectTree::filesAboutToBeRemoved);
|
|
||||||
connect(m_watcher, &NodesWatcher::filesRemoved,
|
|
||||||
this, &ProjectTree::filesRemoved);
|
|
||||||
|
|
||||||
connect(m_watcher, &NodesWatcher::foldersAdded,
|
|
||||||
this, &ProjectTree::nodesAdded);
|
|
||||||
connect(m_watcher, &NodesWatcher::filesAdded,
|
|
||||||
this, &ProjectTree::nodesAdded);
|
|
||||||
|
|
||||||
connect(qApp, &QApplication::focusChanged,
|
connect(qApp, &QApplication::focusChanged,
|
||||||
this, &ProjectTree::focusChanged);
|
this, &ProjectTree::focusChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTree::aboutToShutDown()
|
void ProjectTree::aboutToShutDown()
|
||||||
{
|
{
|
||||||
disconnect(s_instance->m_watcher, &NodesWatcher::foldersAboutToBeRemoved,
|
|
||||||
s_instance, &ProjectTree::foldersAboutToBeRemoved);
|
|
||||||
disconnect(s_instance->m_watcher, &NodesWatcher::foldersRemoved,
|
|
||||||
s_instance, &ProjectTree::foldersRemoved);
|
|
||||||
|
|
||||||
disconnect(s_instance->m_watcher, &NodesWatcher::filesAboutToBeRemoved,
|
|
||||||
s_instance, &ProjectTree::filesAboutToBeRemoved);
|
|
||||||
disconnect(s_instance->m_watcher, &NodesWatcher::filesRemoved,
|
|
||||||
s_instance, &ProjectTree::filesRemoved);
|
|
||||||
|
|
||||||
disconnect(s_instance->m_watcher, &NodesWatcher::foldersAdded,
|
|
||||||
s_instance, &ProjectTree::nodesAdded);
|
|
||||||
disconnect(s_instance->m_watcher, &NodesWatcher::filesAdded,
|
|
||||||
s_instance, &ProjectTree::nodesAdded);
|
|
||||||
|
|
||||||
disconnect(qApp, &QApplication::focusChanged,
|
disconnect(qApp, &QApplication::focusChanged,
|
||||||
s_instance, &ProjectTree::focusChanged);
|
s_instance, &ProjectTree::focusChanged);
|
||||||
s_instance->update(0, 0);
|
s_instance->update(0, 0);
|
||||||
@@ -187,7 +147,7 @@ Project *ProjectTree::projectForNode(Node *node)
|
|||||||
if (!node)
|
if (!node)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
FolderNode *rootProjectNode = qobject_cast<FolderNode*>(node);
|
FolderNode *rootProjectNode = dynamic_cast<FolderNode*>(node);
|
||||||
if (!rootProjectNode)
|
if (!rootProjectNode)
|
||||||
rootProjectNode = node->parentFolderNode();
|
rootProjectNode = node->parentFolderNode();
|
||||||
|
|
||||||
@@ -220,19 +180,18 @@ void ProjectTree::update(Node *node, Project *project)
|
|||||||
{
|
{
|
||||||
if (project != m_currentProject) {
|
if (project != m_currentProject) {
|
||||||
if (m_currentProject) {
|
if (m_currentProject) {
|
||||||
disconnect(m_currentProject.data(), &Project::projectContextUpdated,
|
disconnect(m_currentProject, &Project::projectContextUpdated,
|
||||||
this, &ProjectTree::updateContext);
|
this, &ProjectTree::updateContext);
|
||||||
disconnect(m_currentProject.data(), &Project::projectLanguagesUpdated,
|
disconnect(m_currentProject, &Project::projectLanguagesUpdated,
|
||||||
this, &ProjectTree::updateContext);
|
this, &ProjectTree::updateContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_currentProject = project;
|
m_currentProject = project;
|
||||||
emit currentProjectChanged(m_currentProject);
|
|
||||||
|
|
||||||
if (m_currentProject) {
|
if (m_currentProject) {
|
||||||
connect(m_currentProject.data(), &Project::projectContextUpdated,
|
connect(m_currentProject, &Project::projectContextUpdated,
|
||||||
this, &ProjectTree::updateContext);
|
this, &ProjectTree::updateContext);
|
||||||
connect(m_currentProject.data(), &Project::projectLanguagesUpdated,
|
connect(m_currentProject, &Project::projectLanguagesUpdated,
|
||||||
this, &ProjectTree::updateContext);
|
this, &ProjectTree::updateContext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -248,6 +207,8 @@ void ProjectTree::update(Node *node, Project *project)
|
|||||||
emit currentNodeChanged(m_currentNode, project);
|
emit currentNodeChanged(m_currentNode, project);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emit currentProjectChanged(m_currentProject);
|
||||||
|
|
||||||
updateContext();
|
updateContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,55 +230,107 @@ void ProjectTree::updateContext()
|
|||||||
Core::ICore::updateAdditionalContexts(oldContext, newContext);
|
Core::ICore::updateAdditionalContexts(oldContext, newContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTree::foldersAboutToBeRemoved(FolderNode *, const QList<FolderNode*> &list)
|
void ProjectTree::emitNodeUpdated(Node *node)
|
||||||
|
{
|
||||||
|
emit nodeUpdated(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectTree::emitAboutToChangeShowInSimpleTree(FolderNode *node)
|
||||||
|
{
|
||||||
|
emit aboutToChangeShowInSimpleTree(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectTree::emitShowInSimpleTreeChanged(FolderNode *node)
|
||||||
|
{
|
||||||
|
emit showInSimpleTreeChanged(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectTree::emitFoldersAboutToBeAdded(FolderNode *parentFolder, const QList<FolderNode *> &newFolders)
|
||||||
|
{
|
||||||
|
emit foldersAboutToBeAdded(parentFolder, newFolders);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectTree::emitFoldersAdded()
|
||||||
|
{
|
||||||
|
emit foldersAdded();
|
||||||
|
|
||||||
|
if (Utils::anyOf(m_projectTreeWidgets, &ProjectTreeWidget::hasFocus))
|
||||||
|
return;
|
||||||
|
|
||||||
|
updateFromDocumentManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectTree::emitFoldersAboutToBeRemoved(FolderNode *parentFolder, const QList<FolderNode *> &staleFolders)
|
||||||
{
|
{
|
||||||
Node *n = ProjectTree::currentNode();
|
Node *n = ProjectTree::currentNode();
|
||||||
while (n) {
|
while (n) {
|
||||||
if (FolderNode *fn = qobject_cast<FolderNode *>(n)) {
|
if (FolderNode *fn = dynamic_cast<FolderNode *>(n)) {
|
||||||
if (list.contains(fn)) {
|
if (staleFolders.contains(fn)) {
|
||||||
ProjectNode *pn = n->projectNode();
|
ProjectNode *pn = n->projectNode();
|
||||||
// Make sure the node we are switching too isn't going to be removed also
|
// Make sure the node we are switching too isn't going to be removed also
|
||||||
while (list.contains(pn))
|
while (staleFolders.contains(pn))
|
||||||
pn = pn->parentFolderNode()->projectNode();
|
pn = pn->parentFolderNode()->projectNode();
|
||||||
m_resetCurrentNodeFolder = true;
|
m_resetCurrentNodeFolder = true;
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
n = n->parentFolderNode();
|
n = n->parentFolderNode();
|
||||||
}
|
}
|
||||||
|
emit foldersAboutToBeRemoved(parentFolder, staleFolders);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTree::foldersRemoved()
|
void ProjectTree::emitFoldersRemoved()
|
||||||
{
|
{
|
||||||
QTimer::singleShot(0, this, SLOT(updateFromFocusResetFolderSingleShot()));
|
emit foldersRemoved();
|
||||||
|
|
||||||
|
if (m_resetCurrentNodeFolder) {
|
||||||
|
updateFromFocus(true);
|
||||||
|
m_resetCurrentNodeFolder = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTree::filesAboutToBeRemoved(FolderNode *, const QList<FileNode*> &list)
|
void ProjectTree::emitFilesAboutToBeAdded(FolderNode *folder, const QList<FileNode *> &newFiles)
|
||||||
{
|
{
|
||||||
if (FileNode *fileNode = qobject_cast<FileNode *>(m_currentNode))
|
emit filesAboutToBeAdded(folder, newFiles);
|
||||||
if (list.contains(fileNode))
|
}
|
||||||
|
|
||||||
|
void ProjectTree::emitFilesAdded()
|
||||||
|
{
|
||||||
|
emit filesAdded();
|
||||||
|
|
||||||
|
if (Utils::anyOf(m_projectTreeWidgets, &ProjectTreeWidget::hasFocus))
|
||||||
|
return;
|
||||||
|
|
||||||
|
updateFromDocumentManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectTree::emitFilesAboutToBeRemoved(FolderNode *folder, const QList<FileNode *> &staleFiles)
|
||||||
|
{
|
||||||
|
if (FileNode *fileNode = dynamic_cast<FileNode *>(m_currentNode))
|
||||||
|
if (staleFiles.contains(fileNode))
|
||||||
m_resetCurrentNodeFile = false;
|
m_resetCurrentNodeFile = false;
|
||||||
|
|
||||||
|
emit filesAboutToBeRemoved(folder, staleFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTree::filesRemoved()
|
void ProjectTree::emitFilesRemoved()
|
||||||
{
|
{
|
||||||
QTimer::singleShot(0, this, SLOT(updateFromFocusResetFileSingleShot()));
|
emit filesRemoved();
|
||||||
|
|
||||||
|
if (m_resetCurrentNodeFile) {
|
||||||
|
updateFromFocus(true);
|
||||||
|
m_resetCurrentNodeFile = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTree::aboutToRemoveProject(Project *project)
|
void ProjectTree::emitNodeSortKeyAboutToChange(Node *node)
|
||||||
{
|
{
|
||||||
if (m_currentProject == project)
|
emit nodeSortKeyAboutToChange(node);
|
||||||
m_resetCurrentNodeProject = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTree::projectRemoved()
|
void ProjectTree::emitNodeSortKeyChanged()
|
||||||
{
|
{
|
||||||
QTimer::singleShot(0, this, SLOT(updateFromFocusResetProjectSingleShot()));
|
emit nodeSortKeyChanged();
|
||||||
}
|
|
||||||
|
|
||||||
void ProjectTree::nodesAdded()
|
|
||||||
{
|
|
||||||
QTimer::singleShot(0, this, SLOT(updateFromDocumentManagerSingleShot()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTree::updateExternalFileWarning()
|
void ProjectTree::updateExternalFileWarning()
|
||||||
@@ -359,32 +372,3 @@ bool ProjectTree::hasFocus(ProjectTreeWidget *widget)
|
|||||||
{
|
{
|
||||||
return widget && widget->focusWidget() && widget->focusWidget()->hasFocus();
|
return widget && widget->focusWidget() && widget->focusWidget()->hasFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectTree::updateFromFocusResetFileSingleShot()
|
|
||||||
{
|
|
||||||
if (m_resetCurrentNodeFile) {
|
|
||||||
updateFromFocus(true);
|
|
||||||
m_resetCurrentNodeFile = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProjectTree::updateFromFocusResetFolderSingleShot()
|
|
||||||
{
|
|
||||||
if (m_resetCurrentNodeFolder) {
|
|
||||||
updateFromFocus(true);
|
|
||||||
m_resetCurrentNodeFolder = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProjectTree::updateFromFocusResetProjectSingleShot()
|
|
||||||
{
|
|
||||||
updateFromFocus(true);
|
|
||||||
m_resetCurrentNodeProject = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProjectTree::updateFromDocumentManagerSingleShot()
|
|
||||||
{
|
|
||||||
if (Utils::anyOf(m_projectTreeWidgets, &ProjectTreeWidget::hasFocus))
|
|
||||||
return;
|
|
||||||
updateFromDocumentManager();
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -35,14 +35,13 @@
|
|||||||
|
|
||||||
#include <coreplugin/icontext.h>
|
#include <coreplugin/icontext.h>
|
||||||
|
|
||||||
#include <QPointer>
|
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
class FileNode;
|
class FileNode;
|
||||||
class FolderNode;
|
class FolderNode;
|
||||||
class Node;
|
class Node;
|
||||||
class NodesWatcher;
|
|
||||||
class Project;
|
class Project;
|
||||||
|
class ProjectNode;
|
||||||
|
class SessionNode;
|
||||||
|
|
||||||
namespace Internal { class ProjectTreeWidget; }
|
namespace Internal { class ProjectTreeWidget; }
|
||||||
|
|
||||||
@@ -68,6 +67,60 @@ signals:
|
|||||||
void currentProjectChanged(ProjectExplorer::Project *project);
|
void currentProjectChanged(ProjectExplorer::Project *project);
|
||||||
void currentNodeChanged(ProjectExplorer::Node *node, ProjectExplorer::Project *project);
|
void currentNodeChanged(ProjectExplorer::Node *node, ProjectExplorer::Project *project);
|
||||||
|
|
||||||
|
// Emitted whenever the model needs to send a update signal.
|
||||||
|
void nodeUpdated(ProjectExplorer::Node *node);
|
||||||
|
|
||||||
|
// projects
|
||||||
|
void aboutToChangeShowInSimpleTree(ProjectExplorer::FolderNode*);
|
||||||
|
void showInSimpleTreeChanged(ProjectExplorer::FolderNode *node);
|
||||||
|
|
||||||
|
// folders & projects
|
||||||
|
void foldersAboutToBeAdded(FolderNode *parentFolder,
|
||||||
|
const QList<FolderNode*> &newFolders);
|
||||||
|
void foldersAdded();
|
||||||
|
|
||||||
|
void foldersAboutToBeRemoved(FolderNode *parentFolder,
|
||||||
|
const QList<FolderNode*> &staleFolders);
|
||||||
|
void foldersRemoved();
|
||||||
|
|
||||||
|
// files
|
||||||
|
void filesAboutToBeAdded(FolderNode *folder,
|
||||||
|
const QList<FileNode*> &newFiles);
|
||||||
|
void filesAdded();
|
||||||
|
|
||||||
|
void filesAboutToBeRemoved(FolderNode *folder,
|
||||||
|
const QList<FileNode*> &staleFiles);
|
||||||
|
void filesRemoved();
|
||||||
|
void nodeSortKeyAboutToChange(Node *node);
|
||||||
|
void nodeSortKeyChanged();
|
||||||
|
|
||||||
|
public: // for nodes to emit signals, do not call unless you are a node
|
||||||
|
void emitNodeUpdated(ProjectExplorer::Node *node);
|
||||||
|
|
||||||
|
// projects
|
||||||
|
void emitAboutToChangeShowInSimpleTree(ProjectExplorer::FolderNode *node);
|
||||||
|
void emitShowInSimpleTreeChanged(ProjectExplorer::FolderNode *node);
|
||||||
|
|
||||||
|
// folders & projects
|
||||||
|
void emitFoldersAboutToBeAdded(FolderNode *parentFolder,
|
||||||
|
const QList<FolderNode*> &newFolders);
|
||||||
|
void emitFoldersAdded();
|
||||||
|
|
||||||
|
void emitFoldersAboutToBeRemoved(FolderNode *parentFolder,
|
||||||
|
const QList<FolderNode*> &staleFolders);
|
||||||
|
void emitFoldersRemoved();
|
||||||
|
|
||||||
|
// files
|
||||||
|
void emitFilesAboutToBeAdded(FolderNode *folder,
|
||||||
|
const QList<FileNode*> &newFiles);
|
||||||
|
void emitFilesAdded();
|
||||||
|
|
||||||
|
void emitFilesAboutToBeRemoved(FolderNode *folder,
|
||||||
|
const QList<FileNode*> &staleFiles);
|
||||||
|
void emitFilesRemoved();
|
||||||
|
void emitNodeSortKeyAboutToChange(Node *node);
|
||||||
|
void emitNodeSortKeyChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void focusChanged();
|
void focusChanged();
|
||||||
void updateFromProjectTreeWidget(Internal::ProjectTreeWidget *widget);
|
void updateFromProjectTreeWidget(Internal::ProjectTreeWidget *widget);
|
||||||
@@ -76,36 +129,20 @@ private:
|
|||||||
void update(Node *node, Project *project);
|
void update(Node *node, Project *project);
|
||||||
void updateContext();
|
void updateContext();
|
||||||
|
|
||||||
// slots to kepp the current node/current project from deletion
|
|
||||||
void foldersAboutToBeRemoved(FolderNode *, const QList<FolderNode *> &list);
|
|
||||||
void foldersRemoved();
|
|
||||||
void filesAboutToBeRemoved(FolderNode *, const QList<FileNode *> &list);
|
|
||||||
void filesRemoved();
|
|
||||||
void aboutToRemoveProject(Project *project);
|
|
||||||
void projectRemoved();
|
|
||||||
|
|
||||||
void nodesAdded();
|
|
||||||
void updateFromFocus(bool invalidCurrentNode = false);
|
void updateFromFocus(bool invalidCurrentNode = false);
|
||||||
|
|
||||||
void updateExternalFileWarning();
|
void updateExternalFileWarning();
|
||||||
static bool hasFocus(Internal::ProjectTreeWidget *widget);
|
static bool hasFocus(Internal::ProjectTreeWidget *widget);
|
||||||
|
|
||||||
private slots: // use lambdas for the following when minimum Qt is 5.4
|
|
||||||
void updateFromFocusResetFileSingleShot();
|
|
||||||
void updateFromFocusResetFolderSingleShot();
|
|
||||||
void updateFromFocusResetProjectSingleShot();
|
|
||||||
void updateFromDocumentManagerSingleShot();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static ProjectTree *s_instance;
|
static ProjectTree *s_instance;
|
||||||
QList<Internal::ProjectTreeWidget *> m_projectTreeWidgets;
|
QList<Internal::ProjectTreeWidget *> m_projectTreeWidgets;
|
||||||
Node *m_currentNode;
|
Node *m_currentNode;
|
||||||
QPointer<Project> m_currentProject;
|
Project *m_currentProject;
|
||||||
bool m_resetCurrentNodeFolder;
|
bool m_resetCurrentNodeFolder;
|
||||||
bool m_resetCurrentNodeFile;
|
bool m_resetCurrentNodeFile;
|
||||||
bool m_resetCurrentNodeProject;
|
bool m_resetCurrentNodeProject;
|
||||||
Core::Context m_lastProjectContext;
|
Core::Context m_lastProjectContext;
|
||||||
NodesWatcher *m_watcher;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ SessionManager::SessionManager(QObject *parent)
|
|||||||
m_instance = this;
|
m_instance = this;
|
||||||
d = new SessionManagerPrivate;
|
d = new SessionManagerPrivate;
|
||||||
|
|
||||||
d->m_sessionNode = new SessionNode(this);
|
d->m_sessionNode = new SessionNode;
|
||||||
|
|
||||||
connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
|
connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
|
||||||
this, SLOT(saveActiveMode(Core::IMode*)));
|
this, SLOT(saveActiveMode(Core::IMode*)));
|
||||||
@@ -155,6 +155,7 @@ SessionManager::~SessionManager()
|
|||||||
{
|
{
|
||||||
emit m_instance->aboutToUnloadSession(d->m_sessionName);
|
emit m_instance->aboutToUnloadSession(d->m_sessionName);
|
||||||
delete d->m_writer;
|
delete d->m_writer;
|
||||||
|
delete d->m_sessionNode;
|
||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -561,7 +562,7 @@ Project *SessionManager::projectForNode(Node *node)
|
|||||||
if (!node)
|
if (!node)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
FolderNode *rootProjectNode = qobject_cast<FolderNode*>(node);
|
FolderNode *rootProjectNode = dynamic_cast<FolderNode*>(node);
|
||||||
if (!rootProjectNode)
|
if (!rootProjectNode)
|
||||||
rootProjectNode = node->parentFolderNode();
|
rootProjectNode = node->parentFolderNode();
|
||||||
|
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ QIcon QbsProductNode::m_productIcon;
|
|||||||
static QbsProjectNode *parentQbsProjectNode(ProjectExplorer::Node *node)
|
static QbsProjectNode *parentQbsProjectNode(ProjectExplorer::Node *node)
|
||||||
{
|
{
|
||||||
for (ProjectExplorer::FolderNode *pn = node->projectNode(); pn; pn = pn->parentFolderNode()) {
|
for (ProjectExplorer::FolderNode *pn = node->projectNode(); pn; pn = pn->parentFolderNode()) {
|
||||||
QbsProjectNode *prjNode = qobject_cast<QbsProjectNode *>(pn);
|
QbsProjectNode *prjNode = dynamic_cast<QbsProjectNode *>(pn);
|
||||||
if (prjNode)
|
if (prjNode)
|
||||||
return prjNode;
|
return prjNode;
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ static QbsProjectNode *parentQbsProjectNode(ProjectExplorer::Node *node)
|
|||||||
static QbsProductNode *parentQbsProductNode(ProjectExplorer::Node *node)
|
static QbsProductNode *parentQbsProductNode(ProjectExplorer::Node *node)
|
||||||
{
|
{
|
||||||
for (; node; node = node->parentFolderNode()) {
|
for (; node; node = node->parentFolderNode()) {
|
||||||
QbsProductNode *prdNode = qobject_cast<QbsProductNode *>(node);
|
QbsProductNode *prdNode = dynamic_cast<QbsProductNode *>(node);
|
||||||
if (prdNode)
|
if (prdNode)
|
||||||
return prdNode;
|
return prdNode;
|
||||||
}
|
}
|
||||||
@@ -452,7 +452,7 @@ void QbsGroupNode::updateQbsGroupData(const qbs::GroupData &grp, const QString &
|
|||||||
|
|
||||||
QbsFileNode *idx = 0;
|
QbsFileNode *idx = 0;
|
||||||
foreach (ProjectExplorer::FileNode *fn, fileNodes()) {
|
foreach (ProjectExplorer::FileNode *fn, fileNodes()) {
|
||||||
idx = qobject_cast<QbsFileNode *>(fn);
|
idx = dynamic_cast<QbsFileNode *>(fn);
|
||||||
if (idx)
|
if (idx)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -498,7 +498,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
|
|||||||
|
|
||||||
QList<ProjectExplorer::FileNode *> filesToRemove;
|
QList<ProjectExplorer::FileNode *> filesToRemove;
|
||||||
foreach (ProjectExplorer::FileNode *fn, root->fileNodes()) {
|
foreach (ProjectExplorer::FileNode *fn, root->fileNodes()) {
|
||||||
if (!qobject_cast<QbsFileNode *>(fn))
|
if (!dynamic_cast<QbsFileNode *>(fn))
|
||||||
filesToRemove << fn;
|
filesToRemove << fn;
|
||||||
}
|
}
|
||||||
QList<ProjectExplorer::FileNode *> filesToAdd;
|
QList<ProjectExplorer::FileNode *> filesToAdd;
|
||||||
@@ -664,7 +664,7 @@ void QbsProductNode::setQbsProductData(const qbs::Project &project, const qbs::P
|
|||||||
// Find the QbsFileNode we added earlier:
|
// Find the QbsFileNode we added earlier:
|
||||||
QbsFileNode *idx = 0;
|
QbsFileNode *idx = 0;
|
||||||
foreach (ProjectExplorer::FileNode *fn, fileNodes()) {
|
foreach (ProjectExplorer::FileNode *fn, fileNodes()) {
|
||||||
idx = qobject_cast<QbsFileNode *>(fn);
|
idx = dynamic_cast<QbsFileNode *>(fn);
|
||||||
if (idx)
|
if (idx)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -701,7 +701,7 @@ void QbsProductNode::setQbsProductData(const qbs::Project &project, const qbs::P
|
|||||||
QList<ProjectExplorer::RunConfiguration *> QbsProductNode::runConfigurations() const
|
QList<ProjectExplorer::RunConfiguration *> QbsProductNode::runConfigurations() const
|
||||||
{
|
{
|
||||||
QList<ProjectExplorer::RunConfiguration *> result;
|
QList<ProjectExplorer::RunConfiguration *> result;
|
||||||
QbsProjectNode *pn = qobject_cast<QbsProjectNode *>(projectNode());
|
QbsProjectNode *pn = dynamic_cast<QbsProjectNode *>(projectNode());
|
||||||
if (!isEnabled() || !pn || !pn->qbsProject().isValid()
|
if (!isEnabled() || !pn || !pn->qbsProject().isValid()
|
||||||
|| pn->qbsProject().targetExecutable(m_qbsProductData, qbs::InstallOptions()).isEmpty()) {
|
|| pn->qbsProject().targetExecutable(m_qbsProductData, qbs::InstallOptions()).isEmpty()) {
|
||||||
return result;
|
return result;
|
||||||
@@ -808,7 +808,7 @@ void QbsProjectNode::ctor()
|
|||||||
QbsProductNode *QbsProjectNode::findProductNode(const QString &uniqueName)
|
QbsProductNode *QbsProjectNode::findProductNode(const QString &uniqueName)
|
||||||
{
|
{
|
||||||
foreach (ProjectExplorer::ProjectNode *n, subProjectNodes()) {
|
foreach (ProjectExplorer::ProjectNode *n, subProjectNodes()) {
|
||||||
QbsProductNode *qn = qobject_cast<QbsProductNode *>(n);
|
QbsProductNode *qn = dynamic_cast<QbsProductNode *>(n);
|
||||||
if (qn && QbsProject::uniqueProductName(qn->qbsProductData()) == uniqueName)
|
if (qn && QbsProject::uniqueProductName(qn->qbsProductData()) == uniqueName)
|
||||||
return qn;
|
return qn;
|
||||||
}
|
}
|
||||||
@@ -818,7 +818,7 @@ QbsProductNode *QbsProjectNode::findProductNode(const QString &uniqueName)
|
|||||||
QbsProjectNode *QbsProjectNode::findProjectNode(const QString &name)
|
QbsProjectNode *QbsProjectNode::findProjectNode(const QString &name)
|
||||||
{
|
{
|
||||||
foreach (ProjectExplorer::ProjectNode *n, subProjectNodes()) {
|
foreach (ProjectExplorer::ProjectNode *n, subProjectNodes()) {
|
||||||
QbsProjectNode *qn = qobject_cast<QbsProjectNode *>(n);
|
QbsProjectNode *qn = dynamic_cast<QbsProjectNode *>(n);
|
||||||
if (qn && qn->qbsProjectData().name() == name)
|
if (qn && qn->qbsProjectData().name() == name)
|
||||||
return qn;
|
return qn;
|
||||||
}
|
}
|
||||||
@@ -833,7 +833,8 @@ QbsRootProjectNode::QbsRootProjectNode(QbsProject *project) :
|
|||||||
QbsProjectNode(project->projectFilePath().toString()),
|
QbsProjectNode(project->projectFilePath().toString()),
|
||||||
m_project(project),
|
m_project(project),
|
||||||
m_buildSystemFiles(new ProjectExplorer::FolderNode(project->projectDirectory().toString(),
|
m_buildSystemFiles(new ProjectExplorer::FolderNode(project->projectDirectory().toString(),
|
||||||
ProjectExplorer::FolderNodeType, tr("Qbs files")))
|
ProjectExplorer::FolderNodeType,
|
||||||
|
QCoreApplication::translate("QbsRootProjectNode", "Qbs files")))
|
||||||
{
|
{
|
||||||
addFolderNodes(QList<FolderNode *>() << m_buildSystemFiles);
|
addFolderNodes(QList<FolderNode *>() << m_buildSystemFiles);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ class QbsProjectFile;
|
|||||||
|
|
||||||
class QbsFileNode : public ProjectExplorer::FileNode
|
class QbsFileNode : public ProjectExplorer::FileNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
public:
|
public:
|
||||||
QbsFileNode(const QString &filePath, const ProjectExplorer::FileType fileType, bool generated,
|
QbsFileNode(const QString &filePath, const ProjectExplorer::FileType fileType, bool generated,
|
||||||
int line);
|
int line);
|
||||||
@@ -66,8 +65,6 @@ class QbsGroupNode;
|
|||||||
|
|
||||||
class QbsBaseProjectNode : public ProjectExplorer::ProjectNode
|
class QbsBaseProjectNode : public ProjectExplorer::ProjectNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit QbsBaseProjectNode(const QString &path);
|
explicit QbsBaseProjectNode(const QString &path);
|
||||||
|
|
||||||
@@ -96,8 +93,6 @@ private:
|
|||||||
|
|
||||||
class QbsGroupNode : public QbsBaseProjectNode
|
class QbsGroupNode : public QbsBaseProjectNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QbsGroupNode(const qbs::GroupData &grp, const QString &productPath);
|
QbsGroupNode(const qbs::GroupData &grp, const QString &productPath);
|
||||||
|
|
||||||
@@ -131,8 +126,6 @@ private:
|
|||||||
|
|
||||||
class QbsProductNode : public QbsBaseProjectNode
|
class QbsProductNode : public QbsBaseProjectNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit QbsProductNode(const qbs::Project &project, const qbs::ProductData &prd);
|
explicit QbsProductNode(const qbs::Project &project, const qbs::ProductData &prd);
|
||||||
|
|
||||||
@@ -161,8 +154,6 @@ private:
|
|||||||
|
|
||||||
class QbsProjectNode : public QbsBaseProjectNode
|
class QbsProjectNode : public QbsBaseProjectNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit QbsProjectNode(const QString &path);
|
explicit QbsProjectNode(const QString &path);
|
||||||
~QbsProjectNode();
|
~QbsProjectNode();
|
||||||
@@ -192,8 +183,6 @@ private:
|
|||||||
|
|
||||||
class QbsRootProjectNode : public QbsProjectNode
|
class QbsRootProjectNode : public QbsProjectNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit QbsRootProjectNode(QbsProject *project);
|
explicit QbsRootProjectNode(QbsProject *project);
|
||||||
|
|
||||||
|
|||||||
@@ -253,8 +253,8 @@ void QbsProjectManagerPlugin::updateContextActions()
|
|||||||
&& m_selectedNode && m_selectedNode->isEnabled();
|
&& m_selectedNode && m_selectedNode->isEnabled();
|
||||||
|
|
||||||
bool isFile = m_selectedProject && m_selectedNode && (m_selectedNode->nodeType() == ProjectExplorer::FileNodeType);
|
bool isFile = m_selectedProject && m_selectedNode && (m_selectedNode->nodeType() == ProjectExplorer::FileNodeType);
|
||||||
bool isProduct = m_selectedProject && m_selectedNode && qobject_cast<QbsProductNode *>(m_selectedNode->projectNode());
|
bool isProduct = m_selectedProject && m_selectedNode && dynamic_cast<QbsProductNode *>(m_selectedNode->projectNode());
|
||||||
QbsProjectNode *subproject = qobject_cast<QbsProjectNode *>(m_selectedNode);
|
QbsProjectNode *subproject = dynamic_cast<QbsProjectNode *>(m_selectedNode);
|
||||||
bool isSubproject = m_selectedProject && subproject && subproject != m_selectedProject->rootProjectNode();
|
bool isSubproject = m_selectedProject && subproject && subproject != m_selectedProject->rootProjectNode();
|
||||||
|
|
||||||
m_reparseQbsCtx->setEnabled(isEnabled);
|
m_reparseQbsCtx->setEnabled(isEnabled);
|
||||||
@@ -287,16 +287,16 @@ void QbsProjectManagerPlugin::updateBuildActions()
|
|||||||
&& !m_editorProject->isParsing();
|
&& !m_editorProject->isParsing();
|
||||||
|
|
||||||
fileName = QFileInfo(m_editorNode->path()).fileName();
|
fileName = QFileInfo(m_editorNode->path()).fileName();
|
||||||
fileVisible = m_editorProject && m_editorNode && qobject_cast<QbsBaseProjectNode *>(m_editorNode->projectNode());
|
fileVisible = m_editorProject && m_editorNode && dynamic_cast<QbsBaseProjectNode *>(m_editorNode->projectNode());
|
||||||
|
|
||||||
QbsProductNode *productNode
|
QbsProductNode *productNode
|
||||||
= qobject_cast<QbsProductNode *>(m_editorNode ? m_editorNode->projectNode() : 0);
|
= dynamic_cast<QbsProductNode *>(m_editorNode ? m_editorNode->projectNode() : 0);
|
||||||
if (productNode) {
|
if (productNode) {
|
||||||
productVisible = true;
|
productVisible = true;
|
||||||
productName = productNode->displayName();
|
productName = productNode->displayName();
|
||||||
}
|
}
|
||||||
QbsProjectNode *subprojectNode
|
QbsProjectNode *subprojectNode
|
||||||
= qobject_cast<QbsProjectNode *>(productNode ? productNode->parentFolderNode() : 0);
|
= dynamic_cast<QbsProjectNode *>(productNode ? productNode->parentFolderNode() : 0);
|
||||||
if (subprojectNode && m_editorProject && subprojectNode != m_editorProject->rootProjectNode()) {
|
if (subprojectNode && m_editorProject && subprojectNode != m_editorProject->rootProjectNode()) {
|
||||||
subprojectVisible = true;
|
subprojectVisible = true;
|
||||||
subprojectName = subprojectNode->displayName();
|
subprojectName = subprojectNode->displayName();
|
||||||
@@ -375,7 +375,7 @@ void QbsProjectManagerPlugin::buildProductContextMenu()
|
|||||||
QTC_ASSERT(m_selectedNode, return);
|
QTC_ASSERT(m_selectedNode, return);
|
||||||
QTC_ASSERT(m_selectedProject, return);
|
QTC_ASSERT(m_selectedProject, return);
|
||||||
|
|
||||||
const QbsProductNode * const productNode = qobject_cast<QbsProductNode *>(m_selectedNode);
|
const QbsProductNode * const productNode = dynamic_cast<QbsProductNode *>(m_selectedNode);
|
||||||
QTC_ASSERT(productNode, return);
|
QTC_ASSERT(productNode, return);
|
||||||
|
|
||||||
buildProducts(m_selectedProject,
|
buildProducts(m_selectedProject,
|
||||||
@@ -387,7 +387,7 @@ void QbsProjectManagerPlugin::buildProduct()
|
|||||||
if (!m_editorProject || !m_editorNode)
|
if (!m_editorProject || !m_editorNode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QbsProductNode *product = qobject_cast<QbsProductNode *>(m_editorNode->projectNode());
|
QbsProductNode *product = dynamic_cast<QbsProductNode *>(m_editorNode->projectNode());
|
||||||
|
|
||||||
if (!product)
|
if (!product)
|
||||||
return;
|
return;
|
||||||
@@ -401,7 +401,7 @@ void QbsProjectManagerPlugin::buildSubprojectContextMenu()
|
|||||||
QTC_ASSERT(m_selectedNode, return);
|
QTC_ASSERT(m_selectedNode, return);
|
||||||
QTC_ASSERT(m_selectedProject, return);
|
QTC_ASSERT(m_selectedProject, return);
|
||||||
|
|
||||||
QbsProjectNode *subProject = qobject_cast<QbsProjectNode *>(m_selectedNode);
|
QbsProjectNode *subProject = dynamic_cast<QbsProjectNode *>(m_selectedNode);
|
||||||
QTC_ASSERT(subProject, return);
|
QTC_ASSERT(subProject, return);
|
||||||
|
|
||||||
QStringList toBuild;
|
QStringList toBuild;
|
||||||
@@ -417,14 +417,14 @@ void QbsProjectManagerPlugin::buildSubproject()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
QbsProjectNode *subproject = 0;
|
QbsProjectNode *subproject = 0;
|
||||||
QbsBaseProjectNode *start = qobject_cast<QbsBaseProjectNode *>(m_editorNode->projectNode());
|
QbsBaseProjectNode *start = dynamic_cast<QbsBaseProjectNode *>(m_editorNode->projectNode());
|
||||||
while (start && start != m_editorProject->rootProjectNode()) {
|
while (start && start != m_editorProject->rootProjectNode()) {
|
||||||
QbsProjectNode *tmp = qobject_cast<QbsProjectNode *>(start);
|
QbsProjectNode *tmp = dynamic_cast<QbsProjectNode *>(start);
|
||||||
if (tmp) {
|
if (tmp) {
|
||||||
subproject = tmp;
|
subproject = tmp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
start = qobject_cast<QbsProjectNode *>(start->parentFolderNode());
|
start = dynamic_cast<QbsProjectNode *>(start->parentFolderNode());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!subproject)
|
if (!subproject)
|
||||||
|
|||||||
@@ -43,6 +43,6 @@ QList<QmakeProFileNode *> FindQmakeProFiles::operator()(ProjectExplorer::Project
|
|||||||
|
|
||||||
void FindQmakeProFiles::visitProjectNode(ProjectExplorer::ProjectNode *projectNode)
|
void FindQmakeProFiles::visitProjectNode(ProjectExplorer::ProjectNode *projectNode)
|
||||||
{
|
{
|
||||||
if (QmakeProFileNode *pro = qobject_cast<QmakeProFileNode *>(projectNode))
|
if (QmakeProFileNode *pro = dynamic_cast<QmakeProFileNode *>(projectNode))
|
||||||
m_proFiles.append(pro);
|
m_proFiles.append(pro);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -888,7 +888,7 @@ bool PackageLibraryDetailsController::isLinkPackageGenerated() const
|
|||||||
if (!project)
|
if (!project)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const QmakeProFileNode *rootProject = qobject_cast<const QmakeProFileNode *>(project->rootProjectNode());
|
const QmakeProFileNode *rootProject = dynamic_cast<const QmakeProFileNode *>(project->rootProjectNode());
|
||||||
if (!rootProject)
|
if (!rootProject)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
#include <projectexplorer/buildmanager.h>
|
#include <projectexplorer/buildmanager.h>
|
||||||
#include <projectexplorer/projectexplorer.h>
|
#include <projectexplorer/projectexplorer.h>
|
||||||
#include <projectexplorer/target.h>
|
#include <projectexplorer/target.h>
|
||||||
|
#include <projectexplorer/projecttree.h>
|
||||||
#include <qtsupport/profilereader.h>
|
#include <qtsupport/profilereader.h>
|
||||||
#include <qtsupport/qtkitinformation.h>
|
#include <qtsupport/qtkitinformation.h>
|
||||||
#include <qtsupport/uicodemodelsupport.h>
|
#include <qtsupport/uicodemodelsupport.h>
|
||||||
@@ -163,7 +164,7 @@ QmakeNodeStaticData::QmakeNodeStaticData()
|
|||||||
overlayIcon, desiredSize);
|
overlayIcon, desiredSize);
|
||||||
QIcon folderIcon;
|
QIcon folderIcon;
|
||||||
folderIcon.addPixmap(folderPixmap);
|
folderIcon.addPixmap(folderPixmap);
|
||||||
const QString desc = QmakeProjectManager::QmakePriFileNode::tr(fileTypeDataStorage[i].typeName);
|
const QString desc = QCoreApplication::translate("QmakeProjectManager::QmakePriFileNode", fileTypeDataStorage[i].typeName);
|
||||||
fileTypeData.push_back(QmakeNodeStaticData::FileTypeData(fileTypeDataStorage[i].type,
|
fileTypeData.push_back(QmakeNodeStaticData::FileTypeData(fileTypeDataStorage[i].type,
|
||||||
desc, folderIcon));
|
desc, folderIcon));
|
||||||
}
|
}
|
||||||
@@ -239,8 +240,9 @@ public:
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QmakePriFile::QmakePriFile(QmakeProjectManager::QmakePriFileNode *qmakePriFile)
|
QmakePriFile::QmakePriFile(QmakeProjectManager::QmakePriFileNode *qmakePriFile)
|
||||||
: IDocument(qmakePriFile), m_priFile(qmakePriFile)
|
: IDocument(0), m_priFile(qmakePriFile)
|
||||||
{
|
{
|
||||||
setId("Qmake.PriFile");
|
setId("Qmake.PriFile");
|
||||||
setMimeType(QLatin1String(QmakeProjectManager::Constants::PROFILE_MIMETYPE));
|
setMimeType(QLatin1String(QmakeProjectManager::Constants::PROFILE_MIMETYPE));
|
||||||
@@ -318,6 +320,7 @@ QmakePriFileNode::QmakePriFileNode(QmakeProject *project, QmakeProFileNode *qmak
|
|||||||
QmakePriFileNode::~QmakePriFileNode()
|
QmakePriFileNode::~QmakePriFileNode()
|
||||||
{
|
{
|
||||||
watchFolders(QSet<QString>());
|
watchFolders(QSet<QString>());
|
||||||
|
delete m_qmakePriFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmakePriFileNode::scheduleUpdate()
|
void QmakePriFileNode::scheduleUpdate()
|
||||||
@@ -460,7 +463,7 @@ struct InternalNode
|
|||||||
// updateFolders
|
// updateFolders
|
||||||
QMultiMap<QString, FolderNode *> existingFolderNodes;
|
QMultiMap<QString, FolderNode *> existingFolderNodes;
|
||||||
foreach (FolderNode *node, folder->subFolderNodes())
|
foreach (FolderNode *node, folder->subFolderNodes())
|
||||||
if (node->nodeType() != ProjectNodeType && !qobject_cast<ResourceEditor::ResourceTopLevelNode *>(node))
|
if (node->nodeType() != ProjectNodeType && !dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(node))
|
||||||
existingFolderNodes.insert(node->path(), node);
|
existingFolderNodes.insert(node->path(), node);
|
||||||
|
|
||||||
QList<FolderNode *> foldersToRemove;
|
QList<FolderNode *> foldersToRemove;
|
||||||
@@ -480,7 +483,7 @@ struct InternalNode
|
|||||||
while (oldit != existingFolderNodes.constEnd() && oldit.key() == path) {
|
while (oldit != existingFolderNodes.constEnd() && oldit.key() == path) {
|
||||||
if (oldit.value()->nodeType() == ProjectExplorer::VirtualFolderNodeType) {
|
if (oldit.value()->nodeType() == ProjectExplorer::VirtualFolderNodeType) {
|
||||||
ProjectExplorer::VirtualFolderNode *vfn
|
ProjectExplorer::VirtualFolderNode *vfn
|
||||||
= qobject_cast<ProjectExplorer::VirtualFolderNode *>(oldit.value());
|
= dynamic_cast<ProjectExplorer::VirtualFolderNode *>(oldit.value());
|
||||||
if (vfn->priority() == (*it)->priority) {
|
if (vfn->priority() == (*it)->priority) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
@@ -574,7 +577,7 @@ struct InternalNode
|
|||||||
{
|
{
|
||||||
QList<ProjectExplorer::FolderNode *> existingResourceNodes; // for resource special handling
|
QList<ProjectExplorer::FolderNode *> existingResourceNodes; // for resource special handling
|
||||||
foreach (FolderNode *folderNode, folder->subFolderNodes()) {
|
foreach (FolderNode *folderNode, folder->subFolderNodes()) {
|
||||||
if (ResourceEditor::ResourceTopLevelNode *rn = qobject_cast<ResourceEditor::ResourceTopLevelNode *>(folderNode))
|
if (ResourceEditor::ResourceTopLevelNode *rn = dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(folderNode))
|
||||||
existingResourceNodes << rn;
|
existingResourceNodes << rn;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -597,7 +600,7 @@ struct InternalNode
|
|||||||
folder->addFolderNodes(nodesToAdd);
|
folder->addFolderNodes(nodesToAdd);
|
||||||
|
|
||||||
foreach (FolderNode *fn, nodesToAdd)
|
foreach (FolderNode *fn, nodesToAdd)
|
||||||
qobject_cast<ResourceEditor::ResourceTopLevelNode *>(fn)->update();
|
dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(fn)->update();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -879,7 +882,7 @@ QList<QmakePriFileNode *> QmakePriFileNode::subProjectNodesExact() const
|
|||||||
{
|
{
|
||||||
QList<QmakePriFileNode *> nodes;
|
QList<QmakePriFileNode *> nodes;
|
||||||
foreach (ProjectNode *node, subProjectNodes()) {
|
foreach (ProjectNode *node, subProjectNodes()) {
|
||||||
QmakePriFileNode *n = qobject_cast<QmakePriFileNode *>(node);
|
QmakePriFileNode *n = dynamic_cast<QmakePriFileNode *>(node);
|
||||||
if (n && n->includedInExactParse())
|
if (n && n->includedInExactParse())
|
||||||
nodes << n;
|
nodes << n;
|
||||||
}
|
}
|
||||||
@@ -907,7 +910,7 @@ QList<ProjectExplorer::ProjectAction> QmakePriFileNode::supportedActions(Node *n
|
|||||||
|
|
||||||
const FolderNode *folderNode = this;
|
const FolderNode *folderNode = this;
|
||||||
const QmakeProFileNode *proFileNode;
|
const QmakeProFileNode *proFileNode;
|
||||||
while (!(proFileNode = qobject_cast<const QmakeProFileNode*>(folderNode)))
|
while (!(proFileNode = dynamic_cast<const QmakeProFileNode*>(folderNode)))
|
||||||
folderNode = folderNode->parentFolderNode();
|
folderNode = folderNode->parentFolderNode();
|
||||||
Q_ASSERT(proFileNode);
|
Q_ASSERT(proFileNode);
|
||||||
|
|
||||||
@@ -928,7 +931,7 @@ QList<ProjectExplorer::ProjectAction> QmakePriFileNode::supportedActions(Node *n
|
|||||||
bool addExistingFiles = true;
|
bool addExistingFiles = true;
|
||||||
if (node->nodeType() == ProjectExplorer::VirtualFolderNodeType) {
|
if (node->nodeType() == ProjectExplorer::VirtualFolderNodeType) {
|
||||||
// A virtual folder, we do what the projectexplorer does
|
// A virtual folder, we do what the projectexplorer does
|
||||||
FolderNode *folder = qobject_cast<FolderNode *>(node);
|
FolderNode *folder = dynamic_cast<FolderNode *>(node);
|
||||||
if (folder) {
|
if (folder) {
|
||||||
QStringList list;
|
QStringList list;
|
||||||
foreach (FolderNode *f, folder->subFolderNodes())
|
foreach (FolderNode *f, folder->subFolderNodes())
|
||||||
@@ -952,9 +955,9 @@ QList<ProjectExplorer::ProjectAction> QmakePriFileNode::supportedActions(Node *n
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProjectExplorer::FileNode *fileNode = qobject_cast<FileNode *>(node);
|
ProjectExplorer::FileNode *fileNode = dynamic_cast<FileNode *>(node);
|
||||||
if ((fileNode && fileNode->fileType() != ProjectExplorer::ProjectFileType)
|
if ((fileNode && fileNode->fileType() != ProjectExplorer::ProjectFileType)
|
||||||
|| qobject_cast<ResourceEditor::ResourceTopLevelNode *>(node))
|
|| dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(node))
|
||||||
actions << ProjectExplorer::Rename;
|
actions << ProjectExplorer::Rename;
|
||||||
|
|
||||||
|
|
||||||
@@ -1190,8 +1193,8 @@ bool QmakePriFileNode::ensureWriteableProFile(const QString &file)
|
|||||||
bool makeWritable = QFile::setPermissions(file, fi.permissions() | QFile::WriteUser);
|
bool makeWritable = QFile::setPermissions(file, fi.permissions() | QFile::WriteUser);
|
||||||
if (!makeWritable) {
|
if (!makeWritable) {
|
||||||
QMessageBox::warning(Core::ICore::mainWindow(),
|
QMessageBox::warning(Core::ICore::mainWindow(),
|
||||||
tr("Failed"),
|
QCoreApplication::translate("QmakePriFileNode", "Failed"),
|
||||||
tr("Could not write project file %1.").arg(file));
|
QCoreApplication::translate("QmakePriFileNode", "Could not write project file %1.").arg(file));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1303,7 +1306,7 @@ void QmakePriFileNode::save(const QStringList &lines)
|
|||||||
errorStrings << errorString;
|
errorStrings << errorString;
|
||||||
}
|
}
|
||||||
if (!errorStrings.isEmpty())
|
if (!errorStrings.isEmpty())
|
||||||
QMessageBox::warning(Core::ICore::mainWindow(), tr("File Error"),
|
QMessageBox::warning(Core::ICore::mainWindow(), QCoreApplication::translate("QmakePriFileNode", "File Error"),
|
||||||
errorStrings.join(QLatin1Char('\n')));
|
errorStrings.join(QLatin1Char('\n')));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1520,17 +1523,12 @@ namespace {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
QmakeNodesWatcher::QmakeNodesWatcher(QObject *parent)
|
|
||||||
: NodesWatcher(parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
const QmakeProFileNode *QmakeProFileNode::findProFileFor(const QString &fileName) const
|
const QmakeProFileNode *QmakeProFileNode::findProFileFor(const QString &fileName) const
|
||||||
{
|
{
|
||||||
if (fileName == path())
|
if (fileName == path())
|
||||||
return this;
|
return this;
|
||||||
foreach (ProjectNode *pn, subProjectNodes())
|
foreach (ProjectNode *pn, subProjectNodes())
|
||||||
if (QmakeProFileNode *qmakeProFileNode = qobject_cast<QmakeProFileNode *>(pn))
|
if (QmakeProFileNode *qmakeProFileNode = dynamic_cast<QmakeProFileNode *>(pn))
|
||||||
if (const QmakeProFileNode *result = qmakeProFileNode->findProFileFor(fileName))
|
if (const QmakeProFileNode *result = qmakeProFileNode->findProFileFor(fileName))
|
||||||
return result;
|
return result;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1584,8 +1582,7 @@ bool QmakeProFileNode::isDeployable() const
|
|||||||
Implements abstract ProjectNode class
|
Implements abstract ProjectNode class
|
||||||
*/
|
*/
|
||||||
QmakeProFileNode::QmakeProFileNode(QmakeProject *project,
|
QmakeProFileNode::QmakeProFileNode(QmakeProject *project,
|
||||||
const QString &filePath,
|
const QString &filePath)
|
||||||
QObject *parent)
|
|
||||||
: QmakePriFileNode(project, this, filePath),
|
: QmakePriFileNode(project, this, filePath),
|
||||||
m_validParse(false),
|
m_validParse(false),
|
||||||
m_parseInProgress(true),
|
m_parseInProgress(true),
|
||||||
@@ -1593,11 +1590,13 @@ QmakeProFileNode::QmakeProFileNode(QmakeProject *project,
|
|||||||
m_readerExact(0),
|
m_readerExact(0),
|
||||||
m_readerCumulative(0)
|
m_readerCumulative(0)
|
||||||
{
|
{
|
||||||
if (parent)
|
// The slot is a lambda, so that QmakeProFileNode does not need to be
|
||||||
setParent(parent);
|
// a qobject. The lifetime of the m_parserFutureWatcher is shorter
|
||||||
|
// than of this, so this is all safe
|
||||||
connect(&m_parseFutureWatcher, SIGNAL(finished()),
|
QObject::connect(&m_parseFutureWatcher, &QFutureWatcherBase::finished,
|
||||||
this, SLOT(applyAsyncEvaluate()));
|
[this](){
|
||||||
|
applyAsyncEvaluate();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QmakeProFileNode::~QmakeProFileNode()
|
QmakeProFileNode::~QmakeProFileNode()
|
||||||
@@ -1609,7 +1608,7 @@ QmakeProFileNode::~QmakeProFileNode()
|
|||||||
|
|
||||||
bool QmakeProFileNode::isParent(QmakeProFileNode *node)
|
bool QmakeProFileNode::isParent(QmakeProFileNode *node)
|
||||||
{
|
{
|
||||||
while ((node = qobject_cast<QmakeProFileNode *>(node->parentFolderNode()))) {
|
while ((node = dynamic_cast<QmakeProFileNode *>(node->parentFolderNode()))) {
|
||||||
if (node == this)
|
if (node == this)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1667,12 +1666,10 @@ QHash<QString, QString> QmakeProFileNode::uiFiles() const
|
|||||||
|
|
||||||
void QmakeProFileNode::emitProFileUpdatedRecursive()
|
void QmakeProFileNode::emitProFileUpdatedRecursive()
|
||||||
{
|
{
|
||||||
foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
|
emit m_project->proFileUpdated(this, m_validParse, m_parseInProgress);
|
||||||
if (Internal::QmakeNodesWatcher *qmakeWatcher = qobject_cast<Internal::QmakeNodesWatcher*>(watcher))
|
|
||||||
emit qmakeWatcher->proFileUpdated(this, m_validParse, m_parseInProgress);
|
|
||||||
|
|
||||||
foreach (ProjectNode *subNode, subProjectNodes()) {
|
foreach (ProjectNode *subNode, subProjectNodes()) {
|
||||||
if (QmakeProFileNode *node = qobject_cast<QmakeProFileNode *>(subNode))
|
if (QmakeProFileNode *node = dynamic_cast<QmakeProFileNode *>(subNode))
|
||||||
node->emitProFileUpdatedRecursive();
|
node->emitProFileUpdatedRecursive();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1681,7 +1678,7 @@ void QmakeProFileNode::setParseInProgressRecursive(bool b)
|
|||||||
{
|
{
|
||||||
setParseInProgress(b);
|
setParseInProgress(b);
|
||||||
foreach (ProjectNode *subNode, subProjectNodes()) {
|
foreach (ProjectNode *subNode, subProjectNodes()) {
|
||||||
if (QmakeProFileNode *node = qobject_cast<QmakeProFileNode *>(subNode))
|
if (QmakeProFileNode *node = dynamic_cast<QmakeProFileNode *>(subNode))
|
||||||
node->setParseInProgressRecursive(b);
|
node->setParseInProgressRecursive(b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1691,16 +1688,14 @@ void QmakeProFileNode::setParseInProgress(bool b)
|
|||||||
if (m_parseInProgress == b)
|
if (m_parseInProgress == b)
|
||||||
return;
|
return;
|
||||||
m_parseInProgress = b;
|
m_parseInProgress = b;
|
||||||
foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
|
emit m_project->proFileUpdated(this, m_validParse, m_parseInProgress);
|
||||||
if (Internal::QmakeNodesWatcher *qmakeWatcher = qobject_cast<Internal::QmakeNodesWatcher*>(watcher))
|
|
||||||
emit qmakeWatcher->proFileUpdated(this, m_validParse, m_parseInProgress);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmakeProFileNode::setValidParseRecursive(bool b)
|
void QmakeProFileNode::setValidParseRecursive(bool b)
|
||||||
{
|
{
|
||||||
setValidParse(b);
|
setValidParse(b);
|
||||||
foreach (ProjectNode *subNode, subProjectNodes()) {
|
foreach (ProjectNode *subNode, subProjectNodes()) {
|
||||||
if (QmakeProFileNode *node = qobject_cast<QmakeProFileNode *>(subNode))
|
if (QmakeProFileNode *node = dynamic_cast<QmakeProFileNode *>(subNode))
|
||||||
node->setValidParseRecursive(b);
|
node->setValidParseRecursive(b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2036,7 +2031,7 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult)
|
|||||||
setParseInProgressRecursive(false);
|
setParseInProgressRecursive(false);
|
||||||
|
|
||||||
if (result->state == EvalResult::EvalFail) {
|
if (result->state == EvalResult::EvalFail) {
|
||||||
QmakeProject::proFileParseError(tr("Error while parsing file %1. Giving up.").arg(m_projectFilePath));
|
QmakeProject::proFileParseError(QCoreApplication::translate("QmakeProFileNode", "Error while parsing file %1. Giving up.").arg(m_projectFilePath));
|
||||||
if (m_projectType == InvalidProject)
|
if (m_projectType == InvalidProject)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -2045,13 +2040,7 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult)
|
|||||||
removeProjectNodes(subProjectNodes());
|
removeProjectNodes(subProjectNodes());
|
||||||
removeFolderNodes(subFolderNodes());
|
removeFolderNodes(subFolderNodes());
|
||||||
|
|
||||||
// change project type
|
|
||||||
QmakeProjectType oldType = m_projectType;
|
|
||||||
m_projectType = InvalidProject;
|
m_projectType = InvalidProject;
|
||||||
|
|
||||||
foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
|
|
||||||
if (Internal::QmakeNodesWatcher *qmakeWatcher = qobject_cast<Internal::QmakeNodesWatcher*>(watcher))
|
|
||||||
emit qmakeWatcher->projectTypeChanged(this, oldType, InvalidProject);
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2060,11 +2049,10 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult)
|
|||||||
qDebug() << "QmakeProFileNode - updating files for file " << m_projectFilePath;
|
qDebug() << "QmakeProFileNode - updating files for file " << m_projectFilePath;
|
||||||
|
|
||||||
if (result->projectType != m_projectType) {
|
if (result->projectType != m_projectType) {
|
||||||
QmakeProjectType oldType = m_projectType;
|
|
||||||
// probably all subfiles/projects have changed anyway
|
// probably all subfiles/projects have changed anyway
|
||||||
// delete files && folders && projects
|
// delete files && folders && projects
|
||||||
foreach (ProjectNode *projectNode, subProjectNodes()) {
|
foreach (ProjectNode *projectNode, subProjectNodes()) {
|
||||||
if (QmakeProFileNode *qmakeProFileNode = qobject_cast<QmakeProFileNode *>(projectNode)) {
|
if (QmakeProFileNode *qmakeProFileNode = dynamic_cast<QmakeProFileNode *>(projectNode)) {
|
||||||
qmakeProFileNode->setValidParseRecursive(false);
|
qmakeProFileNode->setValidParseRecursive(false);
|
||||||
qmakeProFileNode->setParseInProgressRecursive(false);
|
qmakeProFileNode->setParseInProgressRecursive(false);
|
||||||
}
|
}
|
||||||
@@ -2077,18 +2065,12 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult)
|
|||||||
bool changesShowInSimpleTree = showInSimpleTree() ^ showInSimpleTree(result->projectType);
|
bool changesShowInSimpleTree = showInSimpleTree() ^ showInSimpleTree(result->projectType);
|
||||||
|
|
||||||
if (changesShowInSimpleTree)
|
if (changesShowInSimpleTree)
|
||||||
aboutToChangeShowInSimpleTree();
|
ProjectExplorer::ProjectTree::instance()->emitAboutToChangeShowInSimpleTree(this);
|
||||||
|
|
||||||
m_projectType = result->projectType;
|
m_projectType = result->projectType;
|
||||||
|
|
||||||
if (changesShowInSimpleTree)
|
if (changesShowInSimpleTree)
|
||||||
showInSimpleTreeChanged();
|
ProjectExplorer::ProjectTree::instance()->emitShowInSimpleTreeChanged(this);
|
||||||
|
|
||||||
// really emit here? or at the end? Nobody is connected to this signal at the moment
|
|
||||||
// so we kind of can ignore that question for now
|
|
||||||
foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
|
|
||||||
if (Internal::QmakeNodesWatcher *qmakeWatcher = qobject_cast<Internal::QmakeNodesWatcher*>(watcher))
|
|
||||||
emit qmakeWatcher->projectTypeChanged(this, oldType, result->projectType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -2193,7 +2175,7 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult)
|
|||||||
bool loop = false;
|
bool loop = false;
|
||||||
ProjectExplorer::Node *n = this;
|
ProjectExplorer::Node *n = this;
|
||||||
while ((n = n->parentFolderNode())) {
|
while ((n = n->parentFolderNode())) {
|
||||||
if (qobject_cast<QmakePriFileNode *>(n) && n->path() == nodeToAdd) {
|
if (dynamic_cast<QmakePriFileNode *>(n) && n->path() == nodeToAdd) {
|
||||||
loop = true;
|
loop = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2218,7 +2200,7 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult)
|
|||||||
} // for
|
} // for
|
||||||
|
|
||||||
foreach (ProjectNode *node, toRemove) {
|
foreach (ProjectNode *node, toRemove) {
|
||||||
if (QmakeProFileNode *qmakeProFileNode = qobject_cast<QmakeProFileNode *>(node)) {
|
if (QmakeProFileNode *qmakeProFileNode = dynamic_cast<QmakeProFileNode *>(node)) {
|
||||||
qmakeProFileNode->setValidParseRecursive(false);
|
qmakeProFileNode->setValidParseRecursive(false);
|
||||||
qmakeProFileNode->setParseInProgressRecursive(false);
|
qmakeProFileNode->setParseInProgressRecursive(false);
|
||||||
}
|
}
|
||||||
@@ -2240,14 +2222,8 @@ void QmakeProFileNode::applyEvaluate(EvalResult *evalResult)
|
|||||||
m_installsList = result->installsList;
|
m_installsList = result->installsList;
|
||||||
m_isDeployable = result->isDeployable;
|
m_isDeployable = result->isDeployable;
|
||||||
|
|
||||||
if (m_varValues != result->newVarValues) {
|
if (m_varValues != result->newVarValues)
|
||||||
QmakeVariablesHash oldValues = m_varValues;
|
|
||||||
m_varValues = result->newVarValues;
|
m_varValues = result->newVarValues;
|
||||||
|
|
||||||
foreach (ProjectExplorer::NodesWatcher *watcher, watchers())
|
|
||||||
if (Internal::QmakeNodesWatcher *qmakeWatcher = qobject_cast<Internal::QmakeNodesWatcher*>(watcher))
|
|
||||||
emit qmakeWatcher->variablesChanged(this, oldValues, m_varValues);
|
|
||||||
}
|
|
||||||
} // result == EvalOk
|
} // result == EvalOk
|
||||||
|
|
||||||
setParseInProgress(false);
|
setParseInProgress(false);
|
||||||
@@ -2379,7 +2355,7 @@ QStringList QmakeProFileNode::subDirsPaths(QtSupport::ProFileReader *reader,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (errors)
|
if (errors)
|
||||||
errors->append(tr("Could not find .pro file for sub dir \"%1\" in \"%2\"")
|
errors->append(QCoreApplication::translate("QmakeProFileNode", "Could not find .pro file for sub dir \"%1\" in \"%2\"")
|
||||||
.arg(subDirVar).arg(realDir));
|
.arg(subDirVar).arg(realDir));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,7 +116,6 @@ using ProjectExplorer::Node;
|
|||||||
using ProjectExplorer::FileNode;
|
using ProjectExplorer::FileNode;
|
||||||
using ProjectExplorer::FolderNode;
|
using ProjectExplorer::FolderNode;
|
||||||
using ProjectExplorer::ProjectNode;
|
using ProjectExplorer::ProjectNode;
|
||||||
using ProjectExplorer::NodesWatcher;
|
|
||||||
|
|
||||||
// Import enums into namespace
|
// Import enums into namespace
|
||||||
using ProjectExplorer::NodeType;
|
using ProjectExplorer::NodeType;
|
||||||
@@ -150,8 +149,6 @@ public:
|
|||||||
// Implements ProjectNode for qmake .pri files
|
// Implements ProjectNode for qmake .pri files
|
||||||
class QMAKEPROJECTMANAGER_EXPORT QmakePriFileNode : public ProjectExplorer::ProjectNode
|
class QMAKEPROJECTMANAGER_EXPORT QmakePriFileNode : public ProjectExplorer::ProjectNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QmakePriFileNode(QmakeProject *project, QmakeProFileNode *qmakeProFileNode, const QString &filePath);
|
QmakePriFileNode(QmakeProject *project, QmakeProFileNode *qmakeProFileNode, const QString &filePath);
|
||||||
~QmakePriFileNode();
|
~QmakePriFileNode();
|
||||||
@@ -210,10 +207,9 @@ protected:
|
|||||||
QStringList *notChanged,
|
QStringList *notChanged,
|
||||||
ChangeType change);
|
ChangeType change);
|
||||||
|
|
||||||
private slots:
|
private:
|
||||||
void scheduleUpdate();
|
void scheduleUpdate();
|
||||||
|
|
||||||
private:
|
|
||||||
static bool ensureWriteableProFile(const QString &file);
|
static bool ensureWriteableProFile(const QString &file);
|
||||||
static QPair<ProFile *, QStringList> readProFile(const QString &file);
|
static QPair<ProFile *, QStringList> readProFile(const QString &file);
|
||||||
static QPair<ProFile *, QStringList> readProFileFromContents(const QString &contents);
|
static QPair<ProFile *, QStringList> readProFileFromContents(const QString &contents);
|
||||||
@@ -269,30 +265,6 @@ private:
|
|||||||
QmakePriFileNode *m_priFile;
|
QmakePriFileNode *m_priFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
class QmakeNodesWatcher : public ProjectExplorer::NodesWatcher
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
QmakeNodesWatcher(QObject *parent = 0);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void projectTypeChanged(QmakeProjectManager::QmakeProFileNode *projectNode,
|
|
||||||
const QmakeProjectManager::QmakeProjectType oldType,
|
|
||||||
const QmakeProjectManager::QmakeProjectType newType);
|
|
||||||
|
|
||||||
void variablesChanged(QmakeProFileNode *projectNode,
|
|
||||||
const QHash<QmakeVariable, QStringList> &oldValues,
|
|
||||||
const QHash<QmakeVariable, QStringList> &newValues);
|
|
||||||
|
|
||||||
void proFileUpdated(QmakeProjectManager::QmakeProFileNode *projectNode, bool success, bool parseInProgress);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// let them emit signals
|
|
||||||
friend class QmakeProjectManager::QmakeProFileNode;
|
|
||||||
friend class QmakePriFileNode;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ProVirtualFolderNode : public ProjectExplorer::VirtualFolderNode
|
class ProVirtualFolderNode : public ProjectExplorer::VirtualFolderNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -375,12 +347,9 @@ struct QMAKEPROJECTMANAGER_EXPORT ProjectVersion {
|
|||||||
// Implements ProjectNode for qmake .pro files
|
// Implements ProjectNode for qmake .pro files
|
||||||
class QMAKEPROJECTMANAGER_EXPORT QmakeProFileNode : public QmakePriFileNode
|
class QMAKEPROJECTMANAGER_EXPORT QmakeProFileNode : public QmakePriFileNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QmakeProFileNode(QmakeProject *project,
|
QmakeProFileNode(QmakeProject *project,
|
||||||
const QString &filePath,
|
const QString &filePath);
|
||||||
QObject *parent = 0);
|
|
||||||
~QmakeProFileNode();
|
~QmakeProFileNode();
|
||||||
|
|
||||||
bool isParent(QmakeProFileNode *node);
|
bool isParent(QmakeProFileNode *node);
|
||||||
@@ -431,13 +400,12 @@ public:
|
|||||||
void setValidParse(bool b);
|
void setValidParse(bool b);
|
||||||
void setValidParseRecursive(bool b);
|
void setValidParseRecursive(bool b);
|
||||||
void emitProFileUpdatedRecursive();
|
void emitProFileUpdatedRecursive();
|
||||||
public slots:
|
|
||||||
void asyncUpdate();
|
void asyncUpdate();
|
||||||
|
|
||||||
private slots:
|
private:
|
||||||
void applyAsyncEvaluate();
|
void applyAsyncEvaluate();
|
||||||
|
|
||||||
private:
|
|
||||||
void setupReader();
|
void setupReader();
|
||||||
Internal::EvalInput evalInput() const;
|
Internal::EvalInput evalInput() const;
|
||||||
|
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ void ProjectFilesVisitor::visitProjectNode(ProjectNode *projectNode)
|
|||||||
|
|
||||||
void ProjectFilesVisitor::visitFolderNode(FolderNode *folderNode)
|
void ProjectFilesVisitor::visitFolderNode(FolderNode *folderNode)
|
||||||
{
|
{
|
||||||
if (qobject_cast<ResourceEditor::ResourceTopLevelNode *>(folderNode))
|
if (dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(folderNode))
|
||||||
m_files->files[ResourceType].push_back(folderNode->path());
|
m_files->files[ResourceType].push_back(folderNode->path());
|
||||||
|
|
||||||
foreach (FileNode *fileNode, folderNode->fileNodes()) {
|
foreach (FileNode *fileNode, folderNode->fileNodes()) {
|
||||||
@@ -338,7 +338,6 @@ bool QmakeProjectFile::reload(QString *errorString, ReloadFlag flag, ChangeType
|
|||||||
QmakeProject::QmakeProject(QmakeManager *manager, const QString &fileName) :
|
QmakeProject::QmakeProject(QmakeManager *manager, const QString &fileName) :
|
||||||
m_manager(manager),
|
m_manager(manager),
|
||||||
m_rootProjectNode(0),
|
m_rootProjectNode(0),
|
||||||
m_nodesWatcher(new Internal::QmakeNodesWatcher(this)),
|
|
||||||
m_fileInfo(new QmakeProjectFile(fileName, this)),
|
m_fileInfo(new QmakeProjectFile(fileName, this)),
|
||||||
m_projectFiles(new QmakeProjectFiles),
|
m_projectFiles(new QmakeProjectFiles),
|
||||||
m_qmakeVfs(new QMakeVfs),
|
m_qmakeVfs(new QMakeVfs),
|
||||||
@@ -414,12 +413,7 @@ bool QmakeProject::fromMap(const QVariantMap &map)
|
|||||||
|
|
||||||
m_manager->registerProject(this);
|
m_manager->registerProject(this);
|
||||||
|
|
||||||
m_rootProjectNode = new QmakeProFileNode(this, m_fileInfo->filePath().toString(), this);
|
m_rootProjectNode = new QmakeProFileNode(this, m_fileInfo->filePath().toString());
|
||||||
m_rootProjectNode->registerWatcher(m_nodesWatcher);
|
|
||||||
|
|
||||||
// We have the profile nodes now, so we know the runconfigs!
|
|
||||||
connect(m_nodesWatcher, SIGNAL(proFileUpdated(QmakeProjectManager::QmakeProFileNode*,bool,bool)),
|
|
||||||
this, SIGNAL(proFileUpdated(QmakeProjectManager::QmakeProFileNode*,bool,bool)));
|
|
||||||
|
|
||||||
// On active buildconfiguration changes, reevaluate the .pro files
|
// On active buildconfiguration changes, reevaluate the .pro files
|
||||||
m_activeTarget = activeTarget();
|
m_activeTarget = activeTarget();
|
||||||
@@ -949,7 +943,7 @@ static FolderNode *folderOf(FolderNode *in, FileType fileType, const QString &fi
|
|||||||
static QmakeProFileNode *proFileNodeOf(QmakeProFileNode *in, FileType fileType, const QString &fileName)
|
static QmakeProFileNode *proFileNodeOf(QmakeProFileNode *in, FileType fileType, const QString &fileName)
|
||||||
{
|
{
|
||||||
for (FolderNode *folder = folderOf(in, fileType, fileName); folder; folder = folder->parentFolderNode())
|
for (FolderNode *folder = folderOf(in, fileType, fileName); folder; folder = folder->parentFolderNode())
|
||||||
if (QmakeProFileNode *proFile = qobject_cast<QmakeProFileNode *>(folder))
|
if (QmakeProFileNode *proFile = dynamic_cast<QmakeProFileNode *>(folder))
|
||||||
return proFile;
|
return proFile;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1092,7 +1086,7 @@ void QmakeProject::collectAllProFiles(QList<QmakeProFileNode *> &list, QmakeProF
|
|||||||
if (projectTypes.isEmpty() || projectTypes.contains(node->projectType()))
|
if (projectTypes.isEmpty() || projectTypes.contains(node->projectType()))
|
||||||
list.append(node);
|
list.append(node);
|
||||||
foreach (ProjectNode *n, node->subProjectNodes()) {
|
foreach (ProjectNode *n, node->subProjectNodes()) {
|
||||||
QmakeProFileNode *qmakeProFileNode = qobject_cast<QmakeProFileNode *>(n);
|
QmakeProFileNode *qmakeProFileNode = dynamic_cast<QmakeProFileNode *>(n);
|
||||||
if (qmakeProFileNode)
|
if (qmakeProFileNode)
|
||||||
collectAllProFiles(list, qmakeProFileNode, parse, projectTypes);
|
collectAllProFiles(list, qmakeProFileNode, parse, projectTypes);
|
||||||
}
|
}
|
||||||
@@ -1165,9 +1159,9 @@ bool QmakeProject::hasSubNode(QmakePriFileNode *root, const QString &path)
|
|||||||
if (root->path() == path)
|
if (root->path() == path)
|
||||||
return true;
|
return true;
|
||||||
foreach (FolderNode *fn, root->subFolderNodes()) {
|
foreach (FolderNode *fn, root->subFolderNodes()) {
|
||||||
if (qobject_cast<QmakeProFileNode *>(fn)) {
|
if (dynamic_cast<QmakeProFileNode *>(fn)) {
|
||||||
// we aren't interested in pro file nodes
|
// we aren't interested in pro file nodes
|
||||||
} else if (QmakePriFileNode *qt4prifilenode = qobject_cast<QmakePriFileNode *>(fn)) {
|
} else if (QmakePriFileNode *qt4prifilenode = dynamic_cast<QmakePriFileNode *>(fn)) {
|
||||||
if (hasSubNode(qt4prifilenode, path))
|
if (hasSubNode(qt4prifilenode, path))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1181,7 +1175,7 @@ void QmakeProject::findProFile(const QString& fileName, QmakeProFileNode *root,
|
|||||||
list.append(root);
|
list.append(root);
|
||||||
|
|
||||||
foreach (FolderNode *fn, root->subFolderNodes())
|
foreach (FolderNode *fn, root->subFolderNodes())
|
||||||
if (QmakeProFileNode *qt4proFileNode = qobject_cast<QmakeProFileNode *>(fn))
|
if (QmakeProFileNode *qt4proFileNode = dynamic_cast<QmakeProFileNode *>(fn))
|
||||||
findProFile(fileName, qt4proFileNode, list);
|
findProFile(fileName, qt4proFileNode, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1499,7 +1493,7 @@ void QmakeProject::collectData(const QmakeProFileNode *node, DeploymentData &dep
|
|||||||
case SubDirsTemplate:
|
case SubDirsTemplate:
|
||||||
foreach (const ProjectNode * const subProject, node->subProjectNodesExact()) {
|
foreach (const ProjectNode * const subProject, node->subProjectNodesExact()) {
|
||||||
const QmakeProFileNode * const qt4SubProject
|
const QmakeProFileNode * const qt4SubProject
|
||||||
= qobject_cast<const QmakeProFileNode *>(subProject);
|
= dynamic_cast<const QmakeProFileNode *>(subProject);
|
||||||
if (!qt4SubProject)
|
if (!qt4SubProject)
|
||||||
continue;
|
continue;
|
||||||
collectData(qt4SubProject, deploymentData);
|
collectData(qt4SubProject, deploymentData);
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ class CentralizedFolderWatcher;
|
|||||||
class QmakeProjectFiles;
|
class QmakeProjectFiles;
|
||||||
class QmakeProjectConfigWidget;
|
class QmakeProjectConfigWidget;
|
||||||
class QmakeProjectFile;
|
class QmakeProjectFile;
|
||||||
class QmakeNodesWatcher;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class QMAKEPROJECTMANAGER_EXPORT QmakeProject : public ProjectExplorer::Project
|
class QMAKEPROJECTMANAGER_EXPORT QmakeProject : public ProjectExplorer::Project
|
||||||
@@ -186,7 +185,6 @@ private:
|
|||||||
|
|
||||||
QmakeManager *m_manager;
|
QmakeManager *m_manager;
|
||||||
QmakeProFileNode *m_rootProjectNode;
|
QmakeProFileNode *m_rootProjectNode;
|
||||||
Internal::QmakeNodesWatcher *m_nodesWatcher;
|
|
||||||
|
|
||||||
Internal::QmakeProjectFile *m_fileInfo;
|
Internal::QmakeProjectFile *m_fileInfo;
|
||||||
|
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ void QmakeManager::addLibrary()
|
|||||||
void QmakeManager::addLibraryContextMenu()
|
void QmakeManager::addLibraryContextMenu()
|
||||||
{
|
{
|
||||||
Node *node = ProjectTree::currentNode();
|
Node *node = ProjectTree::currentNode();
|
||||||
if (qobject_cast<QmakeProFileNode *>(node))
|
if (dynamic_cast<QmakeProFileNode *>(node))
|
||||||
addLibrary(node->path());
|
addLibrary(node->path());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,7 +201,7 @@ void QmakeManager::runQMake(ProjectExplorer::Project *p, ProjectExplorer::Node *
|
|||||||
qs->setForced(true);
|
qs->setForced(true);
|
||||||
|
|
||||||
if (node != 0 && node != qmakeProject->rootProjectNode())
|
if (node != 0 && node != qmakeProject->rootProjectNode())
|
||||||
if (QmakeProFileNode *profile = qobject_cast<QmakeProFileNode *>(node))
|
if (QmakeProFileNode *profile = dynamic_cast<QmakeProFileNode *>(node))
|
||||||
bc->setSubNodeBuild(profile);
|
bc->setSubNodeBuild(profile);
|
||||||
|
|
||||||
BuildManager::appendStep(qs, tr("QMake"));
|
BuildManager::appendStep(qs, tr("QMake"));
|
||||||
@@ -232,7 +232,7 @@ void QmakeManager::buildFile()
|
|||||||
{
|
{
|
||||||
if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
|
if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
|
||||||
const QString file = currentDocument->filePath().toString();
|
const QString file = currentDocument->filePath().toString();
|
||||||
FileNode *node = qobject_cast<FileNode *>(SessionManager::nodeForFile(file));
|
FileNode *node = dynamic_cast<FileNode *>(SessionManager::nodeForFile(file));
|
||||||
Project *project = SessionManager::projectForFile(file);
|
Project *project = SessionManager::projectForFile(file);
|
||||||
|
|
||||||
if (project && node)
|
if (project && node)
|
||||||
@@ -264,7 +264,7 @@ void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isF
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (contextNode) {
|
if (contextNode) {
|
||||||
if (QmakePriFileNode *prifile = qobject_cast<QmakePriFileNode *>(contextNode)) {
|
if (QmakePriFileNode *prifile = dynamic_cast<QmakePriFileNode *>(contextNode)) {
|
||||||
if (QmakeProFileNode *profile = prifile->proFileNode()) {
|
if (QmakeProFileNode *profile = prifile->proFileNode()) {
|
||||||
if (profile != qmakeProject->rootProjectNode() || isFileBuild)
|
if (profile != qmakeProject->rootProjectNode() || isFileBuild)
|
||||||
bc->setSubNodeBuild(profile);
|
bc->setSubNodeBuild(profile);
|
||||||
|
|||||||
@@ -318,16 +318,16 @@ void QmakeProjectManagerPlugin::updateRunQMakeAction()
|
|||||||
|
|
||||||
void QmakeProjectManagerPlugin::updateContextActions(ProjectExplorer::Node *node, ProjectExplorer::Project *project)
|
void QmakeProjectManagerPlugin::updateContextActions(ProjectExplorer::Node *node, ProjectExplorer::Project *project)
|
||||||
{
|
{
|
||||||
m_addLibraryActionContextMenu->setEnabled(qobject_cast<QmakeProFileNode *>(node));
|
m_addLibraryActionContextMenu->setEnabled(dynamic_cast<QmakeProFileNode *>(node));
|
||||||
|
|
||||||
QmakeProFileNode *proFileNode = qobject_cast<QmakeProFileNode *>(node);
|
QmakeProFileNode *proFileNode = dynamic_cast<QmakeProFileNode *>(node);
|
||||||
QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(project);
|
QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(project);
|
||||||
QmakeProFileNode *subProjectNode = 0;
|
QmakeProFileNode *subProjectNode = 0;
|
||||||
if (node) {
|
if (node) {
|
||||||
if (QmakePriFileNode *subPriFileNode = qobject_cast<QmakePriFileNode *>(node->projectNode()))
|
if (QmakePriFileNode *subPriFileNode = dynamic_cast<QmakePriFileNode *>(node->projectNode()))
|
||||||
subProjectNode = subPriFileNode->proFileNode();
|
subProjectNode = subPriFileNode->proFileNode();
|
||||||
}
|
}
|
||||||
ProjectExplorer::FileNode *fileNode = qobject_cast<ProjectExplorer::FileNode *>(node);
|
ProjectExplorer::FileNode *fileNode = dynamic_cast<ProjectExplorer::FileNode *>(node);
|
||||||
bool buildFilePossible = subProjectNode && fileNode
|
bool buildFilePossible = subProjectNode && fileNode
|
||||||
&& (fileNode->fileType() == ProjectExplorer::SourceType);
|
&& (fileNode->fileType() == ProjectExplorer::SourceType);
|
||||||
|
|
||||||
@@ -398,7 +398,7 @@ void QmakeProjectManagerPlugin::updateBuildFileAction()
|
|||||||
m_buildFileAction->setParameter(QFileInfo(file).fileName());
|
m_buildFileAction->setParameter(QFileInfo(file).fileName());
|
||||||
visible = qobject_cast<QmakeProject *>(project)
|
visible = qobject_cast<QmakeProject *>(project)
|
||||||
&& node
|
&& node
|
||||||
&& qobject_cast<QmakePriFileNode *>(node->projectNode());
|
&& dynamic_cast<QmakePriFileNode *>(node->projectNode());
|
||||||
|
|
||||||
enabled = !BuildManager::isBuilding(project);
|
enabled = !BuildManager::isBuilding(project);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ namespace Internal {
|
|||||||
|
|
||||||
class BarDescriptorFileNode : public ProjectExplorer::FileNode
|
class BarDescriptorFileNode : public ProjectExplorer::FileNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
public:
|
public:
|
||||||
explicit BarDescriptorFileNode(const QString &filePath);
|
explicit BarDescriptorFileNode(const QString &filePath);
|
||||||
|
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ bool BarDescriptorFileNodeManager::createBarDescriptor(ProjectExplorer::Project
|
|||||||
const QString projectName = QFileInfo(projectNode->path()).completeBaseName();
|
const QString projectName = QFileInfo(projectNode->path()).completeBaseName();
|
||||||
|
|
||||||
QmakeProjectManager::QmakeProFileNode *proFileNode =
|
QmakeProjectManager::QmakeProFileNode *proFileNode =
|
||||||
qobject_cast<QmakeProjectManager::QmakeProFileNode*>(projectNode);
|
dynamic_cast<QmakeProjectManager::QmakeProFileNode*>(projectNode);
|
||||||
QTC_ASSERT(proFileNode, return false);
|
QTC_ASSERT(proFileNode, return false);
|
||||||
const QString targetName = proFileNode->targetInformation().target;
|
const QString targetName = proFileNode->targetInformation().target;
|
||||||
|
|
||||||
@@ -327,7 +327,7 @@ BarDescriptorFileNode *BarDescriptorFileNodeManager::findBarDescriptorFileNode(P
|
|||||||
|
|
||||||
QList<ProjectExplorer::FileNode*> fileNodes = parent->fileNodes();
|
QList<ProjectExplorer::FileNode*> fileNodes = parent->fileNodes();
|
||||||
foreach (ProjectExplorer::FileNode *fileNode, fileNodes) {
|
foreach (ProjectExplorer::FileNode *fileNode, fileNodes) {
|
||||||
BarDescriptorFileNode *barDescriptorNode = qobject_cast<BarDescriptorFileNode*>(fileNode);
|
BarDescriptorFileNode *barDescriptorNode = dynamic_cast<BarDescriptorFileNode*>(fileNode);
|
||||||
if (barDescriptorNode)
|
if (barDescriptorNode)
|
||||||
return barDescriptorNode;
|
return barDescriptorNode;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -304,7 +304,7 @@ void ResourceEditorPlugin::renamePrefixContextMenu()
|
|||||||
|
|
||||||
void ResourceEditorPlugin::updateContextActions(ProjectExplorer::Node *node, ProjectExplorer::Project *)
|
void ResourceEditorPlugin::updateContextActions(ProjectExplorer::Node *node, ProjectExplorer::Project *)
|
||||||
{
|
{
|
||||||
bool isResourceNode = qobject_cast<ResourceTopLevelNode *>(node);
|
bool isResourceNode = dynamic_cast<ResourceTopLevelNode *>(node);
|
||||||
m_addPrefix->setEnabled(isResourceNode);
|
m_addPrefix->setEnabled(isResourceNode);
|
||||||
m_addPrefix->setVisible(isResourceNode);
|
m_addPrefix->setVisible(isResourceNode);
|
||||||
|
|
||||||
@@ -325,7 +325,7 @@ void ResourceEditorPlugin::updateContextActions(ProjectExplorer::Node *node, Pro
|
|||||||
m_openInEditor->setEnabled(isResourceNode);
|
m_openInEditor->setEnabled(isResourceNode);
|
||||||
m_openInEditor->setVisible(isResourceNode);
|
m_openInEditor->setVisible(isResourceNode);
|
||||||
|
|
||||||
bool isResourceFolder = qobject_cast<ResourceFolderNode *>(node);
|
bool isResourceFolder = dynamic_cast<ResourceFolderNode *>(node);
|
||||||
m_removePrefix->setEnabled(isResourceFolder);
|
m_removePrefix->setEnabled(isResourceFolder);
|
||||||
m_removePrefix->setVisible(isResourceFolder);
|
m_removePrefix->setVisible(isResourceFolder);
|
||||||
|
|
||||||
@@ -338,7 +338,7 @@ void ResourceEditorPlugin::updateContextActions(ProjectExplorer::Node *node, Pro
|
|||||||
m_openWithMenu->clear();
|
m_openWithMenu->clear();
|
||||||
m_openWithMenu->menuAction()->setVisible(!m_openWithMenu->actions().isEmpty());
|
m_openWithMenu->menuAction()->setVisible(!m_openWithMenu->actions().isEmpty());
|
||||||
|
|
||||||
bool isResourceFile = qobject_cast<ResourceFileNode *>(node);
|
bool isResourceFile = dynamic_cast<ResourceFileNode *>(node);
|
||||||
m_copyPath->setEnabled(isResourceFile);
|
m_copyPath->setEnabled(isResourceFile);
|
||||||
m_copyPath->setVisible(isResourceFile);
|
m_copyPath->setVisible(isResourceFile);
|
||||||
m_copyUrl->setEnabled(isResourceFile);
|
m_copyUrl->setEnabled(isResourceFile);
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
|
|
||||||
#include <qmljstools/qmljstoolsconstants.h>
|
#include <qmljstools/qmljstoolsconstants.h>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
@@ -126,6 +127,7 @@ ResourceTopLevelNode::ResourceTopLevelNode(const QString &filePath, FolderNode *
|
|||||||
ResourceTopLevelNode::~ResourceTopLevelNode()
|
ResourceTopLevelNode::~ResourceTopLevelNode()
|
||||||
{
|
{
|
||||||
Core::DocumentManager::removeDocument(m_document);
|
Core::DocumentManager::removeDocument(m_document);
|
||||||
|
delete m_document;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceTopLevelNode::update()
|
void ResourceTopLevelNode::update()
|
||||||
@@ -253,7 +255,7 @@ bool ResourceTopLevelNode::removePrefix(const QString &prefix, const QString &la
|
|||||||
|
|
||||||
ProjectExplorer::FolderNode::AddNewInformation ResourceTopLevelNode::addNewInformation(const QStringList &files, Node *context) const
|
ProjectExplorer::FolderNode::AddNewInformation ResourceTopLevelNode::addNewInformation(const QStringList &files, Node *context) const
|
||||||
{
|
{
|
||||||
QString name = tr("%1 Prefix: %2")
|
QString name = QCoreApplication::translate("ResourceTopLevelNode", "%1 Prefix: %2")
|
||||||
.arg(QFileInfo(path()).fileName())
|
.arg(QFileInfo(path()).fileName())
|
||||||
.arg(QLatin1Char('/'));
|
.arg(QLatin1Char('/'));
|
||||||
|
|
||||||
@@ -267,7 +269,7 @@ ProjectExplorer::FolderNode::AddNewInformation ResourceTopLevelNode::addNewInfor
|
|||||||
// The ResourceFolderNode '/' defers to us, as otherwise
|
// The ResourceFolderNode '/' defers to us, as otherwise
|
||||||
// two nodes would be responsible for '/'
|
// two nodes would be responsible for '/'
|
||||||
// Thus also return a high priority for it
|
// Thus also return a high priority for it
|
||||||
if (ResourceFolderNode *rfn = qobject_cast<ResourceFolderNode *>(context))
|
if (ResourceFolderNode *rfn = dynamic_cast<ResourceFolderNode *>(context))
|
||||||
if (rfn->prefix() == QLatin1String("/") && rfn->parentFolderNode() == this)
|
if (rfn->prefix() == QLatin1String("/") && rfn->parentFolderNode() == this)
|
||||||
p = 120;
|
p = 120;
|
||||||
}
|
}
|
||||||
@@ -387,7 +389,7 @@ bool ResourceFolderNode::renamePrefix(const QString &prefix, const QString &lang
|
|||||||
|
|
||||||
ProjectExplorer::FolderNode::AddNewInformation ResourceFolderNode::addNewInformation(const QStringList &files, Node *context) const
|
ProjectExplorer::FolderNode::AddNewInformation ResourceFolderNode::addNewInformation(const QStringList &files, Node *context) const
|
||||||
{
|
{
|
||||||
QString name = tr("%1 Prefix: %2")
|
QString name = QCoreApplication::translate("ResourceTopLevelNode", "%1 Prefix: %2")
|
||||||
.arg(QFileInfo(m_topLevelNode->path()).fileName())
|
.arg(QFileInfo(m_topLevelNode->path()).fileName())
|
||||||
.arg(displayName());
|
.arg(displayName());
|
||||||
|
|
||||||
@@ -441,7 +443,7 @@ void ResourceFolderNode::updateFiles(QList<ProjectExplorer::FileNode *> newList)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ResourceFileWatcher::ResourceFileWatcher(ResourceTopLevelNode *node)
|
ResourceFileWatcher::ResourceFileWatcher(ResourceTopLevelNode *node)
|
||||||
: IDocument(node), m_node(node)
|
: IDocument(0), m_node(node)
|
||||||
{
|
{
|
||||||
setId("ResourceNodeWatcher");
|
setId("ResourceNodeWatcher");
|
||||||
setMimeType(QLatin1String(ResourceEditor::Constants::C_RESOURCE_MIMETYPE));
|
setMimeType(QLatin1String(ResourceEditor::Constants::C_RESOURCE_MIMETYPE));
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ namespace Internal { class ResourceFileWatcher; }
|
|||||||
|
|
||||||
class RESOURCE_EXPORT ResourceTopLevelNode : public ProjectExplorer::FolderNode
|
class RESOURCE_EXPORT ResourceTopLevelNode : public ProjectExplorer::FolderNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
public:
|
public:
|
||||||
ResourceTopLevelNode(const QString &filePath, FolderNode *parent);
|
ResourceTopLevelNode(const QString &filePath, FolderNode *parent);
|
||||||
~ResourceTopLevelNode();
|
~ResourceTopLevelNode();
|
||||||
@@ -71,7 +70,6 @@ namespace Internal {
|
|||||||
class ResourceFolderNode : public ProjectExplorer::FolderNode
|
class ResourceFolderNode : public ProjectExplorer::FolderNode
|
||||||
{
|
{
|
||||||
friend class ResourceEditor::ResourceTopLevelNode; // for updateFiles
|
friend class ResourceEditor::ResourceTopLevelNode; // for updateFiles
|
||||||
Q_OBJECT
|
|
||||||
public:
|
public:
|
||||||
ResourceFolderNode(const QString &prefix, const QString &lang, ResourceTopLevelNode *parent);
|
ResourceFolderNode(const QString &prefix, const QString &lang, ResourceTopLevelNode *parent);
|
||||||
~ResourceFolderNode();
|
~ResourceFolderNode();
|
||||||
@@ -100,7 +98,6 @@ private:
|
|||||||
|
|
||||||
class ResourceFileNode : public ProjectExplorer::FileNode
|
class ResourceFileNode : public ProjectExplorer::FileNode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
public:
|
public:
|
||||||
ResourceFileNode(const QString &filePath, const QString &qrcPath, ResourceTopLevelNode *topLevel);
|
ResourceFileNode(const QString &filePath, const QString &qrcPath, ResourceTopLevelNode *topLevel);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user