diff frontends/src/primitivus/contact_list.py @ 223:86d249b6d9b7

Files reorganisation
author Goffi <goffi@goffi.org>
date Wed, 29 Dec 2010 01:06:29 +0100
parents frontends/primitivus/contact_list.py@3198bfd66daa
children fd9b7834d98a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frontends/src/primitivus/contact_list.py	Wed Dec 29 01:06:29 2010 +0100
@@ -0,0 +1,183 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+"""
+Primitivus: a SAT frontend
+Copyright (C) 2009, 2010  Jérôme Poisson (goffi@goffi.org)
+
+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 urwid
+from quick_frontend.quick_contact_list import QuickContactList
+from tools.jid import JID
+from urwid_satext import sat_widgets
+
+
+class ContactList(urwid.WidgetWrap, QuickContactList):
+    signals = ['click','change']
+
+    def __init__(self, host, CM, on_click=None, on_change=None, user_data=None):
+        self.host = host
+        self.selected = None
+        self.groups={}
+        self.alert_jid=set()
+        
+        #we now build the widget
+        self.frame = urwid.Frame(self.__buildList())
+        self.main_widget = sat_widgets.LabelLine(self.frame, sat_widgets.SurroundedText(_("Contacts")))
+        urwid.WidgetWrap.__init__(self, self.main_widget)
+        if on_click:
+            urwid.connect_signal(self, 'click', on_click, user_data)
+        if on_change:
+            urwid.connect_signal(self, 'change', on_change, user_data)
+        QuickContactList.__init__(self, CM)
+
+    def __contains__(self, jid):
+        for group in self.groups:
+            if jid.short in self.groups[group][1]:
+                return True
+        return False
+
+    def setFocus(self, name):
+        """give focus to the first group or contact with the given name"""
+        idx = 0
+        for widget in self.frame.body.body:
+            if widget.getValue() == name:
+                self.frame.body.set_focus(idx)
+                return
+            idx+=1
+
+    def putAlert(self, jid):
+        """Put an alert on the jid to get attention from user (e.g. for new message)"""
+        self.alert_jid.add(jid.short)
+        self.frame.body = self.__buildList()
+        self.host.redraw()
+
+    def __groupClicked(self, group_wid):
+        group = self.groups[group_wid.getValue()]
+        group[0] = not group[0]
+        self.frame.body = self.__buildList()
+        self.host.redraw()
+        self.setFocus(group_wid.getValue())
+
+    def __contactClicked(self, contact_wid, selected):
+        self.selected = contact_wid.data
+        for widget in self.frame.body.body:
+            if widget.__class__ == sat_widgets.SelectableText:
+                widget.setState(widget.data == self.selected, invisible=True)
+        if self.selected in self.alert_jid:
+            self.alert_jid.remove(self.selected)
+            self.frame.body = self.__buildList()
+            self.host.redraw()
+        self._emit('click')
+
+    def __buildContact(self, content, param_contacts):
+        """Add contact representation in widget list
+        @param content: widget list, e.g. SimpleListWalker
+        @param contacts: list of JID"""
+        contacts = list(param_contacts)
+        contacts.sort()
+        for contact in contacts:
+            jid=JID(contact) 
+            name = self.CM.getAttr(jid,'name')
+            nick = self.CM.getAttr(jid,'nick')
+            display = nick or name or jid.node or jid.short
+            header = '(*) ' if contact in self.alert_jid else ''
+            widget = sat_widgets.SelectableText(('alert' if contact in self.alert_jid else 'default',display),
+                                                    selected = contact==self.selected, header=header)
+            widget.data = contact
+            content.append(widget)
+            urwid.connect_signal(widget, 'change', self.__contactClicked)
+
+    def __buildList(self):
+        """Build the main contact list widget"""
+        content = urwid.SimpleListWalker([])
+        group_keys = self.groups.keys()
+        group_keys.sort()
+        for key in group_keys:
+            unfolded = self.groups[key][0]
+            if key!=None:
+                header = '[-]' if unfolded else '[+]'
+                widget = sat_widgets.ClickableText(key,header=header+' ')
+                content.append(widget)
+                urwid.connect_signal(widget, 'click', self.__groupClicked)
+            if unfolded:
+                self.__buildContact(content, self.groups[key][1])
+        return urwid.ListBox(content)
+
+    def unselectAll(self):
+        """Unselect all contacts"""
+        self.selected = None
+        for widget in self.frame.body.body:
+            if widget.__class__ == sat_widgets.SelectableText:
+                widget.setState(False, invisible=True)
+
+
+    def get_contact(self):
+        """Return contact currently selected"""
+        return self.selected
+            
+    def clear_contacts(self):
+        """clear all the contact list"""
+        self.groups={}
+        self.selected = None
+        self.unselectAll()
+        self.frame.body = self.__buildList()
+        self.host.redraw()
+
+    def replace(self, jid, groups=[None]):
+        """add a contact to the list if doesn't exist, else update it"""
+        assert isinstance(groups, list)
+        assert isinstance(jid, JID)
+        if not groups:
+            groups=[None]
+        for group in groups:
+            if not self.groups.has_key(group):
+                self.groups[group] = [True,set()]  #[unfold,list_of_contacts]
+            self.groups[group][1].add(jid.short)
+        self.frame.body = self.__buildList()
+        self.host.redraw()
+
+
+        """contacts = self.list_wid.getAllValues()
+        if jid.short not in contacts:
+            contacts.append(jid.short)
+            contacts.sort()
+            self.list_wid.changeValues(contacts)
+            self._emit('change')"""
+    
+    def disconnect(self, jid):
+        """mark a contact disconnected"""
+        self.remove(jid.short)
+    
+    def remove(self, param_jid):
+        """remove a contact from the list"""
+        groups_to_remove = []
+        jid = JID(param_jid)
+        for group in self.groups:
+            contacts = self.groups[group][1]
+            if jid.short in contacts:
+                contacts.remove(jid.short)
+                if not len(contacts):
+                    groups_to_remove.append(group)
+        for group in groups_to_remove:
+            del self.groups[group]
+        self.frame.body = self.__buildList()
+        self.host.redraw()
+    
+    def add(self, jid, param_groups=[None]):
+        """add a contact to the list"""
+        self.replace(jid,param_groups)
+