Add basic activity and buddy properties to PS tab in devel console.

Make columns sortable and resizable.
This commit is contained in:
Simon McVittie 2007-07-25 11:08:36 -04:00
parent 087f6c957d
commit 088c7612e3

View File

@ -15,6 +15,7 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import logging import logging
from hashlib import sha1
import dbus import dbus
from gtk import VBox, Label, TreeView, Expander, ListStore, CellRendererText,\ from gtk import VBox, Label, TreeView, Expander, ListStore, CellRendererText,\
@ -49,6 +50,7 @@ BUDDY_COL_OWNER = 4
BUDDY_COL_COLOR = 5 BUDDY_COL_COLOR = 5
BUDDY_COL_IP4 = 6 BUDDY_COL_IP4 = 6
BUDDY_COL_CUR_ACT = 7 BUDDY_COL_CUR_ACT = 7
BUDDY_COL_KEY_ID = 8
class ActivityWatcher(object): class ActivityWatcher(object):
@ -71,6 +73,57 @@ class ActivityWatcher(object):
self.iter = self.ps_watcher.add_activity(self) self.iter = self.ps_watcher.add_activity(self)
self.iface.GetId(reply_handler=self._on_get_id_success,
error_handler=self._on_get_id_failure)
self.iface.GetColor(reply_handler=self._on_get_color_success,
error_handler=self._on_get_color_failure)
self.iface.GetType(reply_handler=self._on_get_type_success,
error_handler=self._on_get_type_failure)
self.iface.GetName(reply_handler=self._on_get_name_success,
error_handler=self._on_get_name_failure)
def _on_get_id_success(self, ident):
self.id = ident
self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_ID, ident)
def _on_get_id_failure(self, e):
logger.warning('<Activity %s>.GetId(): %s', self.object_path, e)
self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_ID,
'!')
def _on_get_color_success(self, color):
self.color = color
self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_COLOR,
color)
def _on_get_color_failure(self, e):
logger.warning('<Activity %s>.GetColor(): %s', self.object_path, e)
self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_COLOR,
'!')
def _on_get_type_success(self, type_):
self.type = type_
self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_TYPE,
type_)
def _on_get_type_failure(self, e):
logger.warning('<Activity %s>.GetType(): %s', self.object_path, e)
self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_TYPE,
'!')
def _on_get_name_success(self, name):
self.name = name
self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_NAME,
name)
def _on_get_name_failure(self, e):
logger.warning('<Activity %s>.GetName(): %s', self.object_path, e)
self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_NAME,
'!')
def _finish_appearing(self): def _finish_appearing(self):
self.appearing = False self.appearing = False
self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_WEIGHT, self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_WEIGHT,
@ -106,9 +159,53 @@ class BuddyWatcher(object):
self.color = '?' self.color = '?'
self.ipv4 = '?' self.ipv4 = '?'
self.cur_act = '?' self.cur_act = '?'
self.keyid = '?'
self.iter = self.ps_watcher.add_buddy(self) self.iter = self.ps_watcher.add_buddy(self)
self.iface.GetProperties(reply_handler=self._on_get_props_success,
error_handler=self._on_get_props_failure,
byte_arrays=True)
def _on_get_props_success(self, props):
# ignore key for now
self.nick = props.get('nick', '?')
self.owner = props.get('owner', False)
self.color = props.get('color', '?')
self.ipv4 = props.get('ip4-address', '?')
self.ipv4 = props.get('ip4-address', '?')
self.cur_act = props.get('current-activity', '?')
key = props.get('key', None)
if key is not None:
self.keyid = sha1(key).hexdigest()[:8] + '...'
else:
self.keyid = '?'
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_NICK,
self.nick)
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_OWNER,
self.owner)
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_COLOR,
self.color)
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_IP4,
self.ipv4)
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_CUR_ACT,
self.cur_act)
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_KEY_ID,
self.keyid)
def _on_get_props_failure(self, e):
logger.warning('<Buddy %s>.GetProperties(): %s', self.object_path, e)
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_NICK, '!')
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_OWNER,
False)
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_COLOR, '!')
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_IP4, '!')
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_CUR_ACT,
'!')
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_KEY_ID,
'!')
def _finish_appearing(self): def _finish_appearing(self):
self.appearing = False self.appearing = False
self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_WEIGHT, self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_WEIGHT,
@ -168,21 +265,31 @@ class PresenceServiceWatcher(VBox):
self.pack_start(Label('Activities:'), False, False) self.pack_start(Label('Activities:'), False, False)
self.activities_list = TreeView(self.activities_list_store) self.activities_list = TreeView(self.activities_list_store)
self.activities_list.insert_column_with_attributes(0, 'Object path', c = self.activities_list.insert_column_with_attributes(0,
CellRendererText(), text=ACT_COL_PATH, 'Object path', CellRendererText(), text=ACT_COL_PATH,
weight=ACT_COL_WEIGHT, strikethrough=ACT_COL_STRIKE) weight=ACT_COL_WEIGHT, strikethrough=ACT_COL_STRIKE)
self.activities_list.insert_column_with_attributes(1, 'ID', c.set_resizable(True)
c.set_sort_column_id(ACT_COL_PATH)
c = self.activities_list.insert_column_with_attributes(1, 'ID',
CellRendererText(), text=ACT_COL_ID, CellRendererText(), text=ACT_COL_ID,
weight=ACT_COL_WEIGHT, strikethrough=ACT_COL_STRIKE) weight=ACT_COL_WEIGHT, strikethrough=ACT_COL_STRIKE)
self.activities_list.insert_column_with_attributes(2, 'Color', c.set_resizable(True)
c.set_sort_column_id(ACT_COL_ID)
c = self.activities_list.insert_column_with_attributes(2, 'Color',
CellRendererText(), text=ACT_COL_COLOR, CellRendererText(), text=ACT_COL_COLOR,
weight=ACT_COL_WEIGHT, strikethrough=ACT_COL_STRIKE) weight=ACT_COL_WEIGHT, strikethrough=ACT_COL_STRIKE)
self.activities_list.insert_column_with_attributes(3, 'Type', c.set_resizable(True)
c.set_sort_column_id(ACT_COL_COLOR)
c = self.activities_list.insert_column_with_attributes(3, 'Type',
CellRendererText(), text=ACT_COL_TYPE, weight=ACT_COL_WEIGHT, CellRendererText(), text=ACT_COL_TYPE, weight=ACT_COL_WEIGHT,
strikethrough=ACT_COL_STRIKE) strikethrough=ACT_COL_STRIKE)
self.activities_list.insert_column_with_attributes(4, 'Name', c.set_resizable(True)
c.set_sort_column_id(ACT_COL_TYPE)
c = self.activities_list.insert_column_with_attributes(4, 'Name',
CellRendererText(), text=ACT_COL_NAME, weight=ACT_COL_WEIGHT, CellRendererText(), text=ACT_COL_NAME, weight=ACT_COL_WEIGHT,
strikethrough=ACT_COL_STRIKE) strikethrough=ACT_COL_STRIKE)
c.set_resizable(True)
c.set_sort_column_id(ACT_COL_NAME)
scroller = ScrolledWindow() scroller = ScrolledWindow()
scroller.add(self.activities_list) scroller.add(self.activities_list)
@ -190,27 +297,42 @@ class PresenceServiceWatcher(VBox):
# keep this in sync with the BUDDY_COL_ constants # keep this in sync with the BUDDY_COL_ constants
self.buddies_list_store = ListStore(str, int, bool, str, bool, self.buddies_list_store = ListStore(str, int, bool, str, bool,
str, str, str) str, str, str, str)
self.pack_start(Label('Buddies:'), False, False) self.pack_start(Label('Buddies:'), False, False)
self.buddies_list = TreeView(self.buddies_list_store) self.buddies_list = TreeView(self.buddies_list_store)
self.buddies_list.insert_column_with_attributes(0, 'Object path', c = self.buddies_list.insert_column_with_attributes(0, 'Object path',
CellRendererText(), text=BUDDY_COL_PATH, CellRendererText(), text=BUDDY_COL_PATH,
weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE) weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
self.buddies_list.insert_column_with_attributes(1, 'Nick', c.set_resizable(True)
c.set_sort_column_id(BUDDY_COL_PATH)
c = self.buddies_list.insert_column_with_attributes(1, 'Key ID',
CellRendererText(), text=BUDDY_COL_KEY_ID,
weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
c.set_resizable(True)
c.set_sort_column_id(BUDDY_COL_KEY_ID)
c = self.buddies_list.insert_column_with_attributes(2, 'Nick',
CellRendererText(), text=BUDDY_COL_NICK, CellRendererText(), text=BUDDY_COL_NICK,
weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE) weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
self.buddies_list.insert_column_with_attributes(2, 'Owner', c.set_resizable(True)
c.set_sort_column_id(BUDDY_COL_NICK)
c = self.buddies_list.insert_column_with_attributes(3, 'Owner',
CellRendererToggle(), active=BUDDY_COL_OWNER) CellRendererToggle(), active=BUDDY_COL_OWNER)
self.buddies_list.insert_column_with_attributes(3, 'Color', c = self.buddies_list.insert_column_with_attributes(4, 'Color',
CellRendererText(), text=BUDDY_COL_COLOR, CellRendererText(), text=BUDDY_COL_COLOR,
weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE) weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
self.buddies_list.insert_column_with_attributes(4, 'IPv4', c.set_resizable(True)
c.set_sort_column_id(BUDDY_COL_OWNER)
c = self.buddies_list.insert_column_with_attributes(5, 'IPv4',
CellRendererText(), text=BUDDY_COL_IP4, CellRendererText(), text=BUDDY_COL_IP4,
weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE) weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
self.buddies_list.insert_column_with_attributes(5, 'CurAct', c.set_resizable(True)
c.set_sort_column_id(BUDDY_COL_IP4)
c = self.buddies_list.insert_column_with_attributes(6, 'CurAct',
CellRendererText(), text=BUDDY_COL_CUR_ACT, CellRendererText(), text=BUDDY_COL_CUR_ACT,
weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE) weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
c.set_resizable(True)
c.set_sort_column_id(BUDDY_COL_CUR_ACT)
scroller = ScrolledWindow() scroller = ScrolledWindow()
scroller.add(self.buddies_list) scroller.add(self.buddies_list)
@ -280,7 +402,7 @@ class PresenceServiceWatcher(VBox):
if path.startswith('/org/laptop/Sugar/Presence/Buddies/'): if path.startswith('/org/laptop/Sugar/Presence/Buddies/'):
path = '.../' + path[35:] path = '.../' + path[35:]
return self.buddies_list_store.append((path, 700, False, return self.buddies_list_store.append((path, 700, False,
b.nick, b.owner, b.color, b.ipv4, b.cur_act)) b.nick, b.owner, b.color, b.ipv4, b.cur_act, b.keyid))
def remove_buddy(self, b): def remove_buddy(self, b):
self.buddies.pop(b.object_path, None) self.buddies.pop(b.object_path, None)