fix bug when submitting changes
[sface.git] / sface / mainwindow.py
index cefec17..a78bbfc 100644 (file)
@@ -110,7 +110,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 +121,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 +133,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("<a href='showlog'>Show Log</a>", self)
@@ -222,3 +232,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)
+