gnt-frontend for purple-remote
[python-gnt.git] / example / pidgin / blist.py
blob39764bc4772b12e66360b5aaab5a494c8893b70a
1 #!/usr/bin/env python
3 """Buddylist for any purple client"""
5 import gnt
6 import gobject
8 class Row(gobject.GObject):
9 def __init__(self, node):
10 self.__gobject_init__()
11 self.node = node
12 gobject.type_register(Row)
14 def parent_node(purple, node):
15 if purple.PurpleBlistNodeIsBuddy(node):
16 return purple.PurpleBuddyGetContact(node)
17 if purple.PurpleBlistNodeIsChat(node):
18 return purple.PurpleChatGetGroup(node)
19 if purple.PurpleBlistNodeIsContact(node):
20 return purple.PurpleBuddyGetGroup(purple.PurpleContactGetPriorityBuddy(node))
21 return None
23 def display_name(purple, node):
24 if purple.PurpleBlistNodeIsBuddy(node):
25 return purple.PurpleBuddyGetName(node)
26 if purple.PurpleBlistNodeIsChat(node):
27 return purple.PurpleChatGetName(node)
28 if purple.PurpleBlistNodeIsGroup(node):
29 return purple.PurpleGroupGetName(node)
30 if purple.PurpleBlistNodeIsContact(node):
31 return purple.PurpleBuddyGetName(purple.PurpleContactGetPriorityBuddy(node))
32 return "..."
34 def is_visible(purple, node):
35 if purple.PurpleBlistNodeIsBuddy(node):
36 if not purple.PurpleAccountIsConnected(purple.PurpleBuddyGetAccount(node)):
37 return False
38 return purple.PurplePresenceIsOnline(purple.PurpleBuddyGetPresence(node))
39 if purple.PurpleBlistNodeIsChat(node):
40 return True #purple.PurpleAccountIsConnected(purple.PurpleChatGetAccount(node))
41 if purple.PurpleBlistNodeIsGroup(node):
42 return (purple.PurpleBlistGetGroupOnlineCount(node) > 0)
43 if purple.PurpleBlistNodeIsContact(node):
44 return is_visible(purple, purple.PurpleContactGetPriorityBuddy(node))
45 return False
47 class BuddyList(gnt.Tree):
48 def __init__(self, purple, bus):
49 gnt.Tree.__init__(self)
50 self.purple = purple
51 self.bus = bus
52 bus.add_signal_receiver(self.buddysignedon,
53 dbus_interface = "im.pidgin.purple.PurpleInterface",
54 signal_name = "BuddySignedOn")
55 bus.add_signal_receiver(self.buddysignedoff,
56 dbus_interface = "im.pidgin.purple.PurpleInterface",
57 signal_name = "BuddySignedOff")
58 self.rows = {}
60 node = purple.PurpleBlistGetRoot()
61 while node:
62 self.ensure_row(node)
63 node = purple.PurpleBlistNodeNext(node, False)
65 def ensure_row(self, node):
66 if node not in self.rows:
67 if not is_visible(self.purple, node): return None
68 row = Row(node)
69 self.rows[node] = row
70 parent = parent_node(self.purple, node)
71 prow = None
72 if parent:
73 prow = self.ensure_row(parent)
74 self.add_row_after(row, [str(display_name(self.purple, node))], prow, None)
75 if self.purple.PurpleBlistNodeIsContact(node):
76 self.set_expanded(row, False)
77 return self.rows[node]
79 def update_node(self, node):
80 row = self.ensure_row(node)
82 def buddysignedon(self, buddy):
83 self.update_node(buddy)
85 def remove_node(self, node):
86 if node not in self.rows:
87 return
88 self.remove(self.rows[node])
89 del self.rows[node]
90 parent = parent_node(self.purple, node)
91 if not parent: return
92 if not is_visible(self.purple, parent):
93 self.remove_node(parent)
95 def buddysignedoff(self, buddy):
96 self.remove_node(buddy)
98 gobject.type_register(BuddyList)
99 gnt.register_bindings(BuddyList)