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.rspecscreen import RSpecScreen
class Nav(QWidget):
def __init__(self, parent=None):
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)
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)
- def setLinks(self, main, rspec, config):
+ def setLinks(self, main, config):
self.main.setText(main)
- self.rspec.setText(rspec)
self.config.setText(config)
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.rspec_screen = RSpecScreen(self)
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.rspec_screen.getLinkText(),
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.addWidget(self.rspec)
hlayout.addWidget(self.log)
layout = QVBoxLayout()
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(self.rspec, SIGNAL('linkActivated(QString)'),
+ self.showRSpecWindow)
def redirectOutputToLog(self):
self.logWindow.redirectOutput()
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)
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()
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)
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 nodeSelectionChanged(self, hostname):
+ self.rspecWindow.showNode(hostname)
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):
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()
return self.rowNumber
-class RSpecWidget(QWidget):
+class RSpecWindow(QDialog):
def __init__(self, parent=None):
- QWidget.__init__(self, parent)
+ QDialog.__init__(self, parent)
+ self.setWindowTitle("RSPec View")
self.document = None
self.model = None
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
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()
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):
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()
- 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 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):
self.widget.updateSliceName()
self.widget.updateView()
+ def nodeSelectionChanged(self, hostname):
+ self.mainwin.nodeSelectionChanged(hostname)