#! /usr/bin/env python
# -*- coding: utf-8 -*-
###############################################################################
## ##
## Copyright 2010, Neil Wallace <rowinggolfer@googlemail.com> ##
## ##
## This program is free software: you can redistribute it and/or modify ##
## it under the terms of the GNU General Public License as published by ##
## the Free Software Foundation, either version 3 of the License, or ##
## (at your option) any later version. ##
## ##
## This program is distributed in the hope that it will be useful, ##
## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
## GNU General Public License for more details. ##
## ##
## You should have received a copy of the GNU General Public License ##
## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
## ##
###############################################################################
import logging
import re
from PyQt4 import QtCore, QtGui
from lib_openmolar.common.qt4.widgets import Advisor
[docs]class LogWidget(QtGui.QFrame, Advisor):
'''
provides a text edit with clear, save and print functions
'''
[docs] def __init__(self, logger=None, parent=None):
QtGui.QFrame.__init__(self, parent)
Advisor.__init__(self)
self.init_logger(logger)
self.text_browser = QtGui.QTextBrowser()
self.text_browser.setStyleSheet("background-color:black;color:white")
self.text_browser.setFont(QtGui.QFont("courier", 10))
verbosity_box = QtGui.QComboBox(self)
verbosity_box.addItems([
_("Verbosity"), "DEBUG (%s)"%_("maximum"),
"INFO (%s)"%_("default"), "WARNING (%s)"%_("minimum")])
verbosity_box.currentIndexChanged.connect(self.set_verbosity)
self.clear_button = QtGui.QPushButton()
icon = QtGui.QIcon.fromTheme("edit-clear")
self.clear_button.setIcon(icon)
self.clear_button.setText(_("Clear"))
save_button = QtGui.QPushButton()
icon = QtGui.QIcon.fromTheme("document-save")
save_button.setIcon(icon)
save_button.setText(_("Save to file"))
print_button = QtGui.QPushButton()
icon = QtGui.QIcon.fromTheme("printer")
print_button.setIcon(icon)
print_button.setText(_("Print"))
frame = QtGui.QFrame()
layout = QtGui.QHBoxLayout(frame)
layout.setMargin(0)
spacer = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Expanding)
layout.addWidget(verbosity_box)
layout.addItem(spacer)
layout.addWidget(self.clear_button)
layout.addWidget(save_button)
layout.addWidget(print_button)
layout = QtGui.QVBoxLayout(self)
layout.setMargin(3)
layout.setSpacing(2)
layout.addWidget(self.text_browser)
layout.addWidget(frame)
self.clear_button.clicked.connect(self.clear)
save_button.clicked.connect(self.save)
print_button.clicked.connect(self.print_)
self.dirty = False
[docs] def log(self, record, dirty=True):
'''
append message to the text in the browser
record has the following attrs..
'args', 'created', 'exc_info', 'exc_text', 'filename', 'funcName',
'getMessage', 'levelname', 'levelno', 'lineno', 'module', 'msecs',
'msg', 'name', 'pathname', 'process', 'processName',
'relativeCreated', 'thread', 'threadName'
'''
self.text_browser.moveCursor(QtGui.QTextCursor.End)
message = "%s %s\n"% (record.levelname.ljust(8), record.getMessage())
self.text_browser.insertPlainText(message)
self.text_browser.moveCursor(QtGui.QTextCursor.End)
self.dirty = self.dirty or dirty
[docs] def set_verbosity(self, level):
'''
alters the level of the logger
'''
if level == 1: #max
self.logger.setLevel(logging.DEBUG)
self.logger.info("Changed verbosity level to DEBUG")
elif level == 3: #min
self.logger.setLevel(logging.WARNING)
self.logger.warning("Changed verbosity level to WARNING")
else:
self.logger.setLevel(logging.INFO)
self.logger.info("Changed verbosity level to INFO")
[docs] def init_logger(self, logger):
if logger == None:
logging.basicConfig(level = logging.DEBUG)
logger = logging.getLogger("test logger")
self.logger = logger
handler = logging.StreamHandler()
handler.emit = self.log
logger.addHandler(handler)
[docs] def clear(self):
if QtGui.QMessageBox.question(self, _("confirm"),
_("Clear log text?"), QtGui.QMessageBox.Yes|QtGui.QMessageBox.Cancel,
QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
self.text_browser.clear()
self.dirty = False
self.welcome()
[docs] def welcome(self):
if self.text_browser.document().toPlainText() == "":
message = u"%s - %s\n\n"% (_("Welcome to OpenMolar-Admin"),
QtCore.QDate.currentDate().toString())
self.text_browser.setPlainText(message)
[docs] def save(self):
try:
filepath = QtGui.QFileDialog.getSaveFileName(self,
_("save log text"),"log.txt",
_("text files ")+"(*.txt)")
if filepath != '':
if not re.match(".*\.txt$", filepath):
filepath += ".txt"
f = open(filepath, "w")
text = self.text_browser.document().toPlainText()
f.write(text)
f.close()
self.advise(_("Log Saved"))
self.dirty = False
else:
self.advise(_("Not Saved"))
except Exception, e:
self.advise(_("Log not saved")+" - %s"% e, 2)
[docs] def print_(self):
printer = QtGui.QPrinter()
dl = QtGui.QPrintDialog(printer, self)
if dl.exec_():
self.text_browser.print_(printer)
def _test():
def log_stuff():
obj.logger.info("random message")
app = QtGui.QApplication([])
mw = QtGui.QMainWindow()
obj = LogWidget()
but = QtGui.QPushButton("send something to the log")
but.clicked.connect(log_stuff)
frame = QtGui.QFrame()
layout = QtGui.QVBoxLayout(frame)
layout.addWidget(but)
layout.addWidget(obj)
mw.setCentralWidget(frame)
mw.show()
app.exec_()
if __name__ == "__main__":
import gettext
gettext.install("")
_test()