gui: logwindow improvements
* make state consistent with menu action * colorize * add time to log message Change-Id: I0c0800ddb1843b826a6adacf4e4b18d52598acf2 Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30759 Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de> Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de> Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
This commit is contained in:
parent
2f730ab444
commit
155efb06bf
@ -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 = '<b>%s</b>' %s
|
||||
s='<span style="color:%s">[%s] </span><span style="color:%s">%s: %s</span>' \
|
||||
% (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()
|
||||
|
@ -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()
|
||||
|
@ -6,23 +6,35 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>350</width>
|
||||
<height>271</height>
|
||||
<width>659</width>
|
||||
<height>306</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Log</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="">
|
||||
<widget class="QWidget" name="layoutWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>10</y>
|
||||
<width>351</width>
|
||||
<height>261</height>
|
||||
<width>651</width>
|
||||
<height>291</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
@ -30,6 +42,9 @@
|
||||
<property name="currentText">
|
||||
<string>Info</string>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Error</string>
|
||||
|
@ -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'),
|
||||
|
Loading…
x
Reference in New Issue
Block a user