Sun, 09 May 2010 17:05:33 +0200
Added code to update the Others tab of the project browser (mostly) automatically.
--- a/APIs/Python3/eric5.api Sun May 09 14:58:03 2010 +0200 +++ b/APIs/Python3/eric5.api Sun May 09 17:05:33 2010 +0200 @@ -4304,6 +4304,7 @@ eric5.Project.ProjectBrowserModel.ProjectBrowserModel.addNewItem?4(typeString, name, additionalTypeStrings = []) eric5.Project.ProjectBrowserModel.ProjectBrowserModel.changeVCSStates?4(statesList) eric5.Project.ProjectBrowserModel.ProjectBrowserModel.data?4(index, role) +eric5.Project.ProjectBrowserModel.ProjectBrowserModel.directoryChanged?4(path) eric5.Project.ProjectBrowserModel.ProjectBrowserModel.findChildItem?4(text, column, parentItem = None) eric5.Project.ProjectBrowserModel.ProjectBrowserModel.findItem?4(name) eric5.Project.ProjectBrowserModel.ProjectBrowserModel.findParentItemByName?4(type_, name, dontSplit = False)
--- a/Documentation/Help/source.qhp Sun May 09 14:58:03 2010 +0200 +++ b/Documentation/Help/source.qhp Sun May 09 17:05:33 2010 +0200 @@ -4832,6 +4832,7 @@ <keyword name="ProjectBrowserModel.addNewItem" id="ProjectBrowserModel.addNewItem" ref="eric5.Project.ProjectBrowserModel.html#ProjectBrowserModel.addNewItem" /> <keyword name="ProjectBrowserModel.changeVCSStates" id="ProjectBrowserModel.changeVCSStates" ref="eric5.Project.ProjectBrowserModel.html#ProjectBrowserModel.changeVCSStates" /> <keyword name="ProjectBrowserModel.data" id="ProjectBrowserModel.data" ref="eric5.Project.ProjectBrowserModel.html#ProjectBrowserModel.data" /> + <keyword name="ProjectBrowserModel.directoryChanged" id="ProjectBrowserModel.directoryChanged" ref="eric5.Project.ProjectBrowserModel.html#ProjectBrowserModel.directoryChanged" /> <keyword name="ProjectBrowserModel.findChildItem" id="ProjectBrowserModel.findChildItem" ref="eric5.Project.ProjectBrowserModel.html#ProjectBrowserModel.findChildItem" /> <keyword name="ProjectBrowserModel.findItem" id="ProjectBrowserModel.findItem" ref="eric5.Project.ProjectBrowserModel.html#ProjectBrowserModel.findItem" /> <keyword name="ProjectBrowserModel.findParentItemByName" id="ProjectBrowserModel.findParentItemByName" ref="eric5.Project.ProjectBrowserModel.html#ProjectBrowserModel.findParentItemByName" />
--- a/Documentation/Source/eric5.Project.ProjectBrowserModel.html Sun May 09 14:58:03 2010 +0200 +++ b/Documentation/Source/eric5.Project.ProjectBrowserModel.html Sun May 09 17:05:33 2010 +0200 @@ -296,6 +296,9 @@ <td><a href="#ProjectBrowserModel.data">data</a></td> <td>Public method to get data of an item.</td> </tr><tr> +<td><a href="#ProjectBrowserModel.directoryChanged">directoryChanged</a></td> +<td>Public slot to handle the directoryChanged signal of the watcher.</td> +</tr><tr> <td><a href="#ProjectBrowserModel.findChildItem">findChildItem</a></td> <td>Public method to find a child item given some text.</td> </tr><tr> @@ -388,7 +391,7 @@ </dd><dt><i>name</i></dt> <dd> filename belonging to this item (string) -</dd><dt><i>recursive</i></dt> +</dd><dt><i>recursive=</i></dt> <dd> flag indicating a recursive update (boolean) </dd> @@ -448,6 +451,16 @@ <dd> requested data </dd> +</dl><a NAME="ProjectBrowserModel.directoryChanged" ID="ProjectBrowserModel.directoryChanged"></a> +<h4>ProjectBrowserModel.directoryChanged</h4> +<b>directoryChanged</b>(<i>path</i>) +<p> + Public slot to handle the directoryChanged signal of the watcher. +</p><dl> +<dt><i>path</i></dt> +<dd> +path of the directory (string) +</dd> </dl><a NAME="ProjectBrowserModel.findChildItem" ID="ProjectBrowserModel.findChildItem"></a> <h4>ProjectBrowserModel.findChildItem</h4> <b>findChildItem</b>(<i>text, column, parentItem = None</i>)
--- a/Project/ProjectBrowserModel.py Sun May 09 14:58:03 2010 +0200 +++ b/Project/ProjectBrowserModel.py Sun May 09 17:05:33 2010 +0200 @@ -222,6 +222,10 @@ self.progDir = None self.project = parent + self.watchedItems = {} + self.watcher = QFileSystemWatcher(self) + self.watcher.directoryChanged.connect(self.directoryChanged) + self.inRefresh = False self.projectBrowserTypes = { @@ -310,6 +314,8 @@ @param parentItem reference to the directory item to be populated @param repopulate flag indicating a repopulation (boolean) """ + self._addWatchedItem(parentItem) + qdir = QDir(parentItem.dirName()) entryInfoList = \ @@ -354,6 +360,9 @@ """ self.__vcsStatus = {} + self.watchedItems = {} + self.watcher.removePaths(self.watcher.directories()) + self.rootItem.removeChildren() self.reset() @@ -568,6 +577,78 @@ index = self.createIndex(itm.row(), 0, itm) return index + def directoryChanged(self, path): + """ + Public slot to handle the directoryChanged signal of the watcher. + + @param path path of the directory (string) + """ + if path not in self.watchedItems: + # just ignore the situation we don't have a reference to the item + return + + for itm in self.watchedItems[path]: + oldCnt = itm.childCount() + + qdir = QDir(itm.dirName()) + + entryInfoList = qdir.entryInfoList( + QDir.Filters(QDir.AllEntries | QDir.NoDotAndDotDot)) + + # step 1: check for new entries + children = itm.children() + for f in entryInfoList: + fpath = f.absoluteFilePath() + childFound = False + for child in children: + if child.name() == fpath: + childFound = True + children.remove(child) + break + if childFound: + continue + + cnt = itm.childCount() + self.beginInsertRows(self.createIndex(itm.row(), 0, itm), + cnt, cnt) + if f.isDir(): + node = ProjectBrowserDirectoryItem(itm, + Utilities.toNativeSeparators(f.absoluteFilePath()), + itm.getProjectTypes()[0], + False) + else: + node = ProjectBrowserFileItem(itm, + Utilities.toNativeSeparators(f.absoluteFilePath()), + itm.getProjectTypes()[0]) + self._addItem(node, itm) + if self.project.vcs is not None: + self.project.vcs.clearStatusCache() + state = self.project.vcs.vcsRegisteredState(node.name()) + if state == self.project.vcs.canBeCommitted: + node.addVcsStatus(self.project.vcs.vcsName()) + else: + node.addVcsStatus(self.trUtf8("local")) + self.endInsertRows() + + # step 2: check for removed entries + if len(entryInfoList) != itm.childCount(): + for row in range(oldCnt - 1, -1, -1): + child = itm.child(row) + entryFound = False + for f in entryInfoList: + if f.absoluteFilePath() == child.name(): + entryFound = True + entryInfoList.remove(f) + break + if entryFound: + continue + + self._removeWatchedItem(child) + self.beginRemoveRows(self.createIndex(itm.row(), 0, itm), + row, row) + itm.removeChild(child) + self.endRemoveRows() + def __addVCSStatus(self, item, name): """ Private method used to set the vcs status of a node. @@ -590,7 +671,7 @@ @param item item to work on @param name filename belonging to this item (string) - @param recursive flag indicating a recursive update (boolean) + @keyparam recursive flag indicating a recursive update (boolean) """ if self.project.vcs is not None: self.project.vcs.clearStatusCache()
--- a/Project/ProjectOthersBrowser.py Sun May 09 14:58:03 2010 +0200 +++ b/Project/ProjectOthersBrowser.py Sun May 09 17:05:33 2010 +0200 @@ -306,11 +306,11 @@ itm = self.model().item(self.currentIndex()) if isinstance(itm, ProjectBrowserFileItem): name = itm.fileName() + self.project.repopulateItem(name) elif isinstance(itm, ProjectBrowserDirectoryItem): name = itm.dirName() + self._model.directoryChanged(name) else: name = '' - if name: - self.project.repopulateItem(name) self._resizeColumns(QModelIndex())
--- a/changelog Sun May 09 14:58:03 2010 +0200 +++ b/changelog Sun May 09 17:05:33 2010 +0200 @@ -4,7 +4,8 @@ - bug fixes - added code to save the editor zoom factor in the session file - added code to configure the zoom factor a file is opened with -- added code to update the file browser window (mostly) automatically +- added code to update the file browser window (mostly) automatically +- added code to update the Others tab of the project browser (mostly) automatically Version 5.0-snapshot-20100508: - bug fixes