Use CanvasView, rework to the new design, cleanup code a lot

This commit is contained in:
Marco Pesenti Gritti 2006-09-09 01:54:44 +02:00
parent 1eae3082c2
commit 41b528284c
6 changed files with 28 additions and 165 deletions

View File

@ -3,7 +3,6 @@ import random
import goocanvas import goocanvas
from sugar.canvas.IconItem import IconItem from sugar.canvas.IconItem import IconItem
import Theme
class FriendIcon(IconItem): class FriendIcon(IconItem):
def __init__(self, friend): def __init__(self, friend):
@ -15,9 +14,6 @@ class FriendIcon(IconItem):
return self._friend return self._friend
class FriendsGroup(goocanvas.Group): class FriendsGroup(goocanvas.Group):
WIDTH = 1200.0 * 1.9
HEIGHT = 900.0 * 1.9
def __init__(self, shell, friends, icon_layout): def __init__(self, shell, friends, icon_layout):
goocanvas.Group.__init__(self) goocanvas.Group.__init__(self)
@ -25,25 +21,11 @@ class FriendsGroup(goocanvas.Group):
self._icon_layout = icon_layout self._icon_layout = icon_layout
self._friends = friends self._friends = friends
self._theme = Theme.get_instance()
self._theme.connect("theme-changed", self.__theme_changed_cb)
color = self._theme.get_home_friends_color()
self._friends_rect = goocanvas.Rect(width=FriendsGroup.WIDTH,
height=FriendsGroup.HEIGHT,
line_width=0, fill_color=color,
radius_x=60, radius_y=60)
self.add_child(self._friends_rect)
for friend in self._friends: for friend in self._friends:
self.add_friend(friend) self.add_friend(friend)
friends.connect('friend-added', self.__friend_added_cb) friends.connect('friend-added', self.__friend_added_cb)
def __theme_changed_cb(self, theme):
color = self._theme.get_home_friends_color()
self._friends_rect.set_property("fill-color", color)
def __friend_clicked_cb(self, icon): def __friend_clicked_cb(self, icon):
activity = self._shell.get_current_activity() activity = self._shell.get_current_activity()
buddy = icon.get_friend().get_buddy() buddy = icon.get_friend().get_buddy()

View File

@ -6,7 +6,6 @@ import conf
from sugar.canvas.IconItem import IconItem from sugar.canvas.IconItem import IconItem
from sugar.canvas.IconColor import IconColor from sugar.canvas.IconColor import IconColor
from home.DonutItem import DonutItem from home.DonutItem import DonutItem
import Theme
class TasksItem(DonutItem): class TasksItem(DonutItem):
def __init__(self, shell): def __init__(self, shell):
@ -44,22 +43,9 @@ class TasksItem(DonutItem):
activity.present() activity.present()
class HomeGroup(goocanvas.Group): class HomeGroup(goocanvas.Group):
WIDTH = 1200.0
HEIGHT = 900.0
def __init__(self, shell): def __init__(self, shell):
goocanvas.Group.__init__(self) goocanvas.Group.__init__(self)
self._theme = Theme.get_instance()
self._theme.connect("theme-changed", self.__theme_changed_cb)
color = self._theme.get_home_activities_color()
self._home_rect = goocanvas.Rect(width=HomeGroup.WIDTH,
height=HomeGroup.HEIGHT,
line_width=0, fill_color=color,
radius_x=30, radius_y=30)
self.add_child(self._home_rect)
tasks = TasksItem(shell) tasks = TasksItem(shell)
tasks.translate(600, 450) tasks.translate(600, 450)
self.add_child(tasks) self.add_child(tasks)
@ -70,7 +56,3 @@ class HomeGroup(goocanvas.Group):
me.translate(600 - (me.get_property('size') / 2), me.translate(600 - (me.get_property('size') / 2),
450 - (me.get_property('size') / 2)) 450 - (me.get_property('size') / 2))
self.add_child(me) self.add_child(me)
def __theme_changed_cb(self, theme):
color = self._theme.get_home_activities_color()
self._home_rect.set_property("fill-color", color)

