Rewrite the zoom logic. Regress some stuff... will fix.

This commit is contained in:
Marco Pesenti Gritti 2006-08-29 11:48:20 +02:00
parent f75d36055f
commit a29230c183
6 changed files with 143 additions and 199 deletions

View File

@ -210,10 +210,4 @@ class Shell(gobject.GObject):
self._screen.toggle_showing_desktop(False) self._screen.toggle_showing_desktop(False)
else: else:
self._screen.toggle_showing_desktop(True) self._screen.toggle_showing_desktop(True)
self._home_window.set_zoom_level(level)
if level == sugar.ZOOM_HOME:
self._home_window.set_view(HomeWindow.HOME_VIEW)
elif level == sugar.ZOOM_FRIENDS:
self._home_window.set_view(HomeWindow.FRIENDS_VIEW)
elif level == sugar.ZOOM_MESH:
self._home_window.set_view(HomeWindow.MESH_VIEW)

View File

@ -16,32 +16,24 @@ class FriendIcon(IconItem):
def get_friend(self): def get_friend(self):
return self._friend return self._friend
class Model(goocanvas.CanvasModelSimple): class FriendsGroup(goocanvas.Group):
def __init__(self, data_model): def __init__(self, data_model):
goocanvas.CanvasModelSimple.__init__(self) goocanvas.Group.__init__(self)
self._friend_to_child = {} self._friend_to_child = {}
self._theme = Theme.get_instance() self._theme = Theme.get_instance()
self._theme.connect("theme-changed", self.__theme_changed_cb) self._theme.connect("theme-changed", self.__theme_changed_cb)
self._root = self.get_root_item()
color = self._theme.get_home_mesh_color() color = self._theme.get_home_mesh_color()
self._mesh_rect = goocanvas.Rect(width=1200, height=900, self._mesh_rect = goocanvas.Rect(width=1200, height=900,
fill_color=color) line_width=0, fill_color=color)
self._root.add_child(self._mesh_rect) self.add_child(self._mesh_rect)
color = self._theme.get_home_friends_color() color = self._theme.get_home_friends_color()
self._friends_rect = goocanvas.Rect(x=100, y=100, width=1000, height=700, self._friends_rect = goocanvas.Rect(x=50, y=50, width=1100, height=800,
line_width=0, fill_color=color, line_width=0, fill_color=color,
radius_x=30, radius_y=30) radius_x=30, radius_y=30)
self._root.add_child(self._friends_rect) self.add_child(self._friends_rect)
color = self._theme.get_home_activities_color()
self._home_rect = goocanvas.Rect(x=400, y=300, width=400, height=300,
line_width=0, fill_color=color,
radius_x=30, radius_y=30)
self._root.add_child(self._home_rect)
for friend in data_model: for friend in data_model:
self.add_friend(friend) self.add_friend(friend)
@ -50,8 +42,6 @@ class Model(goocanvas.CanvasModelSimple):
data_model.connect('friend-removed', self.__friend_removed_cb) data_model.connect('friend-removed', self.__friend_removed_cb)
def __theme_changed_cb(self, theme): def __theme_changed_cb(self, theme):
color = self._theme.get_home_activities_color()
self._home_rect.set_property("fill-color", color)
color = self._theme.get_home_friends_color() color = self._theme.get_home_friends_color()
self._friends_rect.set_property("fill-color", color) self._friends_rect.set_property("fill-color", color)
color = self._theme.get_home_mesh_color() color = self._theme.get_home_mesh_color()
@ -59,12 +49,12 @@ class Model(goocanvas.CanvasModelSimple):
def add_friend(self, friend): def add_friend(self, friend):
icon = FriendIcon(friend) icon = FriendIcon(friend)
self._root.add_child(icon) self.add_child(icon)
self._friend_to_child[friend] = icon self._friend_to_child[friend] = icon
def remove_friend(self, friend): def remove_friend(self, friend):
icon = self._friend_to_child[friend] icon = self._friend_to_child[friend]
self._root.remove_child(self._root.find_child(icon)) self.remove_child(self._root.find_child(icon))
del self._friend_to_child[friend] del self._friend_to_child[friend]
def __friend_added_cb(self, data_model, friend): def __friend_added_cb(self, data_model, friend):
@ -72,16 +62,3 @@ class Model(goocanvas.CanvasModelSimple):
def __friend_removed_cb(self, data_model, friend): def __friend_removed_cb(self, data_model, friend):
self.remove_friend(friend) self.remove_friend(friend)
class FriendsView(goocanvas.CanvasView):
def __init__(self, shell, data_model):
goocanvas.CanvasView.__init__(self)
self._shell = shell
self.connect("item_view_created", self.__item_view_created_cb)
canvas_model = Model(data_model)
self.set_model(canvas_model)
def __item_view_created_cb(self, view, item_view, item):
pass

