From 2d04c8361b1791fd8266145e8a2540f17a32e81b Mon Sep 17 00:00:00 2001 From: Simon Schampijer Date: Sat, 07 Jul 2007 08:57:35 +0000 Subject: Added the BuddyPlayer class to be able to draw a highlighted background for the current active player. --- diff --git a/buddiespanel.py b/buddiespanel.py index 50c85d6..b7d8216 100644 --- a/buddiespanel.py +++ b/buddiespanel.py @@ -1,11 +1,72 @@ import gtk import hippo +import math + from sugar.graphics.canvasicon import CanvasIcon from sugar.graphics.xocolor import XoColor from sugar.graphics import color from sugar.graphics import font +from sugar.graphics import units + + +class BuddyPlayer(hippo.CanvasBox, hippo.CanvasItem): + __gtype_name__ = 'BuddyPlayer' + _BORDER_DEFAULT = units.points_to_pixels(1.0) + + def __init__(self, buddy, **kargs): + hippo.CanvasBox.__init__(self, **kargs) + + self._radius = units.points_to_pixels(5) + self.props.border_color = 0 + self.props.background_color = 0 + self.props.orientation = hippo.ORIENTATION_VERTICAL + self.props.border = self._BORDER_DEFAULT + self.props.border_left = self._radius + self.props.border_right = self._radius + + buddy_color = buddy.props.color + if not buddy_color: + buddy_color = "#000000,#ffffff" + + self.icon = CanvasIcon( + icon_name='theme:stock-buddy', + xo_color=XoColor(buddy_color)) + + nick = buddy.props.nick + if not nick: + nick = "" + self.name = hippo.CanvasText(text=nick, color=color.WHITE.get_int()) + + self.append(self.icon) + self.append(self.name) + + + def do_paint_background(self, cr, damaged_box): + [width, height] = self.get_allocation() + + x = self._BORDER_DEFAULT / 2 + y = self._BORDER_DEFAULT / 2 + width -= self._BORDER_DEFAULT + height -= self._BORDER_DEFAULT + + cr.move_to(x + self._radius, y); + cr.arc(x + width - self._radius, y + self._radius, + self._radius, math.pi * 1.5, math.pi * 2); + cr.arc(x + width - self._radius, x + height - self._radius, + self._radius, 0, math.pi * 0.5); + cr.arc(x + self._radius, y + height - self._radius, + self._radius, math.pi * 0.5, math.pi); + cr.arc(x + self._radius, y + self._radius, self._radius, + math.pi, math.pi * 1.5); + + hippo.cairo_set_source_rgba32(cr, self.props.background_color) + cr.fill() + class BuddiesPanel(hippo.CanvasBox): + _COLOR_ACTIVE = 50 + _COLOR_INACTIVE = 0 + def __init__(self): hippo.CanvasBox.__init__(self, spacing=4, padding=5, orientation=hippo.ORIENTATION_VERTICAL) @@ -22,7 +83,8 @@ class BuddiesPanel(hippo.CanvasBox): self.players = {} self.watchers = {} - + self.last_active = None + def _create_buddy_vbox (self, buddy): buddy_color = buddy.props.color if not buddy_color: @@ -38,6 +100,14 @@ class BuddiesPanel(hippo.CanvasBox): name = hippo.CanvasText(text=nick, color=color.WHITE.get_int()) vbox = hippo.CanvasBox(padding=5) + vbox._radius = units.points_to_pixels(5) + vbox.props.border_color = 100 + vbox.props.background_color = 200 + vbox.props.orientation = hippo.ORIENTATION_VERTICAL + vbox.props.border = units.points_to_pixels(1.0) + vbox.props.border_left = vbox._radius + vbox.props.border_right = vbox._radius + vbox.append(icon) vbox.append(name) @@ -70,9 +140,7 @@ class BuddiesPanel(hippo.CanvasBox): hbox = hippo.CanvasBox(spacing=4, padding=5, orientation=hippo.ORIENTATION_HORIZONTAL) - - vbox = self._create_buddy_vbox(buddy) - hbox.append(vbox) + hbox.append(BuddyPlayer(buddy)) count_font = font.DEFAULT_BOLD.get_pango_desc() count_font.set_size(30000) @@ -83,17 +151,19 @@ class BuddiesPanel(hippo.CanvasBox): 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 = font.DEFAULT_BOLD.get_pango_desc() - else: - name.props.font_desc = font.DEFAULT.get_pango_desc() - + hbox = self.players.get(buddy.object_path()) + bp = hbox.get_children()[0] + bp.props.background_color = self._COLOR_ACTIVE + bp.emit_paint_needed(0, 0, -1, -1) + if self.last_active is not None: + hbox = self.players.get(self.last_active.object_path()) + lbp = hbox.get_children()[0] + lbp.props.background_color = self._COLOR_INACTIVE + lbp.emit_paint_needed(0, 0, -1, -1) + self.last_active = buddy + def set_count(self, buddy, val): hbox = self.players.get(buddy.object_path()) if hbox is None: diff --git a/controller.py b/controller.py index ec588fc..0ae704f 100644 --- a/controller.py +++ b/controller.py @@ -65,7 +65,8 @@ class Controller(ExportedGObject): if self.numplayers < MAX_NUM_PLAYERS: self.buddies_panel.add_player(buddy) self.numplayers+=1 - if self.is_initiator: + if self.is_initiator: + self.buddies_panel.set_is_playing(buddy) self.model.players[self.tube.participants[handle]] = [buddy.props.nick, 0] _logger.debug('list of players: %s', self.model.players) else: @@ -182,7 +183,10 @@ class Controller(ExportedGObject): if self.playerid == playerid: self.turn = 1 else: - self.turn = 0 + self.turn = 0 + + buddy = self._get_buddy(self.tube.bus_name_to_handle[playerid]) + self.buddies_panel.set_is_playing(buddy) self.info_panel.show('hey %s it is your turn'%name) @signal(dbus_interface=IFACE, signature='sn') diff --git a/memosonoactivity.py b/memosonoactivity.py index 47b60a8..ce1890a 100755 --- a/memosonoactivity.py +++ b/memosonoactivity.py @@ -110,9 +110,7 @@ class MemosonoActivity(Activity): else: # we are creating the activity self.buddies_panel.add_player(owner) - #self.buddies_panel.set_is_playing(owner) - #self.buddies_panel.set_count(owner, 69) - + def _get_buddy(self, cs_handle): """Get a Buddy from a channel specific handle.""" _logger.debug('Trying to find owner of handle %u...', cs_handle) -- cgit v0.9.1