View File

@ -2,6 +2,7 @@ import gtk
import goocanvas import goocanvas
import cairo import cairo
from sugar.canvas.CanvasView import CanvasView
from home.MeshGroup import MeshGroup from home.MeshGroup import MeshGroup
from home.HomeGroup import HomeGroup from home.HomeGroup import HomeGroup
from home.FriendsGroup import FriendsGroup from home.FriendsGroup import FriendsGroup
@ -12,65 +13,43 @@ class HomeWindow(gtk.Window):
def __init__(self, shell): def __init__(self, shell):
gtk.Window.__init__(self) gtk.Window.__init__(self)
self._shell = shell self._shell = shell
self._width = MeshGroup.WIDTH
self._height = MeshGroup.HEIGHT
self._view = goocanvas.CanvasView()
self._view.set_size_request(gtk.gdk.screen_width(),
gtk.gdk.screen_height())
self.set_zoom_level(sugar.ZOOM_HOME)
model = goocanvas.CanvasModelSimple()
self._view.set_model(model)
self.add(self._view)
self._view.show()
self.realize() self.realize()
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP) self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP)
def set_owner(self, owner): view = CanvasView()
root = self._view.get_model().get_root_item() self.add(view)
view.show()
friends_x = (self._width - FriendsGroup.WIDTH) / 2 model = goocanvas.CanvasModelSimple()
friends_y = (self._height - FriendsGroup.HEIGHT) / 2 self._root = model.get_root_item()
view.set_model(model)
home_x = (self._width - HomeGroup.WIDTH) / 2 bg = goocanvas.Rect(width=1900, height=1200,
home_y = (self._height - HomeGroup.HEIGHT) / 2 line_width=0, fill_color='#e2e2e2')
self._root.add_child(bg)
layout = IconLayout(MeshGroup.WIDTH, MeshGroup.HEIGHT)
layout.set_internal_bounds(friends_x, friends_y,
friends_x + FriendsGroup.WIDTH,
friends_y + FriendsGroup.HEIGHT)
self._mesh_group = MeshGroup(self._shell, layout)
root.add_child(self._mesh_group)
layout = IconLayout(FriendsGroup.WIDTH, FriendsGroup.HEIGHT)
layout.set_internal_bounds(home_x - friends_x, home_y - friends_y,
home_x - friends_x + HomeGroup.WIDTH,
home_y - friends_y + HomeGroup.HEIGHT)
friends = owner.get_friends()
self._friends_group = FriendsGroup(self._shell, friends, layout)
self._friends_group.translate(friends_x, friends_y)
root.add_child(self._friends_group)
self._home_group = HomeGroup(self._shell) self._home_group = HomeGroup(self._shell)
self._home_group.translate(home_x, home_y) self._root.add_child(self._home_group)
root.add_child(self._home_group) self._current_group = self._home_group
def set_owner(self, owner):
layout = IconLayout(1900, 1200)
friends = owner.get_friends()
self._friends_group = FriendsGroup(self._shell, friends, layout)
layout = IconLayout(1900, 1200)
self._mesh_group = MeshGroup(self._shell, layout)
def _set_group(self, group):
self._root.remove_child(self._current_group)
self._root.add_child(group)
self._current_group = group
def set_zoom_level(self, level): def set_zoom_level(self, level):
if level == sugar.ZOOM_HOME: if level == sugar.ZOOM_HOME:
width = HomeGroup.WIDTH * 1.1 self._set_group(self._home_group)
height = HomeGroup.HEIGHT * 1.1
elif level == sugar.ZOOM_FRIENDS: elif level == sugar.ZOOM_FRIENDS:
width = FriendsGroup.WIDTH * 1.1 self._set_group(self._friends_group)
height = FriendsGroup.HEIGHT * 1.1
elif level == sugar.ZOOM_MESH: elif level == sugar.ZOOM_MESH:
width = MeshGroup.WIDTH self._set_group(self._mesh_group)
height = MeshGroup.HEIGHT
self._view.set_bounds((self._width - width) / 2,
(self._height - height) / 2,
width, height)
self._view.set_scale(gtk.gdk.screen_width() / width)

View File

@ -6,12 +6,6 @@ class IconLayout:
self._width = width self._width = width
self._height = height self._height = height
def set_internal_bounds(self, x1, y1, x2, y2):
self._x1 = x1
self._y1 = y1
self._x2 = x2
self._y2 = y2
def add_icon(self, icon): def add_icon(self, icon):
self._icons.append(icon) self._icons.append(icon)
self._layout_icon(icon) self._layout_icon(icon)
@ -27,10 +21,6 @@ class IconLayout:
border < y < self._height - icon_size - border): border < y < self._height - icon_size - border):
return False return False
if self._x1 - icon_size - border < x < self._x2 + border and \
self._y1 - icon_size - border < y < self._y2 + border:
return False
return True return True
def _layout_icon(self, icon): def _layout_icon(self, icon):

View File

@ -7,8 +7,6 @@ from sugar.canvas.IconItem import IconItem
from sugar.canvas.IconItem import IconColor from sugar.canvas.IconItem import IconColor
from sugar.presence import PresenceService from sugar.presence import PresenceService
import Theme
class ActivityItem(IconItem): class ActivityItem(IconItem):
def __init__(self, service): def __init__(self, service):
self._service = service self._service = service
@ -34,23 +32,12 @@ class ActivityItem(IconItem):
return self._service return self._service
class MeshGroup(goocanvas.Group): class MeshGroup(goocanvas.Group):
WIDTH = 1200.0 * 3.5
HEIGHT = 900.0 * 3.5
def __init__(self, shell, icon_layout): def __init__(self, shell, icon_layout):
goocanvas.Group.__init__(self) goocanvas.Group.__init__(self)
self._shell = shell self._shell = shell
self._icon_layout = icon_layout self._icon_layout = icon_layout
self._activities = {} self._activities = {}
self._theme = Theme.get_instance()
color = self._theme.get_home_mesh_color()
self._mesh_rect = goocanvas.Rect(width=MeshGroup.WIDTH,
height=MeshGroup.HEIGHT,
fill_color=color)
self.add_child(self._mesh_rect)
pservice = PresenceService.get_instance() pservice = PresenceService.get_instance()
pservice.connect("service-appeared", self.__service_appeared_cb) pservice.connect("service-appeared", self.__service_appeared_cb)

View File

@ -1,57 +0,0 @@
import gobject
class Theme(gobject.GObject):
__gsignals__ = {
'theme-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
([]))
}
# from OLPC_PLAN_14.swf
__colors = {
'blue': ("#c7d2fb", "#bbc8fa", "#afbffa"),
'turquoise': ("#c8dce8", "#bdd4e3", "#b1cdde"),
'green': ("#ccebac", "#c1e79a", "#b6e388"),
'tan': ("#e8ead1", "#e4e5c8", "#dfe1be"),
'gray': ("#dbe1dd", "#d3dbd5", "#ccd5ce"),
'dark-gray': ("#dad1d4", "#d2c7cb", "#cabdc2")
}
def __init__(self):
gobject.GObject.__init__(self)
self._cur_theme = 'blue'
def set(self, theme):
updated = False
if type(theme) == type(""):
theme = theme.lower()
if self.__colors.has_key(theme):
self._cur_theme = theme
updated = True
elif type(theme) == type(1):
try:
theme = self.__colors.keys()[theme]
self._cur_theme = theme
updated = True
except IndexError:
pass
if updated:
self.emit('theme-changed')
def get_home_activities_color(self):
return self.__colors[self._cur_theme][0]
def get_home_friends_color(self):
return self.__colors[self._cur_theme][1]
def get_home_mesh_color(self):
return self.__colors[self._cur_theme][2]
# Use this accessor, don't create more than one theme object
_theme = None
def get_instance():
global _theme
if not _theme:
_theme = Theme()
return _theme