View File

@ -50,65 +50,48 @@ class Background(goocanvas.Group):
color = self._theme.get_home_friends_color() color = self._theme.get_home_friends_color()
self._friends_rect = goocanvas.Rect(width=1200, height=900, self._friends_rect = goocanvas.Rect(width=1200, height=900,
fill_color=color) line_width=0, fill_color=color)
self.add_child(self._friends_rect) self.add_child(self._friends_rect)
color = self._theme.get_home_activities_color() color = self._theme.get_home_activities_color()
self._home_rect = goocanvas.Rect(x=100, y=100, width=1000, height=700, self._home_rect = goocanvas.Rect(x=50, y=50, width=1100, height=800,
line_width=0, fill_color=color, line_width=0, fill_color=color,
radius_x=30, radius_y=30) radius_x=30, radius_y=30)
self.add_child(self._home_rect) self.add_child(self._home_rect)
item = goocanvas.Text(text="My Activities",
x=12, y=12, fill_color="black",
font="Sans 21")
self.add_child(item)
def __theme_changed_cb(self, theme): def __theme_changed_cb(self, theme):
color = self._theme.get_home_activities_color() color = self._theme.get_home_activities_color()
self._home_rect.set_property("fill-color", color) self._home_rect.set_property("fill-color", color)
color = self._theme.get_friends_colors() color = self._theme.get_home_friends_color()
self._friends_rect.set_property("fill-color", color) self._friends_rect.set_property("fill-color", color)
class Model(goocanvas.CanvasModelSimple): class HomeGroup(goocanvas.Group):
def __init__(self, shell): def __init__(self, shell):
goocanvas.CanvasModelSimple.__init__(self) goocanvas.Group.__init__(self)
root = self.get_root_item()
background = Background() background = Background()
root.add_child(background) self.add_child(background)
tasks = TasksItem(shell) tasks = TasksItem(shell)
tasks.translate(600, 450) tasks.translate(600, 450)
root.add_child(tasks) self.add_child(tasks)
profile = sugar.conf.get_profile() profile = sugar.conf.get_profile()
me = IconItem(icon_name = 'stock-buddy', me = IconItem(icon_name = 'stock-buddy',
color = profile.get_color(), size = 150) color = profile.get_color(), size = 150)
me.translate(600 - (me.get_property('width') / 2), me.translate(600 - (me.get_property('width') / 2),
450 - (me.get_property('height') / 2)) 450 - (me.get_property('height') / 2))
root.add_child(me) self.add_child(me)
class HomeView(goocanvas.CanvasView): # def __item_view_created_cb(self, view, item_view, item):
def __init__(self, shell): # if isinstance(item, PieceItem) or \
goocanvas.CanvasView.__init__(self) # isinstance(item, PieceIcon):
self._shell = shell # item_view.connect("button_press_event",
# self.__task_button_press_cb)
self.connect("item_view_created", self.__item_view_created_cb) #
# def __activity_button_press_cb(self, view, target, event, activity_id):
canvas_model = Model(shell) # self._shell.start_activity(activity_id)
self.set_model(canvas_model) #
# def __task_button_press_cb(self, view, target, event):
def __item_view_created_cb(self, view, item_view, item): # activity = view.get_item().get_data('activity')
if isinstance(item, PieceItem) or \ # activity.present()
isinstance(item, PieceIcon):
item_view.connect("button_press_event",
self.__task_button_press_cb)
def __activity_button_press_cb(self, view, target, event, activity_id):
self._shell.start_activity(activity_id)
def __task_button_press_cb(self, view, target, event):
activity = view.get_item().get_data('activity')
activity.present()

View File

@ -1,50 +1,66 @@
import gtk import gtk
import goocanvas
import cairo
from home.MeshView import MeshView from home.MeshGroup import MeshGroup
from home.HomeView import HomeView from home.HomeGroup import HomeGroup
from home.FriendsView import FriendsView from home.FriendsGroup import FriendsGroup
import sugar
class HomeWindow(gtk.Window): class HomeWindow(gtk.Window):
HOME_VIEW = 0 CANVAS_WIDTH = 1200
FRIENDS_VIEW = 1 CANVAS_HEIGHT = 900
MESH_VIEW = 2
def __init__(self, shell): def __init__(self, shell):
gtk.Window.__init__(self) gtk.Window.__init__(self)
self._shell = shell self._shell = shell
self.connect('realize', self.__realize_cb) self.realize()
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP)
self._nb = gtk.Notebook()
self._nb.set_show_tabs(False)
self._nb.set_show_border(False)
self.add(self._nb)
self._nb.show()
def set_model(self, model): def set_model(self, model):
home_view = HomeView(self._shell) self._model = goocanvas.CanvasModelSimple()
self._nb.append_page(home_view) root = self._model.get_root_item()
self._setup_canvas(home_view)
home_view.show()
friends_view = FriendsView(self._shell, model.get_friends()) data_model = model.get_mesh()
self._nb.append_page(friends_view) self._mesh_group = MeshGroup(data_model)
self._setup_canvas(friends_view) root.add_child(self._mesh_group)
friends_view.show()
mesh_view = MeshView(self._shell, model.get_mesh()) data_model = model.get_friends()
self._setup_canvas(mesh_view) self._friends_group = FriendsGroup(data_model)
self._nb.append_page(mesh_view) root.add_child(self._friends_group)
mesh_view.show()
def set_view(self, view): self._home_group = HomeGroup(self._shell)
self._nb.set_current_page(view) root.add_child(self._home_group)
def _setup_canvas(self, canvas): canvas = goocanvas.CanvasView()
canvas.set_bounds(0, 0, 1200, 900) canvas.set_bounds(0, 0, HomeWindow.CANVAS_WIDTH,
canvas.set_scale(float(gtk.gdk.screen_width()) / float(1200)) HomeWindow.CANVAS_HEIGHT)
canvas.set_size_request(gtk.gdk.screen_width(), gtk.gdk.screen_height()) canvas.set_scale(float(gtk.gdk.screen_width()) /
float(HomeWindow.CANVAS_WIDTH))
canvas.set_size_request(gtk.gdk.screen_width(),
gtk.gdk.screen_height())
canvas.set_model(self._model)
def __realize_cb(self, window): self.add(canvas)
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP) canvas.show()
def _set_group_scale(self, group, d):
x = HomeWindow.CANVAS_WIDTH * (1 - d) / 2
y = HomeWindow.CANVAS_HEIGHT * (1 - d) / 2
matrix = cairo.Matrix(1, 0, 0, 1, 0, 0)
matrix.translate(x, y)
matrix.scale(d, d)
group.set_transform(matrix)
def set_zoom_level(self, level):
if level == sugar.ZOOM_HOME:
self._set_group_scale(self._home_group, 1.0)
elif level == sugar.ZOOM_FRIENDS:
self._set_group_scale(self._home_group, 0.5)
self._set_group_scale(self._friends_group, 1.0)
elif level == sugar.ZOOM_MESH:
self._set_group_scale(self._home_group, 0.2)
self._set_group_scale(self._friends_group, 0.4)
self._set_group_scale(self._mesh_group, 1.0)

60
shell/home/MeshGroup.py Normal file
View File

@ -0,0 +1,60 @@
import random
import goocanvas
from sugar.canvas.IconItem import IconItem
from sugar.canvas.IconItem import IconColor
from sugar import conf
import Theme
class ActivityItem(IconItem):
def __init__(self, activity):
registry = conf.get_activity_registry()
info = registry.get_activity(activity.get_type())
icon_name = info.get_icon()
IconItem.__init__(self, icon_name=icon_name,
color=activity.get_color(), size=48)
self._activity = activity
def get_service(self):
return self._activity.get_service()
class MeshGroup(goocanvas.Group):
def __init__(self, data_model):
goocanvas.Group.__init__(self)
self._theme = Theme.get_instance()
self._theme.connect("theme-changed", self.__theme_changed_cb)
color = self._theme.get_home_mesh_color()
self._mesh_rect = goocanvas.Rect(width=1200, height=900,
fill_color=color)
self.add_child(self._mesh_rect)
for activity in data_model:
self.add_activity(activity)
data_model.connect('activity-added', self.__activity_added_cb)
def __theme_changed_cb(self, theme):
pass
def add_activity(self, activity):
item = ActivityItem(activity)
item.set_property('x', random.random() * 1100)
item.set_property('y', random.random() * 800)
self.add_child(item)
def __activity_added_cb(self, data_model, activity):
self.add_activity(activity)
# def __activity_button_press_cb(self, view, target, event, service):
# self._shell.join_activity(service)
#
# def __item_view_created_cb(self, view, item_view, item):
# if isinstance(item, ActivityItem):
# item_view.connect("button_press_event",
# self.__activity_button_press_cb,
# item.get_service())

View File

@ -1,86 +0,0 @@
import random
import goocanvas
from sugar.canvas.IconItem import IconItem
from sugar.canvas.IconItem import IconColor
from sugar import conf
import Theme
class ActivityItem(IconItem):
def __init__(self, activity):
registry = conf.get_activity_registry()
info = registry.get_activity(activity.get_type())
icon_name = info.get_icon()
IconItem.__init__(self, icon_name=icon_name,
color=activity.get_color(), size=48)
self._activity = activity
def get_service(self):
return self._activity.get_service()
class Model(goocanvas.CanvasModelSimple):
def __init__(self, data_model):
goocanvas.CanvasModelSimple.__init__(self)
self._theme = Theme.get_instance()
self._theme.connect("theme-changed", self.__theme_changed_cb)
root = self.get_root_item()
color = self._theme.get_home_mesh_color()
self._mesh_rect = goocanvas.Rect(width=1200, height=900,
fill_color=color)
root.add_child(self._mesh_rect)
color = self._theme.get_home_friends_color()
self._friends_rect = goocanvas.Rect(x=350, y=280, width=500, height=340,
line_width=0, fill_color=color,
radius_x=30, radius_y=30)
root.add_child(self._friends_rect)
color = self._theme.get_home_activities_color()
self._home_rect = goocanvas.Rect(x=480, y=360, width=240, height=180,
line_width=0, fill_color=color,
radius_x=30, radius_y=30)
root.add_child(self._home_rect)
for activity in data_model:
self.add_activity(activity)
data_model.connect('activity-added', self.__activity_added_cb)
def __theme_changed_cb(self, theme):
pass
def add_activity(self, activity):
root = self.get_root_item()
item = ActivityItem(activity)
item.set_property('x', random.random() * 1100)
item.set_property('y', random.random() * 800)
root.add_child(item)
def __activity_added_cb(self, data_model, activity):
self.add_activity(activity)
class MeshView(goocanvas.CanvasView):
def __init__(self, shell, data_model):
goocanvas.CanvasView.__init__(self)
self._shell = shell
self.connect("item_view_created", self.__item_view_created_cb)
canvas_model = Model(data_model)
self.set_model(canvas_model)
def __activity_button_press_cb(self, view, target, event, service):
self._shell.join_activity(service)
def __item_view_created_cb(self, view, item_view, item):
if isinstance(item, ActivityItem):
item_view.connect("button_press_event",
self.__activity_button_press_cb,
item.get_service())