From 7ebea974d69e0ca750ca77ea437e901936a7e8f5 Mon Sep 17 00:00:00 2001 From: con Date: Mon, 17 Aug 2009 17:59:57 +0200 Subject: [PATCH] Show pro file's subdirectory structure in project tree in non-simple mode. Also adding category folders for the different file types (source files, header files, resource files, form files, other files). --- src/plugins/projectexplorer/projectmodels.cpp | 10 +- src/plugins/projectexplorer/projectnodes.cpp | 15 +- src/plugins/projectexplorer/projectnodes.h | 3 +- .../qt4projectmanager/images/forms.png | Bin 0 -> 311 bytes .../qt4projectmanager/images/headers.png | Bin 0 -> 223 bytes .../qt4projectmanager/images/qt_qrc.png | Bin 0 -> 676 bytes .../qt4projectmanager/images/sources.png | Bin 0 -> 208 bytes .../qt4projectmanager/images/unknown.png | Bin 0 -> 267 bytes src/plugins/qt4projectmanager/qt4nodes.cpp | 290 +++++++++++++++--- src/plugins/qt4projectmanager/qt4nodes.h | 3 + .../qt4projectmanager/qt4projectmanager.qrc | 7 +- .../qt4projectmanager/projecttree/foo.txt | 0 .../projecttree/headers/bar.h | 0 .../projecttree/headers/foo.h | 0 .../qt4projectmanager/projecttree/main.cpp | 0 .../qt4projectmanager/projecttree/main.h | 0 .../projecttree/prifile/headers/prifileinc.h | 0 .../projecttree/prifile/prifile.pri | 2 + .../prifile/sources/prifileinc.cpp | 0 .../projecttree/projecttree.pro | 48 +++ .../projecttree/resource.qrc | 0 .../projecttree/sources/bar.cpp | 0 .../projecttree/sources/foo.cpp | 0 .../projecttree/sub2/a/bar.cpp | 0 .../projecttree/sub2/a/bar.h | 0 .../projecttree/sub2/a/sub/bar2.cpp | 0 .../projecttree/sub2/a/sub/bar2.h | 0 .../projecttree/subpath/a/foo.cpp | 0 .../projecttree/subpath/a/foo.h | 0 .../projecttree/subpath/b/foo.cpp | 0 .../projecttree/subpath/b/foo.h | 0 .../projecttree/uniquesub/path/bar.cpp | 0 .../projecttree/uniquesub/path/bar.h | 0 .../qt4projectmanager/projecttree/widget.cpp | 0 .../qt4projectmanager/projecttree/widget.h | 0 .../qt4projectmanager/projecttree/widget.ui | 0 .../projecttree_data1/a/foo.cpp | 0 .../projecttree_data1/a/foo.h | 0 .../projecttree_data1/b/foo.cpp | 0 .../projecttree_data1/b/foo.h | 0 .../projecttree_data2/a/bar.cpp | 0 .../projecttree_data2/a/bar.h | 0 .../projecttree_data2/a/sub/bar2.cpp | 0 .../projecttree_data2/a/sub/bar2.h | 0 .../projecttree_data3/path/bar.cpp | 0 .../projecttree_data3/path/bar.h | 0 46 files changed, 329 insertions(+), 49 deletions(-) create mode 100644 src/plugins/qt4projectmanager/images/forms.png create mode 100644 src/plugins/qt4projectmanager/images/headers.png create mode 100644 src/plugins/qt4projectmanager/images/qt_qrc.png create mode 100644 src/plugins/qt4projectmanager/images/sources.png create mode 100644 src/plugins/qt4projectmanager/images/unknown.png create mode 100644 tests/manual/qt4projectmanager/projecttree/foo.txt create mode 100644 tests/manual/qt4projectmanager/projecttree/headers/bar.h create mode 100644 tests/manual/qt4projectmanager/projecttree/headers/foo.h create mode 100644 tests/manual/qt4projectmanager/projecttree/main.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/main.h create mode 100644 tests/manual/qt4projectmanager/projecttree/prifile/headers/prifileinc.h create mode 100644 tests/manual/qt4projectmanager/projecttree/prifile/prifile.pri create mode 100644 tests/manual/qt4projectmanager/projecttree/prifile/sources/prifileinc.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/projecttree.pro create mode 100644 tests/manual/qt4projectmanager/projecttree/resource.qrc create mode 100644 tests/manual/qt4projectmanager/projecttree/sources/bar.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/sources/foo.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/sub2/a/bar.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/sub2/a/bar.h create mode 100644 tests/manual/qt4projectmanager/projecttree/sub2/a/sub/bar2.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/sub2/a/sub/bar2.h create mode 100644 tests/manual/qt4projectmanager/projecttree/subpath/a/foo.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/subpath/a/foo.h create mode 100644 tests/manual/qt4projectmanager/projecttree/subpath/b/foo.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/subpath/b/foo.h create mode 100644 tests/manual/qt4projectmanager/projecttree/uniquesub/path/bar.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/uniquesub/path/bar.h create mode 100644 tests/manual/qt4projectmanager/projecttree/widget.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree/widget.h create mode 100644 tests/manual/qt4projectmanager/projecttree/widget.ui create mode 100644 tests/manual/qt4projectmanager/projecttree_data1/a/foo.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree_data1/a/foo.h create mode 100644 tests/manual/qt4projectmanager/projecttree_data1/b/foo.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree_data1/b/foo.h create mode 100644 tests/manual/qt4projectmanager/projecttree_data2/a/bar.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree_data2/a/bar.h create mode 100644 tests/manual/qt4projectmanager/projecttree_data2/a/sub/bar2.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree_data2/a/sub/bar2.h create mode 100644 tests/manual/qt4projectmanager/projecttree_data3/path/bar.cpp create mode 100644 tests/manual/qt4projectmanager/projecttree_data3/path/bar.h diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index dcde9968e59..da793af74a8 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -961,11 +961,15 @@ FolderNode *FlatModel::visibleFolderNode(FolderNode *node) const bool FlatModel::filter(Node *node) const { bool isHidden = false; - if (ProjectNode *projectNode = qobject_cast(node)) { + if (node->nodeType() == SessionNodeType) { + isHidden = false; + } else if (ProjectNode *projectNode = qobject_cast(node)) { if (m_filterProjects && projectNode->parentFolderNode() != m_rootNode) isHidden = !projectNode->hasTargets(); - } - if (FileNode *fileNode = qobject_cast(node)) { + } else if (node->nodeType() == FolderNodeType) { + if (m_filterProjects) + isHidden = true; + } else if (FileNode *fileNode = qobject_cast(node)) { if (m_filterGeneratedFiles) isHidden = fileNode->isGenerated(); } diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 6bd2205908b..7b7b54cf388 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -153,7 +153,11 @@ FolderNode::FolderNode(const QString &folderPath) : Node(FolderNodeType, folderPath), m_folderName(folderPath) { - m_icon = QApplication::style()->standardIcon(QStyle::SP_DirIcon); + static QIcon dirIcon; + if (dirIcon.isNull()) { + dirIcon = QApplication::style()->standardIcon(QStyle::SP_DirIcon); + } + m_icon = dirIcon; } FolderNode::~FolderNode() @@ -549,8 +553,13 @@ void ProjectNode::watcherDestroyed(QObject *watcher) /*! Sort pointers to FileNodes */ -bool ProjectNode::sortNodesByPath(Node *f1, Node *f2) { - return f1->path() < f2->path(); +bool ProjectNode::sortNodesByPath(Node *n1, Node *n2) { + return n1->path() < n2->path(); +} + +bool ProjectNode::sortFolderNodesByName(FolderNode *f1, FolderNode *f2) +{ + return f1->name() < f2->name(); } /*! diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 958d524b048..cfd0d7ca49f 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -136,10 +136,10 @@ public: virtual void accept(NodesVisitor *visitor); -protected: void setFolderName(const QString &name); void setIcon(const QIcon &icon); +protected: QList m_subFolderNodes; QList m_fileNodes; @@ -193,6 +193,7 @@ public: void accept(NodesVisitor *visitor); static bool sortNodesByPath(Node *n1, Node *n2); + static bool sortFolderNodesByName(FolderNode *f1, FolderNode *f2); protected: // this is just the in-memory representation, a subclass diff --git a/src/plugins/qt4projectmanager/images/forms.png b/src/plugins/qt4projectmanager/images/forms.png new file mode 100644 index 0000000000000000000000000000000000000000..04059d99f0eb4db720066140f8b361ea24238d6c GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7{&~7MhFAzDCrGe1Td@55 z|NlHsiJY>XI@8q-!Jq>iEdMX^B(h{}Nl(}ye&42baWAK@P;0lVv4>p7gGCL&*&$&u z`^vsb#xV!@G#52&i?+X0tMK5(LEU=$J-;^z%$Ayy^#A{SUhC~ze~NQWp8ub-q~W&1 z@(qtddUP1KOy%ro&dc$yu+*OZdi(yxmy{LkMIw3q%mNfOF4%ncG5ou6L(Aj0v%d;i z{{L^h;h@O_UgiaEd<&fB7Pp6sdvkpJ|L2>3Ra3!%&o6s=c=ji-Jy_B>YpdTpo1JS` ztauTak@13E!Jf0j@}lX3;)B2ET9-@x|Mz$H>GS8`a|Jw3OW0E9ZqC4vI;}K==kn1k Q1_lNOPgg&ebxsLQ0Jn98^8f$< literal 0 HcmV?d00001 diff --git a/src/plugins/qt4projectmanager/images/headers.png b/src/plugins/qt4projectmanager/images/headers.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7797fa91aac20425d04c122debd96beb3ba4b2 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7mU+53hFAzDCrGd^R&+?= zkTJTli}Q&12F>(?Y8`st<~Kf+-X+mLgzP`}d;E(v<|NRSjRs5%j|NEQHaO>QM zlkX0F%?)r?ZO~(^?$%&#IQQqwffFCZpD79Oe&LhvP&?J|pQk70fWZUy%m$_jZ!a0} cxtcJfhv={W8IWhrz`(%Z>FVdQ&MBb@0IOtL6951J literal 0 HcmV?d00001 diff --git a/src/plugins/qt4projectmanager/images/qt_qrc.png b/src/plugins/qt4projectmanager/images/qt_qrc.png new file mode 100644 index 0000000000000000000000000000000000000000..3643f37e1a3ede6454fe3d14224e6fc72f73a5db GIT binary patch literal 676 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z`&N| z?e4?8+qQ$wEq86r-eG8cDPCOmqufTwR+ zXXgW_4F(poZaIc4Tdh=F*sPe@aV#nN<>L2S9q#Y`e&@B5{1vTvPjt+m|2g-6PJP~) zLYaT!GkumlJsZXCVC`Tv_gK{JNsAXR=Hci6FD%5^W2k%fm;{4R=aELQSq#4&y)+qi z?cUAbvW2_Gc(he>czvGz}q5qR`Z_v$WTY0{C^#79 zeWp+*Xr;(8i77!Lt3!9~+V$hdyRS#LzZ8ESK5hE5|BGs*DmHCNTK$$GD!a$<$G-j` zF2RSsRdwIO9=&+5l0BGVNm}}j%HMoh%a2U=pD%A$_wB1u!Pd2mE3Rf;d0l$Qz{TZ+ zUcH1(;Tw)9>81+-DO7qv`K!u`ah;1^#@dgy_CZQY3|E*Pd0MRXQtt=otzEpu zRr7Mr;`hH<92+`Z8vfnmTlVg}iSE2Pw~ZI>-=56>pfc`qiQvO(N5k6hJc%m;Pkku) zC_VY3-IsMuJHze2F*pjioc$eMa94K9CXL)5p&LVNTCcIKUCS_)V}g&`>?M7@y@g+X z>^%A=>tEFQh35`OMW5QYG%7S>qsZxpzt&AXB6a`M`5h%@Wl}rXeVBBfC&gGuUbSPF e(_MSxQT`O?em0Bl*Gdcw3=E#GelF{r5}E)~Y$z50 literal 0 HcmV?d00001 diff --git a/src/plugins/qt4projectmanager/images/sources.png b/src/plugins/qt4projectmanager/images/sources.png new file mode 100644 index 0000000000000000000000000000000000000000..60dc177b86430077a9413f4419cba0c2f9a1c979 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7rhB?LhFAzDCrGd^R&;0; zNKm=f)3icXJl^i_IhK(1%vZK#-#qA0J|S)bgX0A0ZEp<&Hph9+k6N&Z?fB>aJUqW9 zetZ4B$z+qj72c2!&z_!_cJMlOBjPvTglSIKoTqR%_=P!NYdNEKih(il+j0Zn(wn#a zndknuzf^a)XoAGW#u=iUQh)CbuXmM@{6CZ7t87G_!3DuI4ObI}TdJCIOzBJCGB7YO Nc)I$ztaD0e0svYYQR)By literal 0 HcmV?d00001 diff --git a/src/plugins/qt4projectmanager/images/unknown.png b/src/plugins/qt4projectmanager/images/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2ad1818e23e7a6297b24ee61ffee458dc7fcb8 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7E_u2*hFA!m4YKBIQ4pxz z-BiGppOBlq$V~2vb_K7nwXToPn_S(LX^G0cH>a+R;X1_d{;*Ahw0p_oZ}Fb?PItHD zdcWQ^Z(aB0bJKfuPCK~#J7&PMqvXJ;&oD=)0-@=CMTszuRXkvVT*8Z VpYl41e+&!^44$rjF6*2UngGFVYp(zR literal 0 HcmV?d00001 diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 1b7f1ea2227..a47f43001ef 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -116,6 +116,217 @@ void Qt4PriFileNode::scheduleUpdate() m_qt4ProFileNode->scheduleUpdate(); } +namespace Qt4ProjectManager { +namespace Internal { + struct InternalNode + { + QMap subnodes; + QStringList files; + ProjectExplorer::FileType type; + QString fullName; + QIcon icon; + + ~InternalNode() + { + qDeleteAll(subnodes); + } + + // Creates a tree structure from a list of absolute file paths. + // Empty directories are compressed into a single entry with a longer path. + // * project + // * /absolute/path + // * file1 + // * relative + // * path1 + // * file1 + // * file2 + // * path2 + // * file1 + void create(const QString &projectDir, const QStringList &newFilePaths, ProjectExplorer::FileType type) + { + static const QChar separator = QChar('/'); + const QString projectDirWithSeparator = projectDir + separator; + int projectDirWithSeparatorLength = projectDirWithSeparator.length(); + foreach (const QString &file, newFilePaths) { + QString fileWithoutPrefix; + bool isRelative; + if (file.startsWith(projectDirWithSeparator)) { + isRelative = true; + fileWithoutPrefix = file.mid(projectDirWithSeparatorLength); + } else { + isRelative = false; + fileWithoutPrefix = file; + } + QStringList parts = fileWithoutPrefix.split(separator, QString::SkipEmptyParts); + if (!isRelative && parts.count() > 0) + parts[0].prepend(separator); + QStringListIterator it(parts); + InternalNode *currentNode = this; + QString path = (isRelative ? projectDir : ""); + while (it.hasNext()) { + const QString &key = it.next(); + path += separator + key; + if (it.hasNext()) { // key is directory + if (!currentNode->subnodes.contains(key)) { + InternalNode *val = new InternalNode; + val->type = type; + val->fullName = path; + currentNode->subnodes.insert(key, val); + currentNode = val; + } else { + currentNode = currentNode->subnodes.value(key); + } + } else { // key is filename + currentNode->files.append(file); + } + } + } + this->compress(); + } + + // Removes folder nodes with only a single sub folder in it + void compress() + { + static const QChar separator = QChar('/'); + QMap newSubnodes; + QMapIterator i(subnodes); + while (i.hasNext()) { + i.next(); + i.value()->compress(); + if (i.value()->files.isEmpty() && i.value()->subnodes.size() == 1) { + QString key = i.value()->subnodes.keys().at(0); + newSubnodes.insert(i.key()+separator+key, i.value()->subnodes.value(key)); + i.value()->subnodes.clear(); + delete i.value(); + } else { + newSubnodes.insert(i.key(), i.value()); + } + } + subnodes = newSubnodes; + } + + // Makes the projectNode's subtree below the given folder match this internal node's subtree + void updateSubFolders(Qt4PriFileNode *projectNode, ProjectExplorer::FolderNode *folder) + { + updateFiles(projectNode, folder, type); + + // update folders + QList existingFolderNodes; + foreach (FolderNode *node, folder->subFolderNodes()) { + if (node->nodeType() != ProjectNodeType) + existingFolderNodes << node; + } + + QList foldersToRemove; + QList foldersToAdd; + QList internalNodesToUpdate; + QList folderNodesToUpdate; + + // newFolders is already sorted + qSort(existingFolderNodes.begin(), existingFolderNodes.end(), ProjectNode::sortFolderNodesByName); + + QList::const_iterator existingNodeIter = existingFolderNodes.constBegin(); + QMap::const_iterator newNodeIter = subnodes.constBegin();; + while (existingNodeIter != existingFolderNodes.constEnd() + && newNodeIter != subnodes.constEnd()) { + if ((*existingNodeIter)->name() < newNodeIter.key()) { + foldersToRemove << *existingNodeIter; + ++existingNodeIter; + } else if ((*existingNodeIter)->name() > newNodeIter.key()) { + FolderNode *newNode = new FolderNode(newNodeIter.value()->fullName); + newNode->setFolderName(newNodeIter.key()); + if (!newNodeIter.value()->icon.isNull()) + newNode->setIcon(newNodeIter.value()->icon); + foldersToAdd << newNode; + internalNodesToUpdate << newNodeIter.value(); + folderNodesToUpdate << newNode; + ++newNodeIter; + } else { // *existingNodeIter->path() == *newPathIter + internalNodesToUpdate << newNodeIter.value(); + folderNodesToUpdate << *existingNodeIter; + ++existingNodeIter; + ++newNodeIter; + } + } + + while (existingNodeIter != existingFolderNodes.constEnd()) { + foldersToRemove << *existingNodeIter; + ++existingNodeIter; + } + while (newNodeIter != subnodes.constEnd()) { + FolderNode *newNode = new FolderNode(newNodeIter.value()->fullName); + newNode->setFolderName(newNodeIter.key()); + if (!newNodeIter.value()->icon.isNull()) + newNode->setIcon(newNodeIter.value()->icon); + foldersToAdd << newNode; + internalNodesToUpdate << newNodeIter.value(); + folderNodesToUpdate << newNode; + ++newNodeIter; + } + + if (!foldersToRemove.isEmpty()) + projectNode->removeFolderNodes(foldersToRemove, folder); + if (!foldersToAdd.isEmpty()) + projectNode->addFolderNodes(foldersToAdd, folder); + + QList::const_iterator folderIt = folderNodesToUpdate.constBegin(); + QList::const_iterator iNodeIt = internalNodesToUpdate.constBegin(); + while (folderIt != folderNodesToUpdate.constEnd() + && iNodeIt != internalNodesToUpdate.constEnd()) { + (*iNodeIt)->updateSubFolders(projectNode, *folderIt); + ++folderIt; + ++iNodeIt; + } + } + + // Makes the folder's files match this internal node's file list + void updateFiles(Qt4PriFileNode *projectNode, FolderNode *folder, FileType type) + { + QList existingFileNodes; + foreach (FileNode *fileNode, folder->fileNodes()) { + if (fileNode->fileType() == type && !fileNode->isGenerated()) + existingFileNodes << fileNode; + } + + QList filesToRemove; + QList filesToAdd; + + qSort(files); + qSort(existingFileNodes.begin(), existingFileNodes.end(), ProjectNode::sortNodesByPath); + + QList::const_iterator existingNodeIter = existingFileNodes.constBegin(); + QList::const_iterator newPathIter = files.constBegin(); + while (existingNodeIter != existingFileNodes.constEnd() + && newPathIter != files.constEnd()) { + if ((*existingNodeIter)->path() < *newPathIter) { + filesToRemove << *existingNodeIter; + ++existingNodeIter; + } else if ((*existingNodeIter)->path() > *newPathIter) { + filesToAdd << new FileNode(*newPathIter, type, false); + ++newPathIter; + } else { // *existingNodeIter->path() == *newPathIter + ++existingNodeIter; + ++newPathIter; + } + } + while (existingNodeIter != existingFileNodes.constEnd()) { + filesToRemove << *existingNodeIter; + ++existingNodeIter; + } + while (newPathIter != files.constEnd()) { + filesToAdd << new FileNode(*newPathIter, type, false); + ++newPathIter; + } + + if (!filesToRemove.isEmpty()) + projectNode->removeFileNodes(filesToRemove, folder); + if (!filesToAdd.isEmpty()) + projectNode->addFileNodes(filesToAdd, folder); + } + }; +} // Internal namespace +} // namespace + void Qt4PriFileNode::update(ProFile *includeFile, ProFileReader *reader) { Q_ASSERT(includeFile); @@ -131,6 +342,30 @@ void Qt4PriFileNode::update(ProFile *includeFile, ProFileReader *reader) << ProjectExplorer::FormType << ProjectExplorer::ResourceType << ProjectExplorer::UnknownFileType); + static QStringList fileTypeNames = + QStringList() << tr("Headers") + << tr("Sources") + << tr("Forms") + << tr("Resources") + << tr("Other files"); + static QList fileTypeIcons; + if (fileTypeIcons.isEmpty()) { + QStringList iconPaths; + iconPaths << ":/qt4projectmanager/images/headers.png" + << ":/qt4projectmanager/images/sources.png" + << ":/qt4projectmanager/images/forms.png" + << ":/qt4projectmanager/images/qt_qrc.png" + << ":/qt4projectmanager/images/unknown.png"; + foreach (const QString &iconPath, iconPaths) { + QIcon dirIcon; + Core::FileIconProvider *iconProvider = Core::FileIconProvider::instance(); + QPixmap dirIconPixmap = iconProvider->overlayIcon(QStyle::SP_DirIcon, + QIcon(iconPath), + QSize(16, 16)); + dirIcon.addPixmap(dirIconPixmap); + fileTypeIcons.append(dirIcon); + } + } const QString &projectDir = m_qt4ProFileNode->m_projectDir; @@ -140,8 +375,11 @@ void Qt4PriFileNode::update(ProFile *includeFile, ProFileReader *reader) baseVPaths += reader->absolutePathValues("DEPENDPATH", projectDir); baseVPaths.removeDuplicates(); + InternalNode contents; + // update files - foreach (FileType type, fileTypes) { + for (int i = 0; i < fileTypes.size(); ++i) { + FileType type = fileTypes.at(i); const QStringList qmakeVariables = varNames(type); QStringList newFilePaths; @@ -157,47 +395,17 @@ void Qt4PriFileNode::update(ProFile *includeFile, ProFileReader *reader) } newFilePaths.removeDuplicates(); - QList existingFileNodes; - foreach (FileNode *fileNode, fileNodes()) { - if (fileNode->fileType() == type && !fileNode->isGenerated()) - existingFileNodes << fileNode; + if (!newFilePaths.isEmpty()) { + InternalNode *subfolder = new InternalNode; + subfolder->type = type; + subfolder->icon = fileTypeIcons.at(i); + subfolder->fullName = m_projectDir; + contents.subnodes.insert(fileTypeNames.at(i), subfolder); + // create the hierarchy with subdirectories + subfolder->create(m_projectDir, newFilePaths, type); } - - QList toRemove; - QList toAdd; - - qSort(newFilePaths); - qSort(existingFileNodes.begin(), existingFileNodes.end(), ProjectNode::sortNodesByPath); - - QList::const_iterator existingNodeIter = existingFileNodes.constBegin(); - QList::const_iterator newPathIter = newFilePaths.constBegin(); - while (existingNodeIter != existingFileNodes.constEnd() - && newPathIter != newFilePaths.constEnd()) { - if ((*existingNodeIter)->path() < *newPathIter) { - toRemove << *existingNodeIter; - ++existingNodeIter; - } else if ((*existingNodeIter)->path() > *newPathIter) { - toAdd << new FileNode(*newPathIter, type, false); - ++newPathIter; - } else { // *existingNodeIter->path() == *newPathIter - ++existingNodeIter; - ++newPathIter; - } - } - while (existingNodeIter != existingFileNodes.constEnd()) { - toRemove << *existingNodeIter; - ++existingNodeIter; - } - while (newPathIter != newFilePaths.constEnd()) { - toAdd << new FileNode(*newPathIter, type, false); - ++newPathIter; - } - - if (!toRemove.isEmpty()) - removeFileNodes(toRemove, this); - if (!toAdd.isEmpty()) - addFileNodes(toAdd, this); } + contents.updateSubFolders(this, this); } QList Qt4PriFileNode::supportedActions() const @@ -1084,7 +1292,7 @@ void Qt4ProFileNode::createUiCodeModelSupport() foreach (FileNode *uiFile, uiFiles) { QString uiHeaderFilePath = QString("%1/ui_%2.h").arg(uiDir, QFileInfo(uiFile->path()).completeBaseName()); - uiHeaderFilePath = QDir::cleanPath(uiHeaderFilePath); + uiHeaderFilePath = QDir::cleanPath(uiHeaderFilePath); // qDebug()<<"code model support for "<path()<<" "<::iterator it = oldCodeModelSupport.find(uiFile->path()); diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index 6a491dc6e4a..f1240e7cdda 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -104,6 +104,7 @@ enum Qt4Variable { class Qt4PriFileNode; class Qt4ProFileNode; +struct InternalNode; // Implements ProjectNode for qt4 pro files class Qt4PriFileNode : public ProjectExplorer::ProjectNode @@ -175,6 +176,8 @@ private: // managed by Qt4ProFileNode friend class Qt4ProFileNode; + // internal temporary subtree representation + friend class InternalNode; }; // Implements ProjectNode for qt4 pro files diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.qrc b/src/plugins/qt4projectmanager/qt4projectmanager.qrc index f733770e2f4..6b17ee4244e 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.qrc +++ b/src/plugins/qt4projectmanager/qt4projectmanager.qrc @@ -1,9 +1,14 @@ - + images/window.png images/run_qmake.png images/run_qmake_small.png images/qt_project.png Qt4ProjectManager.mimetypes.xml + images/forms.png + images/headers.png + images/qt_qrc.png + images/sources.png + images/unknown.png diff --git a/tests/manual/qt4projectmanager/projecttree/foo.txt b/tests/manual/qt4projectmanager/projecttree/foo.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/headers/bar.h b/tests/manual/qt4projectmanager/projecttree/headers/bar.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/headers/foo.h b/tests/manual/qt4projectmanager/projecttree/headers/foo.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/main.cpp b/tests/manual/qt4projectmanager/projecttree/main.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/main.h b/tests/manual/qt4projectmanager/projecttree/main.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/prifile/headers/prifileinc.h b/tests/manual/qt4projectmanager/projecttree/prifile/headers/prifileinc.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/prifile/prifile.pri b/tests/manual/qt4projectmanager/projecttree/prifile/prifile.pri new file mode 100644 index 00000000000..5b1c723c8d2 --- /dev/null +++ b/tests/manual/qt4projectmanager/projecttree/prifile/prifile.pri @@ -0,0 +1,2 @@ +SOURCES += $$PWD/sources/prifileinc.cpp +HEADERS += $$PWD/headers/prifileinc.h diff --git a/tests/manual/qt4projectmanager/projecttree/prifile/sources/prifileinc.cpp b/tests/manual/qt4projectmanager/projecttree/prifile/sources/prifileinc.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/projecttree.pro b/tests/manual/qt4projectmanager/projecttree/projecttree.pro new file mode 100644 index 00000000000..ec8fdc57013 --- /dev/null +++ b/tests/manual/qt4projectmanager/projecttree/projecttree.pro @@ -0,0 +1,48 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2009-05-12T12:31:37 +# +#------------------------------------------------- + +TARGET = projecttree +TEMPLATE = app + +include(prifile/prifile.pri) + +SOURCES += main.cpp\ + widget.cpp \ + /etc/cups/cupsd.conf \ + /etc/cups/printers.conf \ + /etc/apache2/mime.types \ + /etc/apache2/extra/httpd-info.conf \ + ../projecttree_data1/a/foo.cpp \ + ../projecttree_data1/b/foo.cpp \ + ../projecttree_data2/a/bar.cpp \ + ../projecttree_data2/a/sub/bar2.cpp \ + ../projecttree_data3/path/bar.cpp \ + subpath/a/foo.cpp \ + subpath/b/foo.cpp \ + sub2/a/bar.cpp \ + sub2/a/sub/bar2.cpp \ + uniquesub/path/bar.cpp \ + sources/foo.cpp \ + sources/bar.cpp + +HEADERS += main.h\ + widget.h \ + ../projecttree_data1/a/foo.h \ + ../projecttree_data1/b/foo.h \ + ../projecttree_data2/a/bar.h \ + ../projecttree_data2/a/sub/bar2.h \ + ../projecttree_data3/path/bar.h \ + subpath/a/foo.h \ + subpath/b/foo.h \ + sub2/a/bar.h \ + sub2/a/sub/bar2.h \ + uniquesub/path/bar.h \ + headers/foo.h \ + headers/bar.h + +FORMS += widget.ui +RESOURCES += resource.qrc +OTHER_FILES += foo.txt diff --git a/tests/manual/qt4projectmanager/projecttree/resource.qrc b/tests/manual/qt4projectmanager/projecttree/resource.qrc new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/sources/bar.cpp b/tests/manual/qt4projectmanager/projecttree/sources/bar.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/sources/foo.cpp b/tests/manual/qt4projectmanager/projecttree/sources/foo.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/sub2/a/bar.cpp b/tests/manual/qt4projectmanager/projecttree/sub2/a/bar.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/sub2/a/bar.h b/tests/manual/qt4projectmanager/projecttree/sub2/a/bar.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/sub2/a/sub/bar2.cpp b/tests/manual/qt4projectmanager/projecttree/sub2/a/sub/bar2.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/sub2/a/sub/bar2.h b/tests/manual/qt4projectmanager/projecttree/sub2/a/sub/bar2.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/subpath/a/foo.cpp b/tests/manual/qt4projectmanager/projecttree/subpath/a/foo.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/subpath/a/foo.h b/tests/manual/qt4projectmanager/projecttree/subpath/a/foo.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/subpath/b/foo.cpp b/tests/manual/qt4projectmanager/projecttree/subpath/b/foo.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/subpath/b/foo.h b/tests/manual/qt4projectmanager/projecttree/subpath/b/foo.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/uniquesub/path/bar.cpp b/tests/manual/qt4projectmanager/projecttree/uniquesub/path/bar.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/uniquesub/path/bar.h b/tests/manual/qt4projectmanager/projecttree/uniquesub/path/bar.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/widget.cpp b/tests/manual/qt4projectmanager/projecttree/widget.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/widget.h b/tests/manual/qt4projectmanager/projecttree/widget.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree/widget.ui b/tests/manual/qt4projectmanager/projecttree/widget.ui new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data1/a/foo.cpp b/tests/manual/qt4projectmanager/projecttree_data1/a/foo.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data1/a/foo.h b/tests/manual/qt4projectmanager/projecttree_data1/a/foo.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data1/b/foo.cpp b/tests/manual/qt4projectmanager/projecttree_data1/b/foo.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data1/b/foo.h b/tests/manual/qt4projectmanager/projecttree_data1/b/foo.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data2/a/bar.cpp b/tests/manual/qt4projectmanager/projecttree_data2/a/bar.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data2/a/bar.h b/tests/manual/qt4projectmanager/projecttree_data2/a/bar.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data2/a/sub/bar2.cpp b/tests/manual/qt4projectmanager/projecttree_data2/a/sub/bar2.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data2/a/sub/bar2.h b/tests/manual/qt4projectmanager/projecttree_data2/a/sub/bar2.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data3/path/bar.cpp b/tests/manual/qt4projectmanager/projecttree_data3/path/bar.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/manual/qt4projectmanager/projecttree_data3/path/bar.h b/tests/manual/qt4projectmanager/projecttree_data3/path/bar.h new file mode 100644 index 00000000000..e69de29bb2d