X-Git-Url: http://git.onelab.eu/?p=sface.git;a=blobdiff_plain;f=sface%2Fmainwindow.py;h=a8e7d3338a818af86724267fd5d5072cd069d489;hp=cefec17f11d9b4e277bc022b2284baed840101b8;hb=71265d697bc9e71beac6fabbb9dd775a90fbdfe7;hpb=ca5d17301939ddd993f658a3acae09d1aa56e5c9 diff --git a/sface/mainwindow.py b/sface/mainwindow.py index cefec17..a8e7d33 100644 --- a/sface/mainwindow.py +++ b/sface/mainwindow.py @@ -35,7 +35,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", "userscreen", "configscreen", "helpscreen"] sort_order.reverse() for modname in sort_order: if modname in modnames: @@ -96,6 +96,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 +111,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 +122,10 @@ class MainWindow(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) - self.logWindow = LogWindow(self) - self.rspecWindow = RSpecWindow(self) + # 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.pix = QLabel(self) @@ -131,15 +134,23 @@ class MainWindow(QWidget): self.screens = QStackedWidget(self) for screen in screenClasses: - screenWidget = screen(self) - self.screenWidgets.append(screenWidget) - self.screens.addWidget(screenWidget) + # use a try/catch block to isolate the screen. Third-party plugins + # could be buggy. + try: + screenWidget = screen(self) + self.screenWidgets.append(screenWidget) + self.screens.addWidget(screenWidget) + except: + print "Exception while creating screen", screen.__name__ + traceback.print_exc() self.screens.addWidget(self.pix) self.next_screen = None self.nav = Nav(self.screenWidgets, self) - self.nav.setTitle(self.screenWidgets[0].getTitleText()) + + if self.screenWidgets: + self.nav.setTitle(self.screenWidgets[0].getTitleText()) self.status = Status(self) self.log = QLabel("Show Log", self) @@ -222,3 +233,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) +