Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/buddiespanel.py
diff options
context:
space:
mode:
Diffstat (limited to 'buddiespanel.py')
-rwxr-xr-xbuddiespanel.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/buddiespanel.py b/buddiespanel.py
new file mode 100755
index 0000000..5787f5c
--- /dev/null
+++ b/buddiespanel.py
@@ -0,0 +1,132 @@
+import gtk
+import hippo
+import logging
+from sugar.graphics.icon import CanvasIcon
+from sugar.graphics.xocolor import XoColor
+from sugar.graphics import style
+
+logger = logging.getLogger('PlayGo.buddiespanel')
+
+class BuddiesPanel(hippo.CanvasBox):
+ def __init__(self):
+ hippo.CanvasBox.__init__(self, spacing=4, padding=5,
+ orientation=hippo.ORIENTATION_VERTICAL)
+
+ self.players_box = hippo.CanvasBox(spacing=4, padding=5,
+ orientation=hippo.ORIENTATION_VERTICAL)
+
+ self.watchers_box = hippo.CanvasBox(spacing=4, padding=5,
+ orientation=hippo.ORIENTATION_VERTICAL)
+
+ self.append(self.players_box)
+ self.append(hippo.CanvasWidget(widget=gtk.HSeparator()))
+ self.append(self.watchers_box, hippo.PACK_EXPAND)
+
+ self.players = {}
+ self.watchers = {}
+
+ def _create_buddy_vbox (self, buddy):
+ buddy_color = buddy.props.color
+ if not buddy_color:
+ buddy_color = "#000000,#ffffff"
+
+ icon = CanvasIcon(
+ icon_name='computer-xo',
+ xo_color=XoColor(buddy_color))
+
+ nick = buddy.props.nick
+ if not nick:
+ nick = ""
+ name = hippo.CanvasText(text=nick, color=style.COLOR_WHITE.get_int())
+
+ vbox = hippo.CanvasBox(padding=5)
+ vbox.append(icon)
+ vbox.append(name)
+
+ return vbox
+
+ def add_watcher(self, buddy):
+ op = buddy.object_path()
+ if self.watchers.get(op) is not None:
+ return
+ # if the watcher is also a player, don't add them
+ if self.players.get(op) is not None:
+ return
+
+ vbox = self._create_buddy_vbox (buddy)
+
+ logger.debug("add watcher %s" % op)
+ self.watchers_box.append(vbox)
+
+ self.watchers[op] = vbox
+
+ def add_player(self, buddy):
+ op = buddy.object_path()
+ if self.players.get(op) is not None:
+ return
+ # if the player is also a watcher, drop them from the watchers
+ widget = self.watchers.pop(op, None)
+ if widget is not None:
+ self.watchers_box.remove(widget)
+
+ logger.debug("add player %s" % op)
+
+ assert len(self.players) < 2
+
+ hbox = hippo.CanvasBox(spacing=4, padding=5,
+ orientation=hippo.ORIENTATION_HORIZONTAL)
+
+ vbox = self._create_buddy_vbox(buddy)
+ hbox.append(vbox)
+
+ count_font = style.FONT_BOLD.get_pango_desc()
+ count_font.set_size(30000)
+ count = hippo.CanvasText(text="0", color=style.COLOR_WHITE.get_int(),
+ font_desc=count_font)
+ hbox.append(count)
+
+ self.players_box.append(hbox)
+
+ self.players[op] = hbox
+
+ def set_is_playing(self, buddy):
+ op = buddy.object_path()
+ for player, hbox in self.players.items():
+ vbox = hbox.get_children()[0]
+ icon, name = vbox.get_children()
+ if player == op:
+ name.props.font_desc = style.FONT_BOLD.get_pango_desc()
+ else:
+ name.props.font_desc = style.FONT_NORMAL.get_pango_desc()
+
+ def set_count(self, buddy, val):
+ hbox = self.players.get(buddy.object_path())
+ if hbox is None:
+ return
+
+ count = hbox.get_children()[1]
+ count.props.text = str(val)
+
+ def remove_watcher(self, buddy):
+ op = buddy.object_path()
+ widget = self.watchers[op]
+ if widget is None:
+ return
+
+ self.watchers_box.remove(widget)
+ del self.watchers[op]
+
+ # removing someone from the game entirely should also remove them
+ # from the players
+ self.remove_player(buddy)
+
+ def remove_player(self, buddy):
+ op = buddy.object_path()
+ widget = self.players.get(op)
+ if widget is None:
+ return
+
+ self.players_box.remove(widget)
+ del self.players[op]
+
+ self.add_watcher(buddy)