show node in rspecwindow when it's selected
authorBarış Metin <Talip-Baris.Metin@sophia.inria.fr>
Wed, 15 Sep 2010 15:29:36 +0000 (17:29 +0200)
committerBarış Metin <Talip-Baris.Metin@sophia.inria.fr>
Wed, 15 Sep 2010 15:29:36 +0000 (17:29 +0200)
sface/mainwindow.py
sface/rspecwindow.py [moved from sface/screens/rspecscreen.py with 84% similarity]
sface/screens/mainscreen.py

index b04e638..c1c80b6 100644 (file)
@@ -8,9 +8,9 @@ from PyQt4.QtGui import *
 
 from sface.config import config
 from sface.logwindow import LogWindow
 
 from sface.config import config
 from sface.logwindow import LogWindow
+from sface.rspecwindow import RSpecWindow
 from sface.screens.configscreen import ConfigScreen
 from sface.screens.mainscreen import MainScreen
 from sface.screens.configscreen import ConfigScreen
 from sface.screens.mainscreen import MainScreen
-from sface.screens.rspecscreen import RSpecScreen
 
 class Nav(QWidget):
     def __init__(self, parent=None):
 
 class Nav(QWidget):
     def __init__(self, parent=None):
@@ -20,9 +20,6 @@ class Nav(QWidget):
         self.main = QLabel("", self)
         self.main.setAlignment(Qt.AlignRight)
 
         self.main = QLabel("", self)
         self.main.setAlignment(Qt.AlignRight)
 
-        self.rspec = QLabel("", self)
-        self.rspec.setAlignment(Qt.AlignRight)
-
         self.config = QLabel("", self)
         self.config.setAlignment(Qt.AlignRight)
         
         self.config = QLabel("", self)
         self.config.setAlignment(Qt.AlignRight)
         
@@ -31,16 +28,14 @@ class Nav(QWidget):
         hlayout.addStretch()
         hlayout.addWidget(QLabel("Go to: ", self))
         hlayout.addWidget(self.main)
         hlayout.addStretch()
         hlayout.addWidget(QLabel("Go to: ", self))
         hlayout.addWidget(self.main)
-        hlayout.addWidget(self.rspec)
         hlayout.addWidget(self.config)
         self.setLayout(hlayout)
 
     def setTitle(self, title):
         self.title.setText(title)
 
         hlayout.addWidget(self.config)
         self.setLayout(hlayout)
 
     def setTitle(self, title):
         self.title.setText(title)
 
-    def setLinks(self, main, rspec, config):
+    def setLinks(self, main, config):
         self.main.setText(main)
         self.main.setText(main)
-        self.rspec.setText(rspec)
         self.config.setText(config)
 
 
         self.config.setText(config)
 
 
@@ -72,31 +67,31 @@ class MainWindow(QWidget):
         QWidget.__init__(self, parent)
 
         self.logWindow = LogWindow(self)
         QWidget.__init__(self, parent)
 
         self.logWindow = LogWindow(self)
+        self.rspecWindow = RSpecWindow(self)
 
         self.pix = QLabel(self)
         self.config_screen = ConfigScreen(self)
         self.main_screen = MainScreen(self)
 
         self.pix = QLabel(self)
         self.config_screen = ConfigScreen(self)
         self.main_screen = MainScreen(self)
-        self.rspec_screen = RSpecScreen(self)
 
         self.screens = QStackedWidget(self)
         self.screens.addWidget(self.main_screen)
         self.screens.addWidget(self.config_screen)
 
         self.screens = QStackedWidget(self)
         self.screens.addWidget(self.main_screen)
         self.screens.addWidget(self.config_screen)
-        self.screens.addWidget(self.rspec_screen)
         self.screens.addWidget(self.pix)
         self.next_screen = None
 
         self.nav = Nav(self)
         self.nav.setTitle(self.main_screen.getTitleText())
         self.nav.setLinks(self.main_screen.getLinkText(),
         self.screens.addWidget(self.pix)
         self.next_screen = None
 
         self.nav = Nav(self)
         self.nav.setTitle(self.main_screen.getTitleText())
         self.nav.setLinks(self.main_screen.getLinkText(),
-                          self.rspec_screen.getLinkText(),
                           self.config_screen.getLinkText())
 
         self.status = Status(self)
         self.log = QLabel("<a href='showlog'>Show Log</a>", self)
                           self.config_screen.getLinkText())
 
         self.status = Status(self)
         self.log = QLabel("<a href='showlog'>Show Log</a>", self)
+        self.rspec = QLabel("<a href='showlog'>Show RSpec</a>", self)
 
         hlayout = QHBoxLayout()
         hlayout.addWidget(self.status)
         hlayout.addStretch()
 
         hlayout = QHBoxLayout()
         hlayout.addWidget(self.status)
         hlayout.addStretch()
+        hlayout.addWidget(self.rspec)
         hlayout.addWidget(self.log)
 
         layout = QVBoxLayout()
         hlayout.addWidget(self.log)
 
         layout = QVBoxLayout()
@@ -106,12 +101,14 @@ class MainWindow(QWidget):
         self.setLayout(layout)
         self.resize(800, 600)
 
         self.setLayout(layout)
         self.resize(800, 600)
 
-        for link in (self.nav.main, self.nav.rspec, self.nav.config):
+        for link in (self.nav.main, self.nav.config):
             self.connect(link, SIGNAL('linkActivated(QString)'),
                          self.animateToScreen)
 
         self.connect(self.log, SIGNAL('linkActivated(QString)'),
                      self.showLogWindow)
             self.connect(link, SIGNAL('linkActivated(QString)'),
                          self.animateToScreen)
 
         self.connect(self.log, SIGNAL('linkActivated(QString)'),
                      self.showLogWindow)
+        self.connect(self.rspec, SIGNAL('linkActivated(QString)'),
+                     self.showRSpecWindow)
 
     def redirectOutputToLog(self):
         self.logWindow.redirectOutput()
 
     def redirectOutputToLog(self):
         self.logWindow.redirectOutput()
@@ -122,6 +119,13 @@ class MainWindow(QWidget):
         self.logWindow.raise_()
         self.logWindow.activateWindow()
 
         self.logWindow.raise_()
         self.logWindow.activateWindow()
 
+    def showRSpecWindow(self, link):
+        self.rspecWindow.show()
+        self.rspecWindow.resize(500, 640)
+        self.rspecWindow.raise_()
+        self.rspecWindow.activateWindow()
+
+
     def animatePixmap(self, y):
         self.pix.move(0, y)
 
     def animatePixmap(self, y):
         self.pix.move(0, y)
 
@@ -130,8 +134,6 @@ class MainWindow(QWidget):
             self.next_screen = self.config_screen
         elif link == self.main_screen.name:
             self.next_screen = self.main_screen
             self.next_screen = self.config_screen
         elif link == self.main_screen.name:
             self.next_screen = self.main_screen
-        elif link == self.rspec_screen.name:
-            self.next_screen = self.rspec_screen
 
         curr_screen = self.screens.currentWidget()
 
 
         curr_screen = self.screens.currentWidget()
 
@@ -156,8 +158,6 @@ class MainWindow(QWidget):
             self.toConfigScreen()
         elif self.next_screen == self.main_screen:
             self.toMainScreen()
             self.toConfigScreen()
         elif self.next_screen == self.main_screen:
             self.toMainScreen()
-        elif self.next_screen == self.rspec_screen:
-            self.toRSpecScreen()
 
     def toConfigScreen(self):
         self.screens.setCurrentWidget(self.config_screen)
 
     def toConfigScreen(self):
         self.screens.setCurrentWidget(self.config_screen)
@@ -167,10 +167,8 @@ class MainWindow(QWidget):
         self.screens.setCurrentWidget(self.main_screen)
         self.nav.setTitle(self.main_screen.getTitleText())
 
         self.screens.setCurrentWidget(self.main_screen)
         self.nav.setTitle(self.main_screen.getTitleText())
 
-    def toRSpecScreen(self):
-        self.screens.setCurrentWidget(self.rspec_screen)
-        self.nav.setTitle(self.rspec_screen.getTitleText())
-
     def setStatus(self, msg, timeout):
         self.status.set(msg, timeout)
 
     def setStatus(self, msg, timeout):
         self.status.set(msg, timeout)
 
+    def nodeSelectionChanged(self, hostname):
+        self.rspecWindow.showNode(hostname)
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()
index a47ba3c..d56bca5 100644 (file)
@@ -46,6 +46,15 @@ class NodeView(QTreeView):
             else: model.setData(status_index, QString(node_status['out']))
 
         model.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), hostname_index, hostname_index)
             else: model.setData(status_index, QString(node_status['out']))
 
         model.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), hostname_index, hostname_index)
+
+    def mouseReleaseEvent(self, event):
+        index = self.currentIndex()
+        model = index.model()
+        hostname_index = model.index(index.row(), 1, index.parent())
+        hostname_data = hostname_index.data().toString()
+
+        self.emit(SIGNAL('hostnameClicked(QString)'), hostname_data)
+        
                 
 
 class NodeNameDelegate(QStyledItemDelegate):
                 
 
 class NodeNameDelegate(QStyledItemDelegate):
@@ -314,14 +323,11 @@ class SliceWidget(QWidget):
         self.connect(refresh, SIGNAL('clicked()'), self.refresh)
         self.connect(submit, SIGNAL('clicked()'), self.submit)
         self.connect(searchbox, SIGNAL('textChanged(QString)'), self.filter)
         self.connect(refresh, SIGNAL('clicked()'), self.refresh)
         self.connect(submit, SIGNAL('clicked()'), self.submit)
         self.connect(searchbox, SIGNAL('textChanged(QString)'), self.filter)
-        self.connect(self.process, SIGNAL('readyReadStandardOutput()'), self.processOutputReady)
-        self.connect(self.process, SIGNAL('readyReadStandardError()'), self.processOutputReady)
+        self.connect(self.nodeView, SIGNAL('hostnameClicked(QString)'),
+                     self.nodeSelectionChanged)
 
         self.updateView()
 
 
         self.updateView()
 
-    def processOutputReady(self):
-        self.parent().logWindow.setText(self.process.readOutput())
-
     def submitFinished(self):
         self.setStatus("<font color='green'>Slice data submitted.</font>")
         QTimer.singleShot(1000, self.refresh)
     def submitFinished(self):
         self.setStatus("<font color='green'>Slice data submitted.</font>")
         QTimer.singleShot(1000, self.refresh)
@@ -445,6 +451,8 @@ class SliceWidget(QWidget):
     def updateSliceName(self):
         self.slicename.setText("Slice : %s" % (config.getSlice() or "None"))
 
     def updateSliceName(self):
         self.slicename.setText("Slice : %s" % (config.getSlice() or "None"))
 
+    def nodeSelectionChanged(self, hostname):
+        self.parent().nodeSelectionChanged(hostname)
 
 class MainScreen(SfaScreen):
     def __init__(self, parent):
 
 class MainScreen(SfaScreen):
     def __init__(self, parent):
@@ -457,3 +465,5 @@ class MainScreen(SfaScreen):
         self.widget.updateSliceName()
         self.widget.updateView()
 
         self.widget.updateSliceName()
         self.widget.updateView()
 
+    def nodeSelectionChanged(self, hostname):
+        self.mainwin.nodeSelectionChanged(hostname)