Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/view/FriendIcon.py
diff options
context:
space:
mode:
Diffstat (limited to 'shell/view/FriendIcon.py')
-rw-r--r--shell/view/FriendIcon.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/shell/view/FriendIcon.py b/shell/view/FriendIcon.py
new file mode 100644
index 0000000..e5158e2
--- /dev/null
+++ b/shell/view/FriendIcon.py
@@ -0,0 +1,104 @@
+from sugar.canvas.IconItem import IconItem
+from sugar.canvas.Grid import Grid
+from view.FriendPopup import FriendPopup
+
+class _PopupShell:
+ def __init__(self):
+ self._popup_controller = None
+
+ def set_active(self, controller):
+ if self._popup_controller:
+ self._popup_controller._popdown()
+ self._popup_controller = controller
+
+class FriendIcon(IconItem):
+ _popup_shell = _PopupShell()
+
+ def __init__(self, shell_model, friend):
+ IconItem.__init__(self, icon_name='stock-buddy',
+ color=friend.get_color(), size=96)
+
+ self._shell_model = shell_model
+ self._friend = friend
+ self._popup = None
+ self._popup_distance = 0
+ self._hover_popup = False
+ self._popdown_on_leave = False
+
+ self.connect('popup', self._popup_cb)
+ self.connect('popdown', self._popdown_cb)
+
+ def set_popup_distance(self, distance):
+ self._popup_distance = distance
+
+ def get_friend(self):
+ return self._friend
+
+ def _popdown(self):
+ if self._popup:
+ self._popup.destroy()
+ self._popup = None
+
+ def _popup_cb(self, icon, x1, y1, x2, y2):
+ self._popdown()
+
+ FriendIcon._popup_shell.set_active(None)
+
+ grid = Grid()
+ self._popup = FriendPopup(grid, icon.get_friend())
+ self._popup.connect('action', self._popup_action_cb)
+ self._popup.connect('enter-notify-event',
+ self._popup_enter_notify_event_cb)
+ self._popup.connect('leave-notify-event',
+ self._popup_leave_notify_event_cb)
+
+ distance = self._popup_distance
+
+ [grid_x1, grid_y1] = grid.convert_from_screen(x1, y1)
+ [grid_x2, grid_y2] = grid.convert_from_screen(x2, y2)
+
+ grid_x = grid_x2 + distance
+ if grid_x + self._popup.get_width() > Grid.ROWS:
+ grid_x = grid_x1 - self._popup.get_width() + 1 - distance
+
+ grid_y = grid_y1
+
+ if grid_y < 0:
+ grid_y = 0
+ if grid_y + self._popup.get_width() > Grid.ROWS:
+ grid_y = Grid.ROWS - self._popup.get_width()
+
+ grid.set_constraints(self._popup, grid_x, grid_y,
+ self._popup.get_width(), self._popup.get_height())
+
+ self._popup.show()
+
+ FriendIcon._popup_shell.set_active(self)
+
+ def _popup_action_cb(self, popup, action):
+ self._popdown()
+
+ buddy = self._friend.get_buddy()
+ if buddy == None:
+ return
+
+ if action == FriendPopup.ACTION_INVITE:
+ activity = self._shell_model.get_current_activity()
+ activity.invite(buddy)
+ elif action == FriendPopup.ACTION_MAKE_FRIEND:
+ friends = self._shell_model.get_friends()
+ friends.add_buddy(buddy)
+
+ def _popdown_cb(self, friend):
+ if not self._hover_popup:
+ self._popdown()
+ else:
+ self._popdown_on_leave = True
+
+ def _popup_enter_notify_event_cb(self, widget, event):
+ self._hover_popup = True
+
+ def _popup_leave_notify_event_cb(self, widget, event):
+ self._hover_popup = False
+ if self._popdown_on_leave:
+ self._popdown()