3 """Buddylist for any purple client"""
8 class Row(gobject
.GObject
):
9 def __init__(self
, node
):
10 self
.__gobject
_init
__()
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
))
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
))
34 def is_visible(purple
, node
):
35 if purple
.PurpleBlistNodeIsBuddy(node
):
36 if not purple
.PurpleAccountIsConnected(purple
.PurpleBuddyGetAccount(node
)):
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
))
47 class BuddyList(gnt
.Tree
):
48 def __init__(self
, purple
, bus
):
49 gnt
.Tree
.__init
__(self
)
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")
60 node
= purple
.PurpleBlistGetRoot()
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
70 parent
= parent_node(self
.purple
, node
)
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
:
88 self
.remove(self
.rows
[node
])
90 parent
= parent_node(self
.purple
, node
)
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
)