X-Git-Url: http://git.onelab.eu/?p=sface.git;a=blobdiff_plain;f=sface%2Fmainwindow.py;h=dc0e6a04b5970850d91b603fc76e18ee7f9f6085;hp=153336fdd88c50e8f158e50d972e32d1d347ff96;hb=96ec1c38a62466c4d69a57835d470fee98a39edc;hpb=fd26e02e08369351315c100eba0b97ab7030ef00 diff --git a/sface/mainwindow.py b/sface/mainwindow.py index 153336f..dc0e6a0 100644 --- a/sface/mainwindow.py +++ b/sface/mainwindow.py @@ -6,11 +6,17 @@ import traceback from PyQt4.QtCore import * from PyQt4.QtGui import * +from distutils.version import LooseVersion +from sfa.util.version import version_core + import sface.screens from sface.config import config from sface.logwindow import LogWindow -from sface.rspecwindow import RSpecWindow +from sface.rspecwindow import RSpecWindow, ResourcesWindow from sface.screens.sfascreen import SfaScreen +from sface.xmlrpcwindow import get_tracker, init_tracker + +MINIMUM_SFA_VERSION = "1.0-37" # depending on the platform.. # could probably use Qt's resource system but looks overkill for just one file... @@ -35,7 +41,7 @@ def load_screens(dirname): # we want the stock screens to show up in a specific order. plugins can # show up in any order afterward. - sort_order = ["mainscreen", "configscreen", "helpscreen"] + sort_order = ["mainscreen", "statusscreen", "userscreen", "configscreen", "helpscreen"] sort_order.reverse() for modname in sort_order: if modname in modnames: @@ -62,6 +68,15 @@ def load_screens(dirname): return screens +def check_version(): + sfa_version = version_core()['code_tag'] + if (LooseVersion(sfa_version) < LooseVersion(MINIMUM_SFA_VERSION)): + QMessageBox.warning(None, "Old SFA Version", "sfa version %s is required. " + "Your installed version is %s. " + "Please upgrade your sfa and sfa-client packages." + % (MINIMUM_SFA_VERSION, sfa_version) ) + sys.exit(-1) + class Nav(QWidget): def __init__(self, screens, parent=None): QWidget.__init__(self, parent) @@ -96,6 +111,7 @@ class Nav(QWidget): class Status(QLabel): def __init__(self, parent=None): QLabel.__init__(self, "", parent) + self.setMaximumWidth(640) self.sliceUpdateDate() def set(self, msg, timeout): @@ -110,7 +126,7 @@ class Status(QLabel): creation_time = os.stat(rspec_file).st_ctime last_update = time.ctime(creation_time) - self.set("Slice data last updated on %s" % last_update, timeout=None) + self.set("Slice data last refreshed on %s" % last_update, timeout=None) def reset(self): self.setText("") @@ -121,8 +137,14 @@ class MainWindow(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) - self.logWindow = LogWindow(self) - self.rspecWindow = RSpecWindow(self) + check_version() + + # These are top-level windows and should be initialized with parent set + # to our parent. Otherwise, getting a segfault on exit in Ubuntu. + self.logWindow = LogWindow(parent) + self.rspecWindow = RSpecWindow(parent) + self.resourcesWindow = ResourcesWindow(parent) + self.trackerWindow = init_tracker(parent) self.pix = QLabel(self) @@ -150,13 +172,17 @@ class MainWindow(QWidget): self.nav.setTitle(self.screenWidgets[0].getTitleText()) self.status = Status(self) - self.log = QLabel("Show Log", self) - self.rspec = QLabel("Show RSpec", self) + self.tracker = QLabel("Xmlrpc", self) + self.log = QLabel("Log", self) + self.rspec = QLabel("RSpec", self) + self.resources = QLabel("Resources", self) hlayout = QHBoxLayout() hlayout.addWidget(self.status) hlayout.addStretch() + hlayout.addWidget(self.tracker) hlayout.addWidget(self.rspec) + hlayout.addWidget(self.resources) hlayout.addWidget(self.log) layout = QVBoxLayout() @@ -170,14 +196,25 @@ class MainWindow(QWidget): self.connect(link, SIGNAL('linkActivated(QString)'), self.animateToScreen) + self.connect(self.tracker, SIGNAL('linkActivated(QString)'), + self.showTrackerWindow) self.connect(self.log, SIGNAL('linkActivated(QString)'), self.showLogWindow) self.connect(self.rspec, SIGNAL('linkActivated(QString)'), self.showRSpecWindow) + self.connect(self.resources, SIGNAL('linkActivated(QString)'), + self.showResourcesWindow) def redirectOutputToLog(self): self.logWindow.redirectOutput() + def showTrackerWindow(self): + tracker = get_tracker() + tracker.show() + tracker.resize(500, 640) + tracker.raise_() + tracker.activateWindow() + def showLogWindow(self, link): self.logWindow.show() self.logWindow.resize(800, 200) @@ -190,6 +227,11 @@ class MainWindow(QWidget): self.rspecWindow.raise_() self.rspecWindow.activateWindow() + def showResourcesWindow(self, link): + self.resourcesWindow.show() + self.resourcesWindow.resize(500, 640) + self.resourcesWindow.raise_() + self.resourcesWindow.activateWindow() def animatePixmap(self, y): self.pix.move(0, y) @@ -219,7 +261,6 @@ class MainWindow(QWidget): self.connect(timeLine, SIGNAL('finished()'), self.toNextScreen) timeLine.start() - def toNextScreen(self): self.screens.setCurrentWidget(self.next_screen) self.nav.setTitle(self.next_screen.getTitleText()) @@ -230,3 +271,17 @@ class MainWindow(QWidget): def nodeSelectionChanged(self, hostname): if self.rspecWindow.isVisible(): self.rspecWindow.showNode(hostname) + + def closeEvent(self, event): + # give the screens an opportunity to veto the close + for screen in self.screenWidgets: + if not screen.canClose(): + event.ignore() + return + + # give the screens an opportunity to close gracefully + for screen in self.screenWidgets: + screen.mainWindowClose() + + QWidget.closeEvent(self, event) +