core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
- QuickContactManagement is not used anymore and will be removed, ContactList + Core are used instead - disconnected contacts are now displayed in Primitivus (M-d to show/hide them) - avatars are temporary unavailable in wix - new bridge method: getContactsFromGroup
This commit is contained in:
parent
97420f39d5
commit
b44412ec0d
1 changed files with 207 additions and 130 deletions
|
|
@ -28,12 +28,13 @@ from sat.tools.jid import JID
|
|||
class ContactList(urwid.WidgetWrap, QuickContactList):
|
||||
signals = ['click','change']
|
||||
|
||||
def __init__(self, host, CM, on_click=None, on_change=None, user_data=None):
|
||||
def __init__(self, host, on_click=None, on_change=None, user_data=None):
|
||||
self.host = host
|
||||
self.selected = None
|
||||
self.groups={}
|
||||
self.alert_jid=set()
|
||||
self.show_status = False
|
||||
self.show_disconnected = False
|
||||
|
||||
#we now build the widget
|
||||
self.frame = urwid.Frame(self.__buildList())
|
||||
|
|
@ -43,9 +44,9 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
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)
|
||||
QuickContactList.__init__(self)
|
||||
|
||||
def _update(self):
|
||||
def update(self):
|
||||
"""Update display, keep focus"""
|
||||
widget, position = self.frame.body.get_focus()
|
||||
self.frame.body = self.__buildList()
|
||||
|
|
@ -53,10 +54,16 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
self.frame.body.set_focus(position)
|
||||
self.host.redraw()
|
||||
|
||||
def update_jid(self, jid):
|
||||
self.update()
|
||||
|
||||
def keypress(self, size, key):
|
||||
if key == "meta s": #user wants to (un)hide contacts' statuses
|
||||
self.show_status = not self.show_status
|
||||
self._update()
|
||||
self.update()
|
||||
elif key == "meta d": #user wants to (un)hide disconnected contacts
|
||||
self.show_disconnected = not self.show_disconnected
|
||||
self.update()
|
||||
return super(ContactList, self).keypress(size, key)
|
||||
|
||||
def __contains__(self, jid):
|
||||
|
|
@ -77,12 +84,12 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
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._update()
|
||||
self.update()
|
||||
|
||||
def __groupClicked(self, group_wid):
|
||||
group = self.groups[group_wid.getValue()]
|
||||
group[0] = not group[0]
|
||||
self._update()
|
||||
self.update()
|
||||
self.setFocus(group_wid.getValue())
|
||||
|
||||
def __contactClicked(self, contact_wid, selected):
|
||||
|
|
@ -92,7 +99,7 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
widget.setState(widget.data == self.selected, invisible=True)
|
||||
if self.selected in self.alert_jid:
|
||||
self.alert_jid.remove(self.selected)
|
||||
self._update()
|
||||
self.update()
|
||||
self._emit('click')
|
||||
|
||||
def __buildContact(self, content, param_contacts):
|
||||
|
|
@ -100,13 +107,20 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
@param content: widget list, e.g. SimpleListWalker
|
||||
@param contacts: list of JID"""
|
||||
contacts = list(param_contacts)
|
||||
contacts.sort()
|
||||
|
||||
widgets = [] #list of built widgets
|
||||
|
||||
for contact in contacts:
|
||||
jid=JID(contact)
|
||||
name = self.CM.getAttr(jid,'name')
|
||||
nick = self.CM.getAttr(jid,'nick')
|
||||
status = self.CM.getAttr(jid, 'status')
|
||||
show = self.CM.getAttr(jid, 'show')
|
||||
name = self.getCache(jid, 'name')
|
||||
nick = self.getCache(jid, 'nick')
|
||||
status = self.getCache(jid, 'status')
|
||||
show = self.getCache(jid, 'show')
|
||||
if show == None:
|
||||
show = "unavailable"
|
||||
if (not self.show_disconnected and show == "unavailable"
|
||||
and not contact in self.alert_jid and contact != self.selected):
|
||||
continue
|
||||
show_icon, show_attr = const_SHOW_ICON.get(show,('','default'))
|
||||
contact_disp = ('alert' if contact in self.alert_jid else show_attr, nick or name or jid.node or jid.short)
|
||||
display = [ show_icon + " " , contact_disp]
|
||||
|
|
@ -118,6 +132,12 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
selected = contact==self.selected,
|
||||
header=header)
|
||||
widget.data = contact
|
||||
widget.comp = contact_disp[1].lower() #value to use for sorting
|
||||
widgets.append(widget)
|
||||
|
||||
widgets.sort(key=lambda widget: widget.comp)
|
||||
|
||||
for widget in widgets:
|
||||
content.append(widget)
|
||||
urwid.connect_signal(widget, 'change', self.__contactClicked)
|
||||
|
||||
|
|
@ -125,7 +145,7 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
"""Build the main contact list widget"""
|
||||
content = urwid.SimpleListWalker([])
|
||||
group_keys = self.groups.keys()
|
||||
group_keys.sort()
|
||||
group_keys.sort(key = lambda x: x.lower() if x else x)
|
||||
for key in group_keys:
|
||||
unfolded = self.groups[key][0]
|
||||
if key!=None:
|
||||
|
|
@ -145,28 +165,30 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
widget.setState(False, invisible=True)
|
||||
|
||||
|
||||
def get_contact(self):
|
||||
def getContact(self):
|
||||
"""Return contact currently selected"""
|
||||
return self.selected
|
||||
|
||||
def clear_contacts(self):
|
||||
def clearContacts(self):
|
||||
"""clear all the contact list"""
|
||||
self.groups={}
|
||||
self.selected = None
|
||||
self.unselectAll()
|
||||
self._update()
|
||||
self.update()
|
||||
|
||||
def replace(self, jid, groups=[None]):
|
||||
def replace(self, jid, groups=None, attributes=None):
|
||||
"""add a contact to the list if doesn't exist, else update it"""
|
||||
if not groups:
|
||||
groups = [None]
|
||||
if not attributes:
|
||||
attributes={}
|
||||
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._update()
|
||||
self.update()
|
||||
|
||||
|
||||
"""contacts = self.list_wid.getAllValues()
|
||||
|
|
@ -176,10 +198,6 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
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 = []
|
||||
|
|
@ -192,7 +210,7 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
|
|||
groups_to_remove.append(group)
|
||||
for group in groups_to_remove:
|
||||
del self.groups[group]
|
||||
self._update()
|
||||
self.update()
|
||||
|
||||
def add(self, jid, param_groups=[None]):
|
||||
"""add a contact to the list"""
|
||||
|
|
|
|||
Loading…
Reference in a new issue