From 72a4aa6fe217d3a3d838dd8a7fcb67d17672ae7c Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Wed, 04 Oct 2006 12:23:15 +0000 Subject: Reimplement the donut using hippo canvas --- diff --git a/shell/view/home/HomeBox.py b/shell/view/home/HomeBox.py new file mode 100644 index 0000000..e4409fd --- /dev/null +++ b/shell/view/home/HomeBox.py @@ -0,0 +1,11 @@ +import hippo + +from view.home.activitiesdonut import ActivitiesDonut + +class HomeBox(hippo.CanvasBox): + def __init__(self, shell): + hippo.CanvasBox.__init__(self, background_color=0xe2e2e2ff, + yalign=2) + + donut = ActivitiesDonut(shell, box_width=300, box_height=300) + self.append(donut) diff --git a/shell/view/home/HomeGroup.py b/shell/view/home/HomeGroup.py deleted file mode 100644 index f9402e7..0000000 --- a/shell/view/home/HomeGroup.py +++ /dev/null @@ -1,51 +0,0 @@ -import goocanvas - -from view.home.DonutItem import DonutItem -from view.home.MyIcon import MyIcon - -class TasksItem(DonutItem): - def __init__(self, shell): - DonutItem.__init__(self, 250) - - self._items = {} - - shell.connect('activity_opened', self.__activity_opened_cb) - shell.connect('activity_closed', self.__activity_closed_cb) - - def __activity_opened_cb(self, model, activity): - self._add(activity) - - def __activity_closed_cb(self, model, activity): - self._remove(activity) - - def _remove(self, activity): - item = self._items[activity.get_id()] - self.remove_piece(item) - del self._items[activity.get_id()] - - def _add(self, activity): - icon_name = activity.get_icon_name() - icon_color = activity.get_icon_color() - - item = self.add_piece(100 / 8, icon_name, icon_color) - item.get_icon().connect('clicked', - self.__activity_icon_clicked_cb, - activity) - - self._items[activity.get_id()] = item - - def __activity_icon_clicked_cb(self, item, activity): - activity.present() - -class HomeGroup(goocanvas.Group): - def __init__(self, shell): - goocanvas.Group.__init__(self) - - tasks = TasksItem(shell) - tasks.translate(600, 450) - self.add_child(tasks) - - me = MyIcon(180) - me.translate(600 - (me.get_property('size') / 2), - 450 - (me.get_property('size') / 2)) - self.add_child(me) diff --git a/shell/view/home/HomeWindow.py b/shell/view/home/HomeWindow.py index e58447c..6cd2c40 100644 --- a/shell/view/home/HomeWindow.py +++ b/shell/view/home/HomeWindow.py @@ -1,12 +1,10 @@ import gtk -import goocanvas import hippo import cairo -from sugar.canvas.CanvasView import CanvasView from sugar.graphics.menushell import MenuShell from view.home.MeshBox import MeshBox -from view.home.HomeGroup import HomeGroup +from view.home.HomeBox import HomeBox from view.home.FriendsBox import FriendsBox import sugar @@ -27,7 +25,11 @@ class HomeWindow(gtk.Window): menu_shell = MenuShell() - self._add_page(HomeGroup(shell)) + canvas = hippo.Canvas() + box = HomeBox(shell) + canvas.set_root(box) + self._nb.append_page(canvas) + canvas.show() canvas = hippo.Canvas() box = FriendsBox(shell, menu_shell) @@ -41,20 +43,6 @@ class HomeWindow(gtk.Window): self._nb.append_page(canvas) canvas.show() - def _add_page(self, group): - view = CanvasView() - self._nb.append_page(view) - view.show() - - model = goocanvas.CanvasModelSimple() - root = model.get_root_item() - view.set_model(model) - - bg = goocanvas.Rect(width=1900, height=1200, - line_width=0, fill_color='#e2e2e2') - root.add_child(bg) - root.add_child(group) - def set_zoom_level(self, level): if level == sugar.ZOOM_HOME: self._nb.set_current_page(0) diff --git a/shell/view/home/activitiesdonut.py b/shell/view/home/activitiesdonut.py new file mode 100644 index 0000000..b1aaffa --- /dev/null +++ b/shell/view/home/activitiesdonut.py @@ -0,0 +1,102 @@ +import hippo +import math + +from sugar.graphics.canvasicon import CanvasIcon + +class ActivitiesDonut(hippo.CanvasBox, hippo.CanvasItem): + __gtype_name__ = 'SugarActivitiesDonut' + def __init__(self, shell, **kwargs): + hippo.CanvasBox.__init__(self, **kwargs) + + self._activities = {} + + shell.connect('activity_opened', self.__activity_opened_cb) + shell.connect('activity_closed', self.__activity_closed_cb) + + def __activity_opened_cb(self, model, activity): + self._add_activity(activity) + + def __activity_closed_cb(self, model, activity): + self._remove_activity(activity) + + def _remove_activity(self, activity): + icon = self._activities[activity.get_id()] + self.remove(icon) + del self._activities[activity.get_id()] + + def _add_activity(self, activity): + icon_name = activity.get_icon_name() + icon_color = activity.get_icon_color() + + icon = CanvasIcon(icon_name=icon_name, color=icon_color, size=75) + icon.connect('activated', self.__activity_icon_clicked_cb, activity) + self.append(icon, hippo.PACK_FIXED) + + self._activities[activity.get_id()] = icon + + self.emit_paint_needed(0, 0, -1, -1) + + def __activity_icon_clicked_cb(self, item, activity): + activity.present() + + def _get_angles(self, index): + angle = 2 * math.pi / 8 + return [index * angle, (index + 1) * angle] + + def _get_radius(self): + [width, height] = self.get_allocation() + return min(width, height) / 2 + + def _get_inner_radius(self): + return self._get_radius() * 0.5 + + def do_paint_below_children(self, cr, damaged_box): + [width, height] = self.get_allocation() + + cr.translate(width / 2, height / 2) + + radius = self._get_radius() + + cr.set_source_rgb(0xf1 / 255.0, 0xf1 / 255.0, 0xf1 / 255.0) + cr.arc(0, 0, radius, 0, 2 * math.pi) + cr.fill() + + angle_end = 0 + for i in range(0, len(self._activities)): + [angle_start, angle_end] = self._get_angles(i) + + cr.new_path() + cr.move_to(0, 0) + cr.line_to(radius * math.cos(angle_start), + radius * math.sin(angle_start)) + cr.arc(0, 0, radius, angle_start, angle_end) + cr.line_to(0, 0) + + cr.set_source_rgb(0xe2 / 255.0, 0xe2 / 255.0, 0xe2 / 255.0) + cr.set_line_width(4) + cr.stroke_preserve() + + cr.set_source_rgb(1, 1, 1) + cr.fill() + + cr.set_source_rgb(0xe2 / 255.0, 0xe2 / 255.0, 0xe2 / 255.0) + cr.arc(0, 0, self._get_inner_radius(), 0, 2 * math.pi) + cr.fill() + + def do_allocate(self, width, height): + hippo.CanvasBox.do_allocate(self, width, height) + + radius = (self._get_inner_radius() + self._get_radius()) / 2 + + i = 0 + for icon in self._activities.values(): + [angle_start, angle_end] = self._get_angles(i) + angle = angle_start + (angle_end - angle_start) / 2 + + [icon_width, icon_height] = icon.get_allocation() + + x = int(radius * math.cos(angle)) - icon_width / 2 + y = int(radius * math.sin(angle)) - icon_height / 2 + self.move(icon, x + width / 2, y + height / 2) + + i += 1 -- cgit v0.9.1