Sat, 08 May 2010 20:52:46 +0200
Added code to update the file browser window automatically.
--- a/APIs/Python3/eric5.api Sat May 08 18:01:31 2010 +0200 +++ b/APIs/Python3/eric5.api Sat May 08 20:52:46 2010 +0200 @@ -5235,6 +5235,7 @@ eric5.UI.BrowserModel.BrowserCodingItem?1(parent, text) eric5.UI.BrowserModel.BrowserDirectoryItem.dirName?4() eric5.UI.BrowserModel.BrowserDirectoryItem.lessThan?4(other, column, order) +eric5.UI.BrowserModel.BrowserDirectoryItem.name?4() eric5.UI.BrowserModel.BrowserDirectoryItem.setName?4(dinfo, full = True) eric5.UI.BrowserModel.BrowserDirectoryItem?1(parent, dinfo, full = True) eric5.UI.BrowserModel.BrowserFileItem.dirName?4() @@ -5254,6 +5255,7 @@ eric5.UI.BrowserModel.BrowserFileItem.isSvgFile?4() eric5.UI.BrowserModel.BrowserFileItem.lessThan?4(other, column, order) eric5.UI.BrowserModel.BrowserFileItem.moduleName?4() +eric5.UI.BrowserModel.BrowserFileItem.name?4() eric5.UI.BrowserModel.BrowserFileItem.setName?4(finfo, full = True) eric5.UI.BrowserModel.BrowserFileItem?1(parent, finfo, full = True, sourceLanguage = "") eric5.UI.BrowserModel.BrowserItem.appendChild?4(child) @@ -5290,6 +5292,8 @@ eric5.UI.BrowserModel.BrowserMethodItem.lineno?4() eric5.UI.BrowserModel.BrowserMethodItem?1(parent, fn, filename) eric5.UI.BrowserModel.BrowserModel._addItem?5(itm, parentItem) +eric5.UI.BrowserModel.BrowserModel._addWatchedItem?5(itm) +eric5.UI.BrowserModel.BrowserModel._removeWatchedItem?5(itm) eric5.UI.BrowserModel.BrowserModel.addItem?4(itm, parent = QModelIndex()) eric5.UI.BrowserModel.BrowserModel.addTopLevelDir?4(dirname) eric5.UI.BrowserModel.BrowserModel.clear?4()
--- a/Documentation/Help/source.qhp Sat May 08 18:01:31 2010 +0200 +++ b/Documentation/Help/source.qhp Sat May 08 20:52:46 2010 +0200 @@ -3825,6 +3825,7 @@ <keyword name="BrowserDirectoryItem (Constructor)" id="BrowserDirectoryItem (Constructor)" ref="eric5.UI.BrowserModel.html#BrowserDirectoryItem.__init__" /> <keyword name="BrowserDirectoryItem.dirName" id="BrowserDirectoryItem.dirName" ref="eric5.UI.BrowserModel.html#BrowserDirectoryItem.dirName" /> <keyword name="BrowserDirectoryItem.lessThan" id="BrowserDirectoryItem.lessThan" ref="eric5.UI.BrowserModel.html#BrowserDirectoryItem.lessThan" /> + <keyword name="BrowserDirectoryItem.name" id="BrowserDirectoryItem.name" ref="eric5.UI.BrowserModel.html#BrowserDirectoryItem.name" /> <keyword name="BrowserDirectoryItem.setName" id="BrowserDirectoryItem.setName" ref="eric5.UI.BrowserModel.html#BrowserDirectoryItem.setName" /> <keyword name="BrowserFileItem (Constructor)" id="BrowserFileItem (Constructor)" ref="eric5.UI.BrowserModel.html#BrowserFileItem.__init__" /> <keyword name="BrowserFileItem.dirName" id="BrowserFileItem.dirName" ref="eric5.UI.BrowserModel.html#BrowserFileItem.dirName" /> @@ -3844,6 +3845,7 @@ <keyword name="BrowserFileItem.isSvgFile" id="BrowserFileItem.isSvgFile" ref="eric5.UI.BrowserModel.html#BrowserFileItem.isSvgFile" /> <keyword name="BrowserFileItem.lessThan" id="BrowserFileItem.lessThan" ref="eric5.UI.BrowserModel.html#BrowserFileItem.lessThan" /> <keyword name="BrowserFileItem.moduleName" id="BrowserFileItem.moduleName" ref="eric5.UI.BrowserModel.html#BrowserFileItem.moduleName" /> + <keyword name="BrowserFileItem.name" id="BrowserFileItem.name" ref="eric5.UI.BrowserModel.html#BrowserFileItem.name" /> <keyword name="BrowserFileItem.setName" id="BrowserFileItem.setName" ref="eric5.UI.BrowserModel.html#BrowserFileItem.setName" /> <keyword name="BrowserItem (Constructor)" id="BrowserItem (Constructor)" ref="eric5.UI.BrowserModel.html#BrowserItem.__init__" /> <keyword name="BrowserItem.appendChild" id="BrowserItem.appendChild" ref="eric5.UI.BrowserModel.html#BrowserItem.appendChild" /> @@ -3870,8 +3872,11 @@ <keyword name="BrowserMethodItem.lessThan" id="BrowserMethodItem.lessThan" ref="eric5.UI.BrowserModel.html#BrowserMethodItem.lessThan" /> <keyword name="BrowserMethodItem.lineno" id="BrowserMethodItem.lineno" ref="eric5.UI.BrowserModel.html#BrowserMethodItem.lineno" /> <keyword name="BrowserModel (Constructor)" id="BrowserModel (Constructor)" ref="eric5.UI.BrowserModel.html#BrowserModel.__init__" /> + <keyword name="BrowserModel.__directoryChanged" id="BrowserModel.__directoryChanged" ref="eric5.UI.BrowserModel.html#BrowserModel.__directoryChanged" /> <keyword name="BrowserModel.__populateModel" id="BrowserModel.__populateModel" ref="eric5.UI.BrowserModel.html#BrowserModel.__populateModel" /> <keyword name="BrowserModel._addItem" id="BrowserModel._addItem" ref="eric5.UI.BrowserModel.html#BrowserModel._addItem" /> + <keyword name="BrowserModel._addWatchedItem" id="BrowserModel._addWatchedItem" ref="eric5.UI.BrowserModel.html#BrowserModel._addWatchedItem" /> + <keyword name="BrowserModel._removeWatchedItem" id="BrowserModel._removeWatchedItem" ref="eric5.UI.BrowserModel.html#BrowserModel._removeWatchedItem" /> <keyword name="BrowserModel.addItem" id="BrowserModel.addItem" ref="eric5.UI.BrowserModel.html#BrowserModel.addItem" /> <keyword name="BrowserModel.addTopLevelDir" id="BrowserModel.addTopLevelDir" ref="eric5.UI.BrowserModel.html#BrowserModel.addTopLevelDir" /> <keyword name="BrowserModel.clear" id="BrowserModel.clear" ref="eric5.UI.BrowserModel.html#BrowserModel.clear" />
--- a/Documentation/Source/eric5.UI.BrowserModel.html Sat May 08 18:01:31 2010 +0200 +++ b/Documentation/Source/eric5.UI.BrowserModel.html Sat May 08 20:52:46 2010 +0200 @@ -439,6 +439,9 @@ <td><a href="#BrowserDirectoryItem.lessThan">lessThan</a></td> <td>Public method to check, if the item is less than the other one.</td> </tr><tr> +<td><a href="#BrowserDirectoryItem.name">name</a></td> +<td>Public method to return the name of the item.</td> +</tr><tr> <td><a href="#BrowserDirectoryItem.setName">setName</a></td> <td>Public method to set the directory name.</td> </tr> @@ -490,6 +493,16 @@ <dd> true, if this item is less than other (boolean) </dd> +</dl><a NAME="BrowserDirectoryItem.name" ID="BrowserDirectoryItem.name"></a> +<h4>BrowserDirectoryItem.name</h4> +<b>name</b>(<i></i>) +<p> + Public method to return the name of the item. +</p><dl> +<dt>Returns:</dt> +<dd> +name of the item (string) +</dd> </dl><a NAME="BrowserDirectoryItem.setName" ID="BrowserDirectoryItem.setName"></a> <h4>BrowserDirectoryItem.setName</h4> <b>setName</b>(<i>dinfo, full = True</i>) @@ -574,6 +587,9 @@ <td><a href="#BrowserFileItem.moduleName">moduleName</a></td> <td>Public method returning the module name.</td> </tr><tr> +<td><a href="#BrowserFileItem.name">name</a></td> +<td>Public method to return the name of the item.</td> +</tr><tr> <td><a href="#BrowserFileItem.setName">setName</a></td> <td>Public method to set the directory name.</td> </tr> @@ -778,6 +794,16 @@ <dd> module name (string) </dd> +</dl><a NAME="BrowserFileItem.name" ID="BrowserFileItem.name"></a> +<h4>BrowserFileItem.name</h4> +<b>name</b>(<i></i>) +<p> + Public method to return the name of the item. +</p><dl> +<dt>Returns:</dt> +<dd> +name of the item (string) +</dd> </dl><a NAME="BrowserFileItem.setName" ID="BrowserFileItem.setName"></a> <h4>BrowserFileItem.setName</h4> <b>setName</b>(<i>finfo, full = True</i>) @@ -1188,12 +1214,21 @@ <td><a href="#BrowserModel.__init__">BrowserModel</a></td> <td>Constructor</td> </tr><tr> +<td><a href="#BrowserModel.__directoryChanged">__directoryChanged</a></td> +<td>Private slot to handle the directoryChanged signal of the watcher.</td> +</tr><tr> <td><a href="#BrowserModel.__populateModel">__populateModel</a></td> <td>Private method to populate the browser model.</td> </tr><tr> <td><a href="#BrowserModel._addItem">_addItem</a></td> <td>Protected slot to add an item.</td> </tr><tr> +<td><a href="#BrowserModel._addWatchedItem">_addWatchedItem</a></td> +<td>Protected method to watch an item.</td> +</tr><tr> +<td><a href="#BrowserModel._removeWatchedItem">_removeWatchedItem</a></td> +<td>Protected method to remove a watched item.</td> +</tr><tr> <td><a href="#BrowserModel.addItem">addItem</a></td> <td>Puplic slot to add an item.</td> </tr><tr> @@ -1271,6 +1306,16 @@ <dd> reference to parent object (QObject) </dd> +</dl><a NAME="BrowserModel.__directoryChanged" ID="BrowserModel.__directoryChanged"></a> +<h4>BrowserModel.__directoryChanged</h4> +<b>__directoryChanged</b>(<i>path</i>) +<p> + Private 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="BrowserModel.__populateModel" ID="BrowserModel.__populateModel"></a> <h4>BrowserModel.__populateModel</h4> <b>__populateModel</b>(<i></i>) @@ -1289,6 +1334,26 @@ <dd> reference to item to add to (BrowserItem) </dd> +</dl><a NAME="BrowserModel._addWatchedItem" ID="BrowserModel._addWatchedItem"></a> +<h4>BrowserModel._addWatchedItem</h4> +<b>_addWatchedItem</b>(<i>itm</i>) +<p> + Protected method to watch an item. +</p><dl> +<dt><i>itm</i></dt> +<dd> +item to be watched (BrowserDirectoryItem) +</dd> +</dl><a NAME="BrowserModel._removeWatchedItem" ID="BrowserModel._removeWatchedItem"></a> +<h4>BrowserModel._removeWatchedItem</h4> +<b>_removeWatchedItem</b>(<i>itm</i>) +<p> + Protected method to remove a watched item. +</p><dl> +<dt><i>itm</i></dt> +<dd> +item to be removed (BrowserDirectoryItem) +</dd> </dl><a NAME="BrowserModel.addItem" ID="BrowserModel.addItem"></a> <h4>BrowserModel.addItem</h4> <b>addItem</b>(<i>itm, parent = QModelIndex()</i>) @@ -1554,7 +1619,7 @@ </p><dl> <dt><i>dirname</i></dt> <dd> -name of the directory containg the file (string) +name of the directory containing the file (string) </dd> </dl><a NAME="BrowserModel.removeToplevelDir" ID="BrowserModel.removeToplevelDir"></a> <h4>BrowserModel.removeToplevelDir</h4>
--- a/UI/BrowserModel.py Sat May 08 18:01:31 2010 +0200 +++ b/UI/BrowserModel.py Sat May 08 20:52:46 2010 +0200 @@ -46,6 +46,9 @@ self.rootItem = BrowserItem(None, rootData) self.progDir = None + self.watchedItems = {} + self.watcher = QFileSystemWatcher(self) + self.watcher.directoryChanged.connect(self.__directoryChanged) self.__populateModel() @@ -235,6 +238,96 @@ return index.internalPointer() + def _addWatchedItem(self, itm): + """ + Protected method to watch an item. + + @param itm item to be watched (BrowserDirectoryItem) + """ + if isinstance(itm, BrowserDirectoryItem): + dirName = itm.dirName() + if dirName not in self.watcher.directories() and \ + dirName != "" and \ + not dirName.startswith("//") and \ + not dirName.startswith("\\\\"): + self.watcher.addPath(dirName) + self.watchedItems[dirName] = itm + + def _removeWatchedItem(self, itm): + """ + Protected method to remove a watched item. + + @param itm item to be removed (BrowserDirectoryItem) + """ + if isinstance(itm, BrowserDirectoryItem): + dirName = itm.dirName() + self.watcher.removePath(dirName) + try: + del self.watchedItems[dirName] + except KeyError: + pass + + def __directoryChanged(self, path): + """ + Private 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 + + itm = self.watchedItems[path] + if itm.isPopulated(): + oldCnt = itm.childCount() + + qdir = QDir(itm.dirName()) + + entryInfoList = \ + qdir.entryInfoList(QDir.Filters(QDir.AllEntries | QDir.NoDotAndDotDot)) + + # step 1: check for new entries + for f in entryInfoList: + fpath = f.absoluteFilePath() + childFound = False + for child in itm.children(): + if child.name() == fpath: + childFound = True + break + if childFound: + continue + + cnt = itm.childCount() + self.beginInsertRows(self.createIndex(itm.row(), 0, itm), + cnt, cnt) + if f.isDir(): + node = BrowserDirectoryItem(itm, + Utilities.toNativeSeparators(f.absoluteFilePath()), + False) + self._addWatchedItem(node) + else: + node = BrowserFileItem(itm, + Utilities.toNativeSeparators(f.absoluteFilePath())) + self._addItem(node, itm) + 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 + break + if entryFound: + continue + + self.beginRemoveRows(self.createIndex(itm.row(), 0, itm), + row, row) + itm.removeChild(child) + self.endRemoveRows() + def __populateModel(self): """ Private method to populate the browser model. @@ -253,18 +346,20 @@ for d in self.toplevelDirs: self._addItem(BrowserDirectoryItem(self.rootItem, d), self.rootItem) + self.watcher.addPath(d) def programChange(self, dirname): """ Public method to change the entry for the directory of file being debugged. - @param dirname name of the directory containg the file (string) + @param dirname name of the directory containing the file (string) """ if self.progDir: if dirname == self.progDir.dirName(): return # remove old entry + self._removeWatchedItem(self.progDir) self.beginRemoveRows(QModelIndex(), self.progDir.row(), self.progDir.row()) self.rootItem.removeChild(self.progDir) self.endRemoveRows() @@ -273,6 +368,7 @@ itm = BrowserDirectoryItem(self.rootItem, dirname) self.addItem(itm) self.progDir = itm + self._addWatchedItem(itm) def addTopLevelDir(self, dirname): """ @@ -284,6 +380,7 @@ itm = BrowserDirectoryItem(self.rootItem, dirname) self.addItem(itm) self.toplevelDirs.append(itm.dirName()) + self._addWatchedItem(itm) def removeToplevelDir(self, index): """ @@ -300,6 +397,7 @@ self.endRemoveRows() self.toplevelDirs.remove(item.dirName()) + self._removeWatchedItem(item) def saveToplevelDirs(self): """ @@ -374,6 +472,7 @@ node = BrowserDirectoryItem(parentItem, Utilities.toNativeSeparators(f.absoluteFilePath()), False) + self._addWatchedItem(node) else: node = BrowserFileItem(parentItem, Utilities.toNativeSeparators(f.absoluteFilePath())) @@ -398,6 +497,7 @@ node = BrowserDirectoryItem(parentItem, p) self._addItem(node, parentItem) + self._addWatchedItem(node) if repopulate: self.endInsertRows() @@ -774,6 +874,14 @@ """ return self._dirName + def name(self): + """ + Public method to return the name of the item. + + @return name of the item (string) + """ + return self._dirName + def lessThan(self, other, column, order): """ Public method to check, if the item is less than the other one. @@ -903,6 +1011,14 @@ """ return self._filename + def name(self): + """ + Public method to return the name of the item. + + @return name of the item (string) + """ + return self._filename + def fileExt(self): """ Public method returning the file extension.