home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- import wx
- from wx.combo import ComboCtrl, ComboPopup
- from gui.textutil import default_font, CopyFont
- from util import do, Storage
- from gui.buddylist.renderers import get_buddy_icon
- from gui.skin.skinobjects import SkinColor
- from gui import skin
- from logging import getLogger
- log = getLogger('roomlist')
-
- class TextControl(wx.TextCtrl):
-
- def __init__(self, parent, value = None, empty_text = None):
- wx.TextCtrl.__init__(self, parent)
- self.EmptyText = empty_text
- if not value:
- pass
- self.Value = ''
- self.defaultcolor = self.GetForegroundColour()
- self.emptycolor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)
- self.BBind(KILL_FOCUS = self.OnLoseFocus, SET_FOCUS = self.OnSetFocus)
-
-
- def OnLoseFocus(self, e):
- e.Skip()
- if self.EmptyText and self.Value == '':
- self.SetForegroundColour(self.emptycolor)
- self.Value = self.EmptyText
-
-
-
- def OnSetFocus(self, e):
- e.Skip()
- if self.EmptyText and self.ForegroundColour == self.emptycolor:
- self.SetForegroundColour(self.defaultcolor)
- self.Value = ''
-
-
-
-
- class SkinVListBox(wx.VListBox):
-
- def __init__(self, *a, **k):
- wx.VListBox.__init__(self, *a, **k)
- syscol = wx.SystemSettings.GetColour
- self.colors = Storage(textfg = Storage(selected = syscol(wx.SYS_COLOUR_HIGHLIGHTTEXT), normal = syscol(wx.SYS_COLOUR_WINDOWTEXT)))
- self.bg = Storage(selected = SkinColor(syscol(wx.SYS_COLOUR_HIGHLIGHT)), normal = SkinColor(syscol(wx.SYS_COLOUR_LISTBOX)))
- self.fonts = Storage(text = default_font())
- self.BBind(LEFT_DOWN = self._OnLeftDown)
-
-
- def GetSelections(self):
- (item, cookie) = self.GetFirstSelected()
- yield item
- while item != -1:
- (item, cookie) = self.GetNextSelected(cookie)
- yield item
-
-
- def IsSelected(self, n):
- if self.HasMultipleSelection():
- return n in self.GetSelections()
- else:
- return self.Selection == n
-
-
- def OnDrawItem(self, dc, rect, n):
- selected = self.IsSelected(n)
- textfg = None(getattr, self.colors.textfg if selected else 'normal')
- dc.SetTextForeground(textfg)
- dc.SetFont(self.fonts.text)
- self._draw(dc, rect, n, selected)
-
-
- def OnDrawBackground(self, dc, rect, n):
- selected = self.IsSelected(n)
- bg = None(getattr, self.bg if selected else 'normal')
- bg.draw(dc, rect, n)
-
- try:
- self._drawbg(dc, rect, n, selected)
- except AttributeError:
- pass
-
-
-
- def OnMeasureItem(self, n):
-
- try:
- measure = self._measure
- except AttributeError:
- return 20
-
- return measure(n)
-
-
- def _OnLeftDown(self, e):
- e.Skip()
- i = self.HitTest((e.GetX(), e.GetY()))
- if i == -1:
- self.SetSelection(-1)
-
-
-
-
- class ContactListCtrl(SkinVListBox):
-
- def __init__(self, parent):
- SkinVListBox.__init__(self, parent, style = wx.LB_MULTIPLE)
-
-
- def SetContacts(self, contacts):
- self.contacts = contacts
- self.pending_contacts = []
-
- update = lambda *a: self.update_count()
- self.contacts.add_observer(update)
- (None,)((self.Bind, wx.EVT_WINDOW_DESTROY), (lambda e: self.contacts.remove_observer(update)))
- self.update_count()
-
-
- def update_count(self, keep_pending = False):
- if not keep_pending:
- del self.pending_contacts[:]
-
- self.SetItemCount(len(self.contacts) + len(self.pending_contacts))
- self.RefreshAll()
-
- Contacts = property(None, SetContacts)
-
- def AddPendingContact(self, contact):
- self.pending_contacts += [
- contact]
- self.update_count(keep_pending = True)
-
-
- def _draw(self, dc, rect, n, selected):
- (iconsize, padding) = (16, 3)
-
- try:
- contact = self.contacts[n]
- icon = get_buddy_icon(contact, iconsize, False)
- except IndexError:
- contact = self.pending_contacts[n - len(self.contacts)]
- icon = skin.get('miscicons.smallspinner')
-
- alias = contact.alias
- name = contact.name
- contact_str = None if alias == name else u'%s (%s)' % (alias, name)
- rect.Subtract(left = padding)
- dc.DrawBitmap(icon, rect.X, rect.Y + (rect.Height / 2 - icon.Size.height / 2))
- rect.Subtract(left = iconsize + padding)
- dc.DrawTruncatedText(contact_str, rect, wx.ALIGN_CENTER_VERTICAL)
-
-
- def _measure(self, n):
- return 22
-
-
- def OnGetItemImage(self, item):
- return item
-
-
- from gui.uberwidgets.UberCombo import UberCombo
- from gui.uberwidgets.simplemenu import SimpleMenuItem
-
- def item_for_contact(contact):
- alias = contact.alias
- name = contact.name
- icon = skin.get('statusicons.' + contact.status_orb)
- if alias == name:
- smi = SimpleMenuItem([
- icon,
- name])
- else:
- smi = SimpleMenuItem([
- icon,
- '%s (%s)' % (alias, name)])
- smi.buddy = contact
- return smi
-
-
- class ContactCombo(UberCombo):
-
- def __init__(self, parent, skinkey = 'ComboBox', contacts = None, inviteCallback = None, listctrl = None):
- UberCombo.__init__(self, parent, typeable = True, skinkey = skinkey, editmethod = self.ShowMenu, selectioncallback = self.on_selection, maxmenuheight = 10, empty_text = _('Invite Buddy'))
- self.TextField.Bind(wx.EVT_CHAR, self.on_char)
- self.TextField.Bind(wx.EVT_TEXT, self.on_text)
- self.contacts = None if contacts is not None else { }
- self.inviteCallback = inviteCallback
- self.contact_list = listctrl
- trace = trace
- import util
- SimpleMenu = SimpleMenu
- import gui.uberwidgets.simplemenu
- self.DropDownButton.Bind(wx.EVT_BUTTON, self.ShowMenu)
-
-
- def buddy_sort(self, c):
- return (-int(c.online), c.name)
-
-
- def on_char(self, e):
- k = e.GetKeyCode()
- m = self.menu
- if k == wx.WXK_DOWN:
- m.Selection = (m.Selection + 1) % m.Count
- elif k == wx.WXK_UP:
- if m.Selection == -1:
- m.Selection = m.Count - 1
- else:
- m.Selection = (m.Selection - 1) % m.Count
- elif k == wx.WXK_RETURN:
- if m.IsShown() and m.Selection >= 0:
- item = m.GetItem(m.Selection)
- m.Hide()
- self.on_selection(item)
- else:
- self.on_selection(self.TextField.Value)
- m.Hide()
- self.GrandParent.SetFocus()
- elif k == wx.WXK_ESCAPE:
- self.TextField.Value = ''
- m.Hide()
- else:
- e.Skip()
-
-
- def on_text(self, e):
- val = self.TextField.Value
- e.Skip()
- m = self.menu
- m.RemoveAll()
- items = []
- for contact in sorted(self.contacts.itervalues(), key = self.buddy_sort):
- n = contact.name.lower()
- a = contact.alias.lower()
- v = val.lower()
- if contact not in self.contact_list.contacts:
- if n.startswith(v) or a.startswith(v):
- items.append(item_for_contact(contact))
- continue
-
- for item in items:
- m.AppendItem(item, calcSize = False)
-
- if m.Count:
- m.spine.CalcSize()
- m.Selection = -1
- m.Refresh()
- else:
- m.Selection = -1
- m.Hide()
-
-
- def on_selection(self, item):
- print 'on_selection', item
- if isinstance(item, basestring):
- p = self.Parent
- while not hasattr(p, 'protocol') and p is not None:
- p = p.Parent
- buddy = p.protocol.get_buddy(item)
- else:
- buddy = item.buddy
- if buddy:
- if wx.YES == wx.MessageBox(_('Do you want to invite %s to a chat?') % buddy.name, _('Chat Invite'), wx.YES | wx.NO):
- cb = self.inviteCallback
- if cb is None:
-
- cb = lambda *a, **k: log.warning('inviteCallback(%r, %r)', a, k)
-
- if cb(buddy):
- self.SetValue('')
- self.contact_list.AddPendingContact(buddy)
-
-
-
-
-
- def ShowMenu(self, *e):
- m = self.menu
- m.RemoveAll()
- for contact in sorted(self.contacts.itervalues(), key = self.buddy_sort):
- if contact not in self.contact_list.contacts:
- m.AppendItem(item_for_contact(contact))
- continue
-
- self.OpenMenu()
-
-
-
- class RoomListPanel(wx.Panel):
-
- def __init__(self, parent, buddies = None, inviteCallback = None):
- wx.Panel.__init__(self, parent)
- self._obs_link = None
- self.roomlist = None
- self.list = ContactListCtrl(self)
- self.combo = ContactCombo(self, skinkey = skin.get('RoomListComboSkin'), contacts = buddies, inviteCallback = inviteCallback, listctrl = self.list)
- s = self.Sizer = wx.BoxSizer(wx.VERTICAL)
- s.Add(self.combo, 0, wx.EXPAND | wx.ALL)
- s.Add(self.list, 1, wx.EXPAND | wx.ALL)
- self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
- self.Bind(wx.EVT_ERASE_BACKGROUND, (lambda e: pass))
-
- contact_attrs = ('status', 'alias')
-
- def UpdateSkin(self):
- self.combo.SetSkinKey(skin.get('RoomListComboSkin'))
-
-
- def SetRoomList(self, obslist):
- obs_args = (self.on_list_changed, self.on_contact_changed) + self.contact_attrs
- if self.roomlist is not None:
- if self._obs_link is not None:
- self._obs_link.disconnect()
- self._obs_link = None
-
-
- self.roomlist = obslist
- if self.roomlist is not None:
- self._obs_link = self.roomlist.add_list_observer(*obs_args)
-
- self.list.Contacts = obslist
-
- RoomList = property((lambda self: self.roomlist), SetRoomList, (lambda self: self.SetRoomList(None)), "Sets or gets this panel's roomlist.")
-
- def on_list_changed(self, src, attr, old, new):
- pass
-
-
- def on_contact_changed(self, contact, attr, old, new):
- pass
-
-
- if __name__ == '__main__':
-
- _ = lambda s: s
- from tests.testapp import testapp
- a = testapp('../../../')
- f = wx.Frame(None, -1, 'roomlist')
- from tests.mock.mockbuddy import MockBuddy
- from common import caps
- from util.observe import ObservableList
- AIM = ('aim', [
- caps.BLOCKABLE,
- caps.EMAIL,
- caps.FILES,
- caps.IM,
- caps.PICTURES,
- caps.SMS])
- MSN = ('msn', [
- caps.BLOCKABLE,
- caps.EMAIL,
- caps.FILES,
- caps.IM])
- JBR = ('jabber', [
- caps.EMAIL,
- caps.FILES,
- caps.IM])
- YHO = ('yahoo', [
- caps.BLOCKABLE,
- caps.EMAIL,
- caps.FILES,
- caps.IM,
- caps.SMS])
- contacts = ObservableList([
- MockBuddy('Aaron', 'away', *JBR),
- MockBuddy('Chris', 'available', *JBR),
- MockBuddy('Jeff', 'offline', *AIM),
- MockBuddy('Kevin', 'away', *YHO),
- MockBuddy('Mike', 'available', *MSN),
- MockBuddy('Steve', 'offline', *AIM)])
- buddies = dict((lambda .0: for c in .0:
- (c.name, c))(contacts))
- rl = RoomListPanel(f, buddies)
- rl.RoomList = contacts
- f.SetSize((200, 400))
- f.Show()
- a.MainLoop()
-
-