]> jfr.im git - irc/weechat/qweechat.git/blobdiff - src/qweechat/buffer.py
Remove color codes from topic
[irc/weechat/qweechat.git] / src / qweechat / buffer.py
index 2da1d2ad87abc354ca27947a122d85e73fca98b1..82f580644f320c137d136b6b1e865565c1c6a1c2 100644 (file)
@@ -28,32 +28,50 @@ QtCore = qt_compat.import_module('QtCore')
 QtGui = qt_compat.import_module('QtGui')
 from chat import ChatTextEdit
 from input import InputLineEdit
+import weechat.color as color
 
 
-class BufferListWidget(QtGui.QListWidget):
-    """Widget with list of buffers."""
+class GenericListWidget(QtGui.QListWidget):
+    """Generic QListWidget with dynamic size."""
 
     def __init__(self, *args):
-        apply(QtGui.QListWidget.__init__, (self,) + args)
+        QtGui.QListWidget.__init__(*(self,) + args)
+        self.setMaximumWidth(100)
+        self.setTextElideMode(QtCore.Qt.ElideNone)
         self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
-        self.setMinimumWidth(120)
-        self.setMaximumWidth(200)
-        # TODO: do a dynamic size for widget
-        #self.setMinimumWidth(self.sizeHintForColumn(0))
-        #self.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)
-        #self.setResizeMode(QtGui.QListView.Adjust)
         self.setFocusPolicy(QtCore.Qt.NoFocus)
         pal = self.palette()
         pal.setColor(QtGui.QPalette.Highlight, QtGui.QColor('#ddddff'))
         pal.setColor(QtGui.QPalette.HighlightedText, QtGui.QColor('black'))
         self.setPalette(pal)
 
-    # TODO: do a dynamic size for widget
-    def sizeHint(self):
-        s = QtCore.QSize()
-        s.setHeight(super(BufferListWidget,self).sizeHint().height())
-        s.setWidth(self.sizeHintForColumn(0))
-        return s
+    def auto_resize(self):
+        size = self.sizeHintForColumn(0)
+        if size > 0:
+            size += 4
+        self.setMaximumWidth(size)
+
+    def clear(self, *args):
+        """Re-implement clear to set dynamic size after clear."""
+        QtGui.QListWidget.clear(*(self,) + args)
+        self.auto_resize()
+
+    def addItem(self, *args):
+        """Re-implement addItem to set dynamic size after add."""
+        QtGui.QListWidget.addItem(*(self,) + args)
+        self.auto_resize()
+
+    def insertItem(self, *args):
+        """Re-implement insertItem to set dynamic size after insert."""
+        QtGui.QListWidget.insertItem(*(self,) + args)
+        self.auto_resize()
+
+
+class BufferListWidget(GenericListWidget):
+    """Widget with list of buffers."""
+
+    def __init__(self, *args):
+        GenericListWidget.__init__(*(self,) + args)
 
     def switch_prev_buffer(self):
         if self.currentRow() > 0:
@@ -76,31 +94,26 @@ class BufferWidget(QtGui.QWidget):
 
         # title
         self.title = QtGui.QLineEdit()
+        self.title.setFocusPolicy(QtCore.Qt.NoFocus)
 
         # splitter with chat + nicklist
         self.chat_nicklist = QtGui.QSplitter()
         self.chat_nicklist.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
-        self.chat = ChatTextEdit()
+        self.chat = ChatTextEdit(debug=False)
         self.chat_nicklist.addWidget(self.chat)
-        self.nicklist = QtGui.QListWidget()
-        self.nicklist.setMaximumWidth(100)
-        self.nicklist.setFocusPolicy(QtCore.Qt.NoFocus)
+        self.nicklist = GenericListWidget()
         if not display_nicklist:
             self.nicklist.setVisible(False)
         self.chat_nicklist.addWidget(self.nicklist)
 
         # prompt + input
-        hbox_edit = QtGui.QHBoxLayout()
-        hbox_edit.setContentsMargins(0, 0, 0, 0)
-        hbox_edit.setSpacing(0)
-        self.prompt = QtGui.QLabel('FlashCode')
-        self.prompt.setContentsMargins(0, 0, 5, 0)
-        hbox_edit.addWidget(self.prompt)
+        self.hbox_edit = QtGui.QHBoxLayout()
+        self.hbox_edit.setContentsMargins(0, 0, 0, 0)
+        self.hbox_edit.setSpacing(0)
         self.input = InputLineEdit(self.chat)
-        hbox_edit.addWidget(self.input)
+        self.hbox_edit.addWidget(self.input)
         prompt_input = QtGui.QWidget()
-        prompt_input.setLayout(hbox_edit)
-        prompt_input.setContentsMargins(0, 0, 0, 0)
+        prompt_input.setLayout(self.hbox_edit)
 
         # vbox with title + chat/nicklist + prompt/input
         vbox = QtGui.QVBoxLayout()
@@ -118,6 +131,15 @@ class BufferWidget(QtGui.QWidget):
         if not title is None:
             self.title.setText(title)
 
+    def set_prompt(self, prompt):
+        """Set prompt."""
+        if self.hbox_edit.count() > 1:
+            self.hbox_edit.takeAt(0)
+        if not prompt is None:
+            label = QtGui.QLabel(prompt)
+            label.setContentsMargins(0, 0, 5, 0)
+            self.hbox_edit.insertWidget(0, label)
+
 
 class Buffer(QtCore.QObject):
     """A WeeChat buffer."""
@@ -127,15 +149,30 @@ class Buffer(QtCore.QObject):
     def __init__(self, data={}):
         QtCore.QObject.__init__(self)
         self.data = data
+        self.nicklist = []
         self.widget = BufferWidget(display_nicklist=self.data.get('nicklist', 0))
-        if self.data and self.data['title']:
-            self.widget.set_title(self.data['title'])
+        self.update_title()
+        self.update_prompt()
         self.widget.input.textSent.connect(self.input_text_sent)
 
     def pointer(self):
         """Return pointer on buffer."""
         return self.data.get('__path', [''])[0]
 
+    def update_title(self):
+        """Update title."""
+        try:
+            self.widget.set_title(color.remove(self.data['title']))
+        except:
+            self.widget.set_title(None)
+
+    def update_prompt(self):
+        """Update prompt."""
+        try:
+            self.widget.set_prompt(self.data['local_variables']['nick'])
+        except:
+            self.widget.set_prompt(None)
+
     def input_text_sent(self, text):
         """Called when text has to be sent to buffer."""
         if self.data:
@@ -143,4 +180,21 @@ class Buffer(QtCore.QObject):
 
     def add_nick(self, prefix, nick):
         """Add a nick to nicklist."""
-        self.widget.nicklist.addItem('%s%s' % (prefix, nick))
+        prefix_color = { '': '', ' ': '', '+': 'yellow' }
+        self.nicklist.append((prefix, nick))
+        color = prefix_color.get(prefix, 'green')
+        if color:
+            icon = QtGui.QIcon('data/icons/bullet_%s_8x8.png' % color)
+        else:
+            pixmap = QtGui.QPixmap(8, 8)
+            pixmap.fill()
+            icon = QtGui.QIcon(pixmap)
+        item = QtGui.QListWidgetItem(icon, nick)
+        #item.setFont('monospace')
+        self.widget.nicklist.addItem(item)
+        self.widget.nicklist.setVisible(True)
+
+    def remove_all_nicks(self):
+        """Remove all nicks from nicklist."""
+        self.nicklist = []
+        self.widget.nicklist.clear()