Added code to update the Others tab of the project browser (mostly) automatically.

Sun, 09 May 2010 17:05:33 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 09 May 2010 17:05:33 +0200
changeset 234
caed45a134f8
parent 233
9d2677615a3d
child 235
7cb9905b0cf9

Added code to update the Others tab of the project browser (mostly) 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.Project.ProjectBrowserModel.html file | annotate | diff | comparison | revisions
Project/ProjectBrowserModel.py file | annotate | diff | comparison | revisions
Project/ProjectOthersBrowser.py file | annotate | diff | comparison | revisions
changelog file | annotate | diff | comparison | revisions
--- 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)
Binary file Documentation/Help/source.qch has changed
--- 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

eric ide

mercurial