[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    koffice/kspread/plugins/scripting/scripts
From:       Sebastian Sauer <mail () dipe ! org>
Date:       2007-11-04 20:29:22
Message-ID: 1194208162.692012.31181.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 732810 by sebsauer:

added 'inspect' functionality to the python console docker.

 M  +201 -35   consoledocker.py  


--- trunk/koffice/kspread/plugins/scripting/scripts/consoledocker.py #732809:732810
@@ -9,63 +9,229 @@
 Dual-licensed under LGPL v2+higher and the BSD license.
 """
 
-import Kross, KoScriptingDocker, KSpread
+import os, sys, types
+import Kross, KoDocker, KSpread
 import PyQt4.Qt as Qt
-from sip import wrapinstance, unwrapinstance
+import sip #wrapinstance, unwrapinstance
 
-class ConsoleDocker(Qt.QWidget):
+def _getHome():
+    """ Return the homedirectory. """
+    import os
+    try:
+        home = os.getenv("HOME")
+        if not home:
+            import pwd
+            user = os.getenv("USER") or os.getenv("LOGNAME")
+            if not user:
+                pwent = pwd.getpwuid(os.getuid())
+            else:
+                pwent = pwd.getpwnam(user)
+            home = pwent[6]
+        return home
+    except (KeyError, ImportError):
+        return os.curdir
+
+#def executeFile(fileName):
+    #""" Execute a file. """
+    #if fileName.startswith("file://"):
+        #fileName = fileName[7:]
+    #fileName = fileName.replace("$HOME", _getHome())
+    #execfile(fileName, globals(), globals())
+
+class _ConsoleDocker(Qt.QWidget):
+    
+    class ConsoleModel(Qt.QAbstractItemModel):
+    
+        class Item:
+            def __init__(self, parentItem = None, object = None, name = ""):
+                self.parent = parentItem
+                self.object = object
+                self.name = name
+                self.children = []
+                if self.parent:
+                    self.parent.children.append(self)
+            def lazyLoadChildren(self):
+                if self.object:
+                    for s in dir(self.object):
+                        if not s.startswith('_'):
+                            try:
+                                _ConsoleDocker.ConsoleModel.Item(self, \
getattr(self.object,s), s) +                            except:
+                                pass
+            def row(self):
+                return 0
+            def hasChildren(self):
+                if not self.parent:
+                    return True
+                if isinstance(self.object, types.ClassType) or \
isinstance(self.object, types.ModuleType): +                    return True
+                if type(self.object) == type(Kross):
+                    return True
+                return False
+            def child(self, row):
+                if len(self.children) == 0:
+                    self.lazyLoadChildren()
+                return self.children[row]
+            def childCount(self):
+                if len(self.children) == 0:
+                    self.lazyLoadChildren()
+                return len(self.children)
+            def data(self, column):
+                if column == 0:
+                    return Qt.QVariant("%s" % self.name)
+                if column == 1 and self.object:
+                    if type(self.object) == type(Kross): return Qt.QVariant("ext")
+                    t = "%s" % type(self.object)
+                    return Qt.QVariant( t[ t.find("'")+1 : t.rfind("'") ] )
+                return Qt.QVariant()
+            
+        def __init__(self):
+            Qt.QAbstractItemModel.__init__(self)
+            self.rootItem = _ConsoleDocker.ConsoleModel.Item()
+            for s in globals():
+                if not s.startswith('_') and not s.startswith('PyQt4.Qt'):
+                    _ConsoleDocker.ConsoleModel.Item(self.rootItem, globals()[s], s)
+        def columnCount(self, parent):
+            return 2
+        def flags(self, index):
+            return Qt.QAbstractItemModel.flags(self, index)
+        def index(self, row, column, parent):
+            if parent.isValid():
+                parentItem = parent.internalPointer()
+            else:
+                parentItem = self.rootItem
+            childItem = parentItem.child(row)
+            if childItem:
+                return self.createIndex(row, column, childItem)
+            return Qt.QModelIndex()
+        def parent(self, index):
+            if index.isValid():
+                parentItem = index.internalPointer().parent
+                if parentItem and parentItem != self.rootItem:
+                    return self.createIndex(parentItem.row(), 0, parentItem)
+            return Qt.QModelIndex()
+        def data(self, index, role):
+            if index.isValid():
+                if role == 0: #Qt.DisplayRole:
+                    return index.internalPointer().data(index.column())
+            return Qt.QVariant()
+        def rowCount(self, parent):
+            if parent.isValid():
+                parentItem = parent.internalPointer()
+            else:
+                parentItem = self.rootItem
+            return parentItem.childCount()
+        def hasChildren(self, parent):
+            if parent.isValid():
+                parentItem = parent.internalPointer()
+            else:
+                parentItem = self.rootItem
+            return parentItem.hasChildren()
+        def headerData(self, section, orientation, role = 0):
+            if role == 0: #Qt.DisplayRole:
+                if section == 0:
+                    return Qt.QVariant("Name")
+                if section == 1:
+                    return Qt.QVariant("Type")
+            return Qt.QVariant()
+
     def __init__(self):
         Qt.QWidget.__init__(self)
         layout = Qt.QVBoxLayout()
         layout.setMargin(0)
         layout.setSpacing(0)
         self.setLayout(layout)
+        
+        self.pages = Qt.QTabWidget(self)
+        layout.addWidget(self.pages)
 
-        self.browser = Qt.QTextBrowser(self)
+        consoleWidget = Qt.QWidget(self)
+        consoleLayout = Qt.QVBoxLayout()
+        consoleLayout.setMargin(0)
+        consoleLayout.setSpacing(0)
+        consoleWidget.setLayout(consoleLayout)
+        self.pages.addTab(consoleWidget, "Console")
+
+        self.browser = Qt.QTextBrowser(consoleWidget)
         self.browser.setFrameShape(Qt.QFrame.NoFrame)
-        layout.addWidget(self.browser)
-
-        self.edit = Qt.QComboBox(self)
+        consoleLayout.addWidget(self.browser)
+        
+        self.edit = Qt.QComboBox(consoleWidget)
         self.edit.setEditable(True)
-        self.edit.insertItems(0, ['print dir(Kross)','print dir(KSpread)','print \
KSpread.sheetNames()']) +        self.edit.insertItems(0, ['','print \
globals().keys()','print dir(Kross)','print dir(KSpread)','print \
KSpread.sheetNames()','print Qt.PYQT_VERSION_STR','print sip.SIP_VERSION_STR'])  \
                self.browser.setFocusProxy(self.edit)
         Qt.QObject.connect(self.edit.lineEdit(), Qt.SIGNAL("returnPressed()"), \
                self.returnPressed)
-        layout.addWidget(self.edit)
+        consoleLayout.addWidget(self.edit)
 
-        docker = wrapinstance(KoScriptingDocker.__toPointer__(), Qt.QDockWidget)
+        self.tree = Qt.QTreeView(self)
+        self.tree.setFrameShape(Qt.QFrame.NoFrame)
+        self.tree.setRootIsDecorated(True)
+        self.tree.setSortingEnabled(False)
+        #self.tree.setAlternatingRowColors(True)
+        #self.tree.header().setResizeMode(0, Qt.QHeaderView.Stretch)
+        #self.tree.header().hide()
+        self.tree.header().setClickable(False)
+        self.model = _ConsoleDocker.ConsoleModel()
+        self.tree.setModel(self.model)
+        self.pages.addTab(self.tree, "Inspect")
+
+        self.treeExpired = True
+        Qt.QObject.connect(self.tree, Qt.SIGNAL("activated(QModelIndex)"), \
self.itemActivated) +        Qt.QObject.connect(self.pages, \
Qt.SIGNAL("currentChanged(int)"), self.currentChanged) +
+        docker = sip.wrapinstance(KoDocker.__toPointer__(), Qt.QDockWidget)
         docker.setWidget(self)
 
     def returnPressed(self):
         text = "%s" % self.edit.currentText()
         self.edit.clearEditText()
         self.execute(text)
+        self.treeExpired = True
+        
+    def itemActivated(self, index):
+        s = self.model.data(index, 0).toString()
+        parent = index
+        while True:
+            parent = self.model.parent(parent)
+            if not parent.isValid(): break
+            s = "%s.%s" % (self.model.data(parent, 0).toString(), s)
+        self.edit.lineEdit().setText("print %s" % s)
+        self.pages.setCurrentIndex(0)
+        #self.returnPressed()
 
+    def currentChanged(self, *args):
+        if self.pages.currentWidget() == self.tree:
+            if self.treeExpired:
+                self.tree.reset()
+                self.treeExpired = False
+        
     def execute(self, code):
         _stdout = sys.stdout
         _stderr = sys.stderr
-        class Base():
-            def __init__(self, browser):
-                self.browser = browser
-            def write(self, text):
-                self.browser.append(text)
-        class StdOut(Base):
-            def __init__(self, browser):
-                Base.__init__(self, browser)
-            def write(self, text):
-                Base.write(self, text.strip().replace("\n","<br>"))
-        class StdErr(Base):
-            def __init__(self, browser):
-                Base.__init__(self, browser)
-            def write(self, text):
-                Base.write(self, "<b>%s</b>" % text.strip().replace("\n","<br>"))
-        sys.stdout = StdOut(self.browser)
-        sys.stderr = StdErr(self.browser)
-        
-        sys.stdout.write("&gt; <i>%s</i>" % code.strip())
-        exec code in globals(), globals()
-        
-        sys.stdout = _stdout
-        sys.stderr = _stderr
+        try:
+            class Base():
+                def __init__(self, browser):
+                    self.browser = browser
+                def write(self, text):
+                    self.browser.append(text)
+            class StdOut(Base):
+                def __init__(self, browser):
+                    Base.__init__(self, browser)
+                def write(self, text):
+                    Base.write(self, text.strip().replace("\n","<br>"))
+            class StdErr(Base):
+                def __init__(self, browser):
+                    Base.__init__(self, browser)
+                def write(self, text):
+                    Base.write(self, "<b>%s</b>" % \
text.strip().replace("\n","<br>")) +            sys.stdout = StdOut(self.browser)
+            sys.stderr = StdErr(self.browser)
+            
+            sys.stdout.write("&gt; <i>%s</i>" % code.strip())
+            exec code in globals(), globals()
+        finally:
+            sys.stdout = _stdout
+            sys.stderr = _stderr
 
-print "Execute ConsoleDocker Script"
-ConsoleDocker()
+print "Execute _ConsoleDocker Script"
+_ConsoleDocker()


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic