Added code to update the file browser window automatically.

Sat, 08 May 2010 20:52:46 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 08 May 2010 20:52:46 +0200
changeset 231
2e4eb047ae93
parent 230
2cde09c26384
child 232
0ee8be384de2

Added code to update the file browser window automatically.

APIs/Python3/eric5.api file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric5.UI.BrowserModel.html file | annotate | diff | comparison | revisions
UI/BrowserModel.py file | annotate | diff | comparison | revisions
--- 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()
Binary file Documentation/Help/source.qch has changed
--- 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.

eric ide

mercurial