X-Git-Url: https://jfr.im/git/irc/weechat/qweechat.git/blobdiff_plain/7dcf23b19547e37dbadd98aaed99ce4656471dbe..e836cfb0f6b5e09e4d050d3c2e795d1577c5ea62:/src/qweechat/chat.py diff --git a/src/qweechat/chat.py b/src/qweechat/chat.py index 1506a92..4ed7d97 100644 --- a/src/qweechat/chat.py +++ b/src/qweechat/chat.py @@ -1,7 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (C) 2011 Sebastien Helleu +# chat.py - chat area +# +# Copyright (C) 2011-2013 Sebastien Helleu # # This file is part of QWeeChat, a Qt remote GUI for WeeChat. # @@ -19,45 +21,102 @@ # along with QWeeChat. If not, see . # -# -# Chat area. -# - import datetime import qt_compat QtCore = qt_compat.import_module('QtCore') QtGui = qt_compat.import_module('QtGui') +import config +import weechat.color as color class ChatTextEdit(QtGui.QTextEdit): """Chat area.""" - def __init__(self, *args): - apply(QtGui.QTextEdit.__init__, (self,) + args) + def __init__(self, debug, *args): + QtGui.QTextEdit.__init__(*(self,) + args) + self.debug = debug self.readOnly = True self.setFocusPolicy(QtCore.Qt.NoFocus) self.setFontFamily('monospace') + self._textcolor = self.textColor() + self._bgcolor = QtGui.QColor('#FFFFFF') + self._setcolorcode = { 'F': (self.setTextColor, self._textcolor), + 'B': (self.setTextBackgroundColor, self._bgcolor) } + self._setfont = { '*': self.setFontWeight, + '_': self.setFontUnderline, + '/': self.setFontItalic } + self._fontvalues = { False: { '*': QtGui.QFont.Normal, '_': False, '/': False }, + True: { '*': QtGui.QFont.Bold, '_': True, '/': True } } + self._color = color.Color(config.color_options(), self.debug) - def display(self, time, prefix, text, color=None): - oldcolor = self.textColor() + def display(self, time, prefix, text, forcecolor=None): if time == 0: d = datetime.datetime.now() else: d = datetime.datetime.fromtimestamp(float(time)) self.setTextColor(QtGui.QColor('#999999')) self.insertPlainText(d.strftime('%H:%M ')) - self.setTextColor(oldcolor) + prefix = self._color.convert(prefix) + text = self._color.convert(text) + if forcecolor: + if prefix: + prefix = '\x01(F%s)%s' % (forcecolor, prefix) + text = '\x01(F%s)%s' % (forcecolor, text) if prefix: - self.insertPlainText(str(prefix).decode('utf-8') + ' ') - if color: - self.setTextColor(QtGui.QColor(color)) - self.insertPlainText(str(text).decode('utf-8')) - if text[-1:] != '\n': + self._display_with_colors(str(prefix).decode('utf-8') + ' ') + if text: + self._display_with_colors(str(text).decode('utf-8')) + if text[-1:] != '\n': + self.insertPlainText('\n') + else: self.insertPlainText('\n') - if color: - self.setTextColor(oldcolor) self.scroll_bottom() + def _display_with_colors(self, string): + self.setTextColor(self._textcolor) + self.setTextBackgroundColor(self._bgcolor) + self._reset_attributes() + items = string.split('\x01') + for i, item in enumerate(items): + if i > 0 and item.startswith('('): + pos = item.find(')') + if pos >= 2: + action = item[1] + code = item[2:pos] + if action == '+': + # set attribute + self._set_attribute(code[0], True) + elif action == '-': + # remove attribute + self._set_attribute(code[0], False) + else: + # reset attributes and color + if code == 'r': + self._reset_attributes() + self._setcolorcode[action][0](self._setcolorcode[action][1]) + else: + # set attributes + color + while code.startswith(('*', '!', '/', '_', '|', 'r')): + if code[0] == 'r': + self._reset_attributes() + elif code[0] in self._setfont: + self._set_attribute(code[0], not self._font[code[0]]) + code = code[1:] + if code: + self._setcolorcode[action][0](QtGui.QColor(code)) + item = item[pos+1:] + if len(item) > 0: + self.insertPlainText(item) + + def _reset_attributes(self): + self._font = {} + for attr in self._setfont: + self._set_attribute(attr, False) + + def _set_attribute(self, attr, value): + self._font[attr] = value + self._setfont[attr](self._fontvalues[self._font[attr]][attr]) + def scroll_bottom(self): bar = self.verticalScrollBar() bar.setValue(bar.maximum())