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:
Daniel Teske
2015-01-09 15:50:06 +01:00
parent 44a7db5091
commit 70c9c51e5e
28 changed files with 350 additions and 619 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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)

View File

@@ -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;
}; };

View File

@@ -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

View File

@@ -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 =

View File

@@ -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);
} }

View File

@@ -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)
{
}

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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;
}; };
} }

View File

@@ -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();

View File

@@ -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);
} }

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);
} }

View File

@@ -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;

View File

@@ -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));
} }
} }

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);
} }

View File

@@ -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);

View File

@@ -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;
} }

View File

@@ -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);

View File

@@ -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));

View File

@@ -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);