]> jfr.im git - irc/weechat/qweechat.git/blobdiff - src/qweechat/chat.py
Move comments with description of python file to top of files
[irc/weechat/qweechat.git] / src / qweechat / chat.py
index 1506a9277d7dbed73e9a3d1c2581d5d478c8544b..4ed7d97e6eb092ec01a73d9835b535afec7de84f 100644 (file)
@@ -1,7 +1,9 @@
 #!/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())