support for boot_status tag; full-line highlight bar
[sface.git] / sface / logwindow.py
index 2719dcf..fd252ef 100644 (file)
@@ -1,36 +1,53 @@
 import sys
+from cStringIO import StringIO
 
 from PyQt4.QtCore import *
 from PyQt4.QtGui import *
 
 from sface.config import config
 
+import time
+
+class LogIO(QObject):
+    def __init__(self, parent, old_stdout):
+        QObject.__init__(self, parent)
+        self.io = StringIO()
+        self.old_stdout = old_stdout
+
+    def write(self, txt):
+        self.io.write(txt)
+        self.parent().update()
+
+    def getText(self):
+        val = self.io.getvalue()
+        # looks like there is no other way
+        # to empty the StringIO
+        del self.io
+        self.io = StringIO()
+        return val
 
 class LogWindow(QDialog):
     def __init__(self, parent=None):
         QWidget.__init__(self, parent)
         self.setWindowTitle("SFI Log")
         self.text = QTextBrowser(self)
+        self.text.ensureCursorVisible()
 
         layout = QVBoxLayout()
         layout.addWidget(self.text)
         self.setLayout(layout)
 
-        self.io = QIODevice(self)
-        self.connect(self.io, SIGNAL('canReadLine()'), self.appendLine)
+        self.logio = LogIO(self, sys.stdout)
 
     def redirectOutput(self):
-        print "Redirecting all output to Log Window. Please open the log window to see the output"
+        print "\n\nRedirecting all output to Log Window. Please open the log window to see the output\n"
         self.old_stdout = sys.stdout
         self.old_stderr = sys.stderr
-        sys.stdout = self.io
-        sys.stderr = self.io
-
-        self.old_stdout.write("test")
-        self.text.append("io Test\n")
-
-    def appendLine(self):
-        self.text.append(self.io.readLine())
-        
-        
-        
+        sys.stdout = self.logio
+        sys.stderr = self.logio
+
+    def update(self):
+        self.text.insertPlainText(self.logio.getText())
+        c = self.text.textCursor()
+        c.movePosition(QTextCursor.End)
+        self.text.setTextCursor(c)