#!/usr/bin/python
# -*- coding: utf-8 -*-
#
-# Copyright (C) 2011 Sebastien Helleu <flashcode@flashtux.org>
+# chat.py - chat area
+#
+# Copyright (C) 2011-2013 Sebastien Helleu <flashcode@flashtux.org>
#
# This file is part of QWeeChat, a Qt remote GUI for WeeChat.
#
# along with QWeeChat. If not, see <http://www.gnu.org/licenses/>.
#
-#
-# 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())