UI/BrowserModel.py

branch
Py2 comp.
changeset 3484
645c12de6b0c
parent 3178
f25fc1364c88
parent 3440
ddcce63ab5cc
child 3506
d85fadb263a0
diff -r 96232974dcdb -r 645c12de6b0c UI/BrowserModel.py
--- a/UI/BrowserModel.py	Sun Mar 30 22:00:14 2014 +0200
+++ b/UI/BrowserModel.py	Thu Apr 03 23:05:31 2014 +0200
@@ -9,12 +9,12 @@
 
 from __future__ import unicode_literals
 
-import sys
 import os
 import fnmatch
+import json
 
 from PyQt4.QtCore import QDir, QModelIndex, QAbstractItemModel, \
-    QFileSystemWatcher, Qt
+    QFileSystemWatcher, Qt, QProcess
 from PyQt4.QtGui import QImageReader, QApplication, QFont
 
 import UI.PixmapCache
@@ -51,6 +51,9 @@
         self.watcher = QFileSystemWatcher(self)
         self.watcher.directoryChanged.connect(self.directoryChanged)
         
+        self.__sysPathInterpreter = ""
+        self.__sysPathItem = None
+        
         if not nopopulate:
             rootData = QApplication.translate("BrowserModel", "Name")
             self.rootItem = BrowserItem(None, rootData)
@@ -352,8 +355,6 @@
         """
         Private method to populate the browser model.
         """
-        self._addItem(BrowserSysPathItem(self.rootItem), self.rootItem)
-        
         self.toplevelDirs = []
         tdp = Preferences.Prefs.settings.value('BrowserModel/ToplevelDirs')
         if tdp:
@@ -369,6 +370,41 @@
             itm = BrowserDirectoryItem(self.rootItem, d)
             self._addItem(itm, self.rootItem)
     
+    def interpreterChanged(self, interpreter):
+        """
+        Public method to handle a change of the debug client's interpreter.
+        
+        @param interpreter interpreter of the debug client (string)
+        """
+        if interpreter and "python" in interpreter.lower():
+            if interpreter.endswith("w.exe"):
+                interpreter = interpreter.replace("w.exe", ".exe")
+            if self.__sysPathInterpreter != interpreter:
+                self.__sysPathInterpreter = interpreter
+                # step 1: remove sys.path entry
+                if self.__sysPathItem is not None:
+                    self.beginRemoveRows(
+                        QModelIndex(), self.__sysPathItem.row(),
+                        self.__sysPathItem.row())
+                    self.rootItem.removeChild(self.__sysPathItem)
+                    self.endRemoveRows()
+                    self.__sysPathItem = None
+                
+                if self.__sysPathInterpreter:
+                    # step 2: add a new one
+                    self.__sysPathItem = BrowserSysPathItem(self.rootItem)
+                    self.addItem(self.__sysPathItem)
+        else:
+            # remove sys.path entry
+            if self.__sysPathItem is not None:
+                self.beginRemoveRows(
+                    QModelIndex(), self.__sysPathItem.row(),
+                    self.__sysPathItem.row())
+                self.rootItem.removeChild(self.__sysPathItem)
+                self.endRemoveRows()
+                self.__sysPathItem = None
+            self.__sysPathInterpreter = ""
+    
     def programChange(self, dirname):
         """
         Public method to change the entry for the directory of file being
@@ -524,19 +560,31 @@
         @param parentItem reference to the sys.path item to be populated
         @param repopulate flag indicating a repopulation (boolean)
         """
-        if len(sys.path) > 0:
-            if repopulate:
-                self.beginInsertRows(
-                    self.createIndex(parentItem.row(), 0, parentItem),
-                    0, len(sys.path) - 1)
-            for p in sys.path:
-                if p == '':
-                    p = os.getcwd()
-                
-                node = BrowserDirectoryItem(parentItem, p)
-                self._addItem(node, parentItem)
-            if repopulate:
-                self.endInsertRows()
+        if self.__sysPathInterpreter:
+            script = "import sys, json; print(json.dumps(sys.path))"
+            proc = QProcess()
+            proc.start(self.__sysPathInterpreter, ["-c", script])
+            finished = proc.waitForFinished(3000)
+            if finished:
+                procOutput = str(proc.readAllStandardOutput(),
+                                 Preferences.getSystem("IOEncoding"),
+                                 'replace')
+                syspath = [p for p in json.loads(procOutput) if p]
+                if len(syspath) > 0:
+                    if repopulate:
+                        self.beginInsertRows(
+                            self.createIndex(parentItem.row(), 0, parentItem),
+                            0, len(syspath) - 1)
+                    for p in syspath:
+                        if os.path.isdir(p):
+                            node = BrowserDirectoryItem(parentItem, p)
+                        else:
+                            node = BrowserFileItem(parentItem, p)
+                        self._addItem(node, parentItem)
+                    if repopulate:
+                        self.endInsertRows()
+            else:
+                proc.kill()
 
     def populateFileItem(self, parentItem, repopulate=False):
         """
@@ -586,6 +634,7 @@
                 self._addItem(node, parentItem)
             if repopulate:
                 self.endInsertRows()
+        parentItem._populated = True
 
     def populateClassItem(self, parentItem, repopulate=False):
         """

eric ide

mercurial