show node in rspecwindow when it's selected
[sface.git] / sface / rspecwindow.py
similarity index 84%
rename from sface/screens/rspecscreen.py
rename to sface/rspecwindow.py
index 75be23a..17bef6a 100644 (file)
@@ -20,6 +20,32 @@ class RSpecView(QTreeView):
         self.setAttribute(Qt.WA_MacShowFocusRect, 0)
         self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
 
         self.setAttribute(Qt.WA_MacShowFocusRect, 0)
         self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
 
+    def expandMatchingText(self, txt):
+        self.collapseAll()
+        self.expandToDepth(0)
+
+        def recursiveExpand(index):
+            parent = index.parent()
+            if parent and parent.isValid():
+                recursiveExpand(parent)
+            self.expand(index)
+
+        def search(index):
+            if index.data().toString() == txt:
+                recursiveExpand(index)
+                self.scrollTo(index, self.PositionAtCenter)
+            
+            rows = model.rowCount(index)
+            for r in range(rows):
+                child_index = index.child(r, 0)
+                search(child_index)
+            
+        model = self.model()
+        root_rows = model.rowCount()
+        for r in range(root_rows):
+            index = model.index(r, 0)
+            search(index)
+
 
 class DomModel(QAbstractItemModel):
     def __init__(self, document, parent = 0):
 
 class DomModel(QAbstractItemModel):
     def __init__(self, document, parent = 0):
@@ -115,8 +141,8 @@ class DomModel(QAbstractItemModel):
             return QModelIndex()
         return self.createIndex(parentItem.row(), 0, parentItem)
 
             return QModelIndex()
         return self.createIndex(parentItem.row(), 0, parentItem)
 
-    def rowCount(self, parent):
-        if not parent.isValid():
+    def rowCount(self, parent=None):
+        if not parent or not parent.isValid():
             parentItem = self.rootItem
         else:
             parentItem = parent.internalPointer()
             parentItem = self.rootItem
         else:
             parentItem = parent.internalPointer()
@@ -160,9 +186,10 @@ class DomItem:
         return self.rowNumber
     
 
         return self.rowNumber
     
 
-class RSpecWidget(QWidget):
+class RSpecWindow(QDialog):
     def __init__(self, parent=None):
     def __init__(self, parent=None):
-        QWidget.__init__(self, parent)
+        QDialog.__init__(self, parent)
+        self.setWindowTitle("RSPec View")
 
         self.document = None
         self.model = None
 
         self.document = None
         self.model = None
@@ -173,7 +200,14 @@ class RSpecWidget(QWidget):
         self.setLayout(layout)
 
         self.updateView()
         self.setLayout(layout)
 
         self.updateView()
+
+    def show(self):
+        self.updateView()
+        QDialog.show(self)
         
         
+    def showNode(self, hostname):
+        self.view.expandMatchingText(hostname)
+
     def updateView(self):
         del self.document
         del self.model
     def updateView(self):
         del self.document
         del self.model
@@ -192,15 +226,3 @@ class RSpecWidget(QWidget):
         self.view.expand(self.model.index(0, 0)) #expand first level only
 
 
         self.view.expand(self.model.index(0, 0)) #expand first level only
 
 
-class RSpecScreen(SfaScreen):
-    def __init__(self, parent):
-        SfaScreen.__init__(self, parent)
-        
-        widget = RSpecWidget(self)
-        self.init(widget, "RSpec Window", "RSPec View")
-
-    def rspecUpdated(self):
-        self.widget.updateView()
-
-    def configurationChanged(self):
-        self.widget.updateView()