diff --git a/frappy/gui/logwindow.py b/frappy/gui/logwindow.py index d620ddb..55ee8c7 100644 --- a/frappy/gui/logwindow.py +++ b/frappy/gui/logwindow.py @@ -1,45 +1,72 @@ -from logging import DEBUG, NOTSET, Handler +from logging import NOTSET, Handler from frappy.gui.qt import QMainWindow, QObject, pyqtSignal -from frappy.gui.util import loadUi +from frappy.gui.util import Colors, loadUi class LogWindowHandler(Handler, QObject): - logmessage = pyqtSignal(str, int) + logmessage = pyqtSignal(object) def __init__(self, level=NOTSET): QObject.__init__(self) Handler.__init__(self, level) + self.log = [] def emit(self, record): - self.logmessage.emit(record.getMessage(), record.levelno) + self.log.append(record) + self.logmessage.emit(record) + + def getEntries(self, level): + return [rec for rec in self.log if rec.levelno >= level] class LogWindow(QMainWindow): + closed = pyqtSignal() levels = {'Debug':10, 'Info':20, 'Warning':30, 'Error':40} - def __init__(self, logger, parent=None): + + def __init__(self, handler, parent=None): super().__init__(parent) loadUi(self, 'logwindow.ui') - self.log = [] + self.timecolor = Colors.colors['gray'] self.level = self.levels['Info'] - handler = LogWindowHandler(DEBUG) - handler.logmessage.connect(self.newEntry) - logger.addHandler(handler) + self.messagecolors = { + 10 : Colors.colors['gray'], + 20 : Colors.palette.windowText().color(), + 30 : Colors.colors['orange'], + 40 : Colors.colors['red'], + } + self.handler = handler + self.handler.logmessage.connect(self.newEntry) + self.setMessages(self.handler.getEntries(self.level)) - def newEntry(self, msg, lvl): - self.log.append((lvl, msg)) - if lvl >= self.level: - self.logBrowser.append(msg) + def setMessages(self, msgs): + for msg in msgs: + self.appendMessage(msg) + + def newEntry(self, record): + if record.levelno >= self.level: + self.appendMessage(record) + + def appendMessage(self, record): + s = record.getMessage() + time = record.created + if record.levelno == self.levels['Error']: + s = '%s' %s + s='[%s] %s: %s' \ + % (self.timecolor.name(), time, \ + self.messagecolors[record.levelno].name(), \ + record.name, s) + self.logBrowser.append(s) def on_logLevel_currentTextChanged(self, level): self.level = self.levels[level] self.logBrowser.clear() - self.logBrowser.setPlainText('\n'.join(msg for (lvl, msg) in self.log if lvl >= self.level)) + self.setMessages(self.handler.getEntries(self.level)) def on_clear_pressed(self): self.logBrowser.clear() - self.log.clear() - def onClose(self): - pass + def closeEvent(self, event): + self.closed.emit() + self.deleteLater() diff --git a/frappy/gui/mainwindow.py b/frappy/gui/mainwindow.py index afe4450..14f9111 100644 --- a/frappy/gui/mainwindow.py +++ b/frappy/gui/mainwindow.py @@ -27,7 +27,7 @@ from frappy.gui.qt import QAction, QInputDialog, QKeySequence, QMainWindow, \ import frappy.version from frappy.gui.connection import QSECNode -from frappy.gui.logwindow import LogWindow +from frappy.gui.logwindow import LogWindow, LogWindowHandler from frappy.gui.nodewidget import NodeWidget from frappy.gui.tabwidget import TearOffTabWidget from frappy.gui.util import Colors, is_light_theme, loadUi @@ -94,9 +94,11 @@ class MainWindow(QMainWindow): def __init__(self, hosts, logger, parent=None): super().__init__(parent) + # centralized handling for logging and cmd-history + self.loghandler = LogWindowHandler() self.log = logger - self.logwin = LogWindow(logger, self) - self.logwin.hide() + self.log.addHandler(self.loghandler) + self.logwin = None self.historySerializer = HistorySerializer() loadUi(self, 'mainwin.ui') @@ -173,7 +175,18 @@ class MainWindow(QMainWindow): self._rebuildAdvanced(toggled) def on_actionShow_Logs_toggled(self, active): - self.logwin.setHidden(not active) + if not active and self.logwin: + self.logwin.close() + self.logwin = None + return + self.logwin = LogWindow(self.loghandler, self) + self.logwin.closed.connect(self.onLogWindowClose) + self.logwin.show() + + def onLogWindowClose(self): + if self.actionShow_Logs.isChecked(): + self.actionShow_Logs.toggle() + self.logwin = None def on_actionHighlightAnimation_toggled(self, toggled): settings = QSettings() @@ -274,4 +287,3 @@ class MainWindow(QMainWindow): # this is only qt signals deconnecting! widget.getSecNode().terminate_connection() self.historySerializer.saveHistory() - self.logwin.onClose() diff --git a/frappy/gui/ui/logwindow.ui b/frappy/gui/ui/logwindow.ui index 9cae014..c74aeca 100644 --- a/frappy/gui/ui/logwindow.ui +++ b/frappy/gui/ui/logwindow.ui @@ -6,23 +6,35 @@ 0 0 - 350 - 271 + 659 + 306 Log - + 0 10 - 351 - 261 + 651 + 291 + + 4 + + + 4 + + + 4 + + + 10 + @@ -30,6 +42,9 @@ Info + + 2 + Error diff --git a/frappy/gui/util.py b/frappy/gui/util.py index 154f352..51153e9 100644 --- a/frappy/gui/util.py +++ b/frappy/gui/util.py @@ -47,6 +47,8 @@ class Colors: cls.palette = palette if is_light_theme(palette): # light cls.colors = { + 'gray' : QColor('#696969'), + 'red' : QColor('#FF0000'), 'orange': QColor('#FA6800'), 'yellow': QColor('#FCFFa4'), 'plot-fg': QColor('black'), @@ -60,6 +62,8 @@ class Colors: } else: # dark cls.colors = { + 'gray' : QColor('#AAAAAA'), + 'red' : QColor('#FF0000'), 'orange': QColor('#FA6800'), 'yellow': QColor('#FEFE22'), 'plot-fg': QColor('white'),