Source code for lib_openmolar.admin.qt4.classes.log_widget

#! /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 sizeHint(self): return QtCore.QSize(500, 150)
[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()