Rewrite of the grid stuff. Simpler api and cleaner implementation.

Also follow the micro grids in pentagram design.
This commit is contained in:
Marco Pesenti Gritti 2006-09-13 13:50:00 +02:00
parent 5ec92a2cab
commit 857b9cb659
8 changed files with 108 additions and 90 deletions

View File

@ -6,8 +6,7 @@ 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 sugar.presence import PresenceService from sugar.presence import PresenceService
from sugar.canvas.GridLayout import GridGroup from sugar.canvas.CanvasBox import CanvasBox
from sugar.canvas.GridBox import GridBox
class ActivityItem(IconItem): class ActivityItem(IconItem):
def __init__(self, activity): def __init__(self, activity):
@ -33,9 +32,9 @@ class InviteItem(IconItem):
def get_invite(self): def get_invite(self):
return self._invite return self._invite
class BottomPanel(GridBox): class BottomPanel(CanvasBox):
def __init__(self, shell, invites): def __init__(self, grid, shell, invites):
GridBox.__init__(self, GridBox.HORIZONTAL, 14, 6) CanvasBox.__init__(self, grid, CanvasBox.HORIZONTAL, 1)
self._shell = shell self._shell = shell
self._invite_to_item = {} self._invite_to_item = {}
@ -68,11 +67,13 @@ class BottomPanel(GridBox):
def add_activity(self, activity): def add_activity(self, activity):
item = ActivityItem(activity) item = ActivityItem(activity)
item.connect('clicked', self.__activity_clicked_cb) item.connect('clicked', self.__activity_clicked_cb)
self.set_constraints(item, 3, 3)
self.add_child(item) self.add_child(item)
def add_invite(self, invite): def add_invite(self, invite):
item = InviteItem(invite) item = InviteItem(invite)
item.connect('clicked', self.__invite_clicked_cb) item.connect('clicked', self.__invite_clicked_cb)
self.set_constraints(item, 3, 3)
self.add_child(item, 0) self.add_child(item, 0)
self._invite_to_item[invite] = item self._invite_to_item[invite] = item

View File

@ -8,55 +8,43 @@ from frame.TopPanel import TopPanel
from frame.PanelWindow import PanelWindow from frame.PanelWindow import PanelWindow
from sugar.canvas.ScreenContainer import ScreenContainer from sugar.canvas.ScreenContainer import ScreenContainer
from sugar.canvas.GridLayout import GridLayout from sugar.canvas.Grid import Grid
from sugar.canvas.GridLayout import GridConstraints
from sugar.canvas.GridLayout import GridGroup
from sugar.canvas.GridModel import GridModel
class Frame: class Frame:
def __init__(self, shell, owner): def __init__(self, shell, owner):
self._windows = [] self._windows = []
self._model = GridModel("#4f4f4f") model = goocanvas.CanvasModelSimple()
layout = self._model.get_layout() root = model.get_root_item()
self._screen_layout = GridLayout() grid = Grid()
self._screen_container = ScreenContainer(self._windows)
constraints = GridConstraints(0, 0, 16, 1) bg = goocanvas.Rect(fill_color="#4f4f4f")
self._create_window(constraints) grid.set_constraints(bg, 0, 0, 80, 60)
root.add_child(bg)
panel = TopPanel(shell) panel = BottomPanel(grid, shell, owner.get_invites())
layout.set_constraints(panel, constraints) grid.set_constraints(panel, 5, 55)
self._model.add(panel) root.add_child(panel)
constraints = GridConstraints(15, 1, 1, 10) panel_window = PanelWindow(grid, model, 0, 55, 80, 5)
self._create_window(constraints) self._windows.append(panel_window)
panel = RightPanel(shell, owner.get_friends()) panel = TopPanel(grid, shell)
layout.set_constraints(panel, constraints) root.add_child(panel)
self._model.add(panel)
self._create_window(GridConstraints(0, 11, 16, 1)) panel_window = PanelWindow(grid, model, 0, 0, 80, 5)
self._windows.append(panel_window)
panel = RightPanel(grid, shell, owner.get_friends())
grid.set_constraints(panel, 75, 5)
root.add_child(panel)
panel = BottomPanel(shell, owner.get_invites()) panel_window = PanelWindow(grid, model, 75, 5, 5, 50)
layout.set_constraints(panel, GridConstraints(1, 11, 14, 1)) self._windows.append(panel_window)
self._model.add(panel)
# Left panel_window = PanelWindow(grid, model, 0, 5, 5, 50)
constraints = GridConstraints(0, 1, 1, 10) self._windows.append(panel_window)
self._create_window(constraints)
self._screen_container.set_layout(self._screen_layout)
def _create_window(self, constraints):
window = PanelWindow(self._model)
self._screen_layout.set_constraints(window, constraints)
self._windows.append(window)
bounds = self._model.get_layout().get_bounds(self._model._root, constraints)
window.scale_to_screen()
window.set_bounds(constraints)
def __hide_timeout_cb(self): def __hide_timeout_cb(self):
self.hide() self.hide()

View File

@ -1,10 +1,13 @@
import gtk import gtk
import goocanvas
from sugar.canvas.GridWindow import GridWindow from sugar.canvas.CanvasView import CanvasView
class PanelWindow(GridWindow): class PanelWindow(gtk.Window):
def __init__(self, model): def __init__(self, grid, model, x, y, width, height):
GridWindow.__init__(self, model) gtk.Window.__init__(self)
self._grid = grid
self.set_decorated(False) self.set_decorated(False)
@ -14,3 +17,11 @@ class PanelWindow(GridWindow):
screen = gtk.gdk.screen_get_default() screen = gtk.gdk.screen_get_default()
self.window.set_transient_for(screen.get_root_window()) self.window.set_transient_for(screen.get_root_window())
view = CanvasView()
view.show()
self.add(view)
view.set_model(model)
self._grid.set_constraints(self, x, y, width, height)
self._grid.set_constraints(view, x, y, width, height)

View File

@ -1,15 +1,13 @@
import goocanvas import goocanvas
from frame.PanelWindow import PanelWindow
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 sugar.canvas.GridLayout import GridGroup from sugar.canvas.CanvasBox import CanvasBox
from sugar.canvas.GridBox import GridBox
from sugar.presence import PresenceService from sugar.presence import PresenceService
class RightPanel(GridBox): class RightPanel(CanvasBox):
def __init__(self, shell, friends): def __init__(self, grid, shell, friends):
GridBox.__init__(self, GridBox.VERTICAL, 10, 6) CanvasBox.__init__(self, grid, CanvasBox.VERTICAL, 1)
self._shell = shell self._shell = shell
self._friends = friends self._friends = friends
self._activity_ps = None self._activity_ps = None
@ -26,7 +24,9 @@ class RightPanel(GridBox):
def add(self, buddy): def add(self, buddy):
icon = IconItem(icon_name='stock-buddy', icon = IconItem(icon_name='stock-buddy',
color=IconColor(buddy.get_color())) color=IconColor(buddy.get_color()))
self.set_constraints(icon, 3, 3)
icon.connect('clicked', self.__buddy_clicked_cb, buddy) icon.connect('clicked', self.__buddy_clicked_cb, buddy)
self.add_child(icon) self.add_child(icon)
self._buddies[buddy.get_name()] = icon self._buddies[buddy.get_name()] = icon

View File

@ -1,44 +1,58 @@
import goocanvas import goocanvas
from sugar.canvas.GridLayout import GridGroup from sugar.canvas.CanvasBox import CanvasBox
from sugar.canvas.GridLayout import GridConstraints
from sugar.canvas.IconItem import IconItem from sugar.canvas.IconItem import IconItem
import sugar import sugar
class TopPanel(GridGroup): class TopPanel(goocanvas.Group):
def __init__(self, shell): def __init__(self, grid, shell):
GridGroup.__init__(self, 16, 1) goocanvas.Group.__init__(self)
self._grid = grid
self._shell = shell self._shell = shell
self.add_zoom_level(sugar.ZOOM_ACTIVITY, 'stock-zoom-activity', 1) box = CanvasBox(grid, CanvasBox.HORIZONTAL, 1)
self.add_zoom_level(sugar.ZOOM_HOME, 'stock-zoom-home', 2) self._grid.set_constraints(box, 5, 0)
self.add_zoom_level(sugar.ZOOM_FRIENDS, 'stock-zoom-friends', 3) self.add_child(box)
self.add_zoom_level(sugar.ZOOM_MESH, 'stock-zoom-mesh', 4)
icon = IconItem(icon_name='stock-share', size=self._width) icon = IconItem(icon_name='stock-zoom-activity')
icon.connect('clicked', self.__level_clicked_cb, sugar.ZOOM_ACTIVITY)
box.set_constraints(icon, 3, 3)
box.add_child(icon)
icon = IconItem(icon_name='stock-zoom-home')
icon.connect('clicked', self.__level_clicked_cb, sugar.ZOOM_HOME)
box.set_constraints(icon, 3, 3)
box.add_child(icon)
icon = IconItem(icon_name='stock-zoom-friends')
icon.connect('clicked', self.__level_clicked_cb, sugar.ZOOM_FRIENDS)
box.set_constraints(icon, 3, 3)
box.add_child(icon)
icon = IconItem(icon_name='stock-zoom-mesh')
icon.connect('clicked', self.__level_clicked_cb, sugar.ZOOM_MESH)
box.set_constraints(icon, 3, 3)
box.add_child(icon)
box = CanvasBox(grid, CanvasBox.HORIZONTAL, 1)
self._grid.set_constraints(box, 60, 0)
self.add_child(box)
icon = IconItem(icon_name='stock-share')
icon.connect('clicked', self.__share_clicked_cb) icon.connect('clicked', self.__share_clicked_cb)
self.add_icon(icon, 12) box.set_constraints(icon, 3, 3)
box.add_child(icon)
icon = IconItem(icon_name='stock-invite', size=self._width) icon = IconItem(icon_name='stock-invite')
icon.connect('clicked', self.__invite_clicked_cb) icon.connect('clicked', self.__invite_clicked_cb)
self.add_icon(icon, 13) box.set_constraints(icon, 3, 3)
box.add_child(icon)
icon = IconItem(icon_name='stock-chat', size=self._width) icon = IconItem(icon_name='stock-chat')
icon.connect('clicked', self.__chat_clicked_cb) icon.connect('clicked', self.__chat_clicked_cb)
self.add_icon(icon, 14) box.set_constraints(icon, 3, 3)
box.add_child(icon)
def add_zoom_level(self, level, icon_name, pos):
icon = IconItem(icon_name=icon_name, size=self._height)
icon.connect('clicked', self.__level_clicked_cb, level)
constraints = GridConstraints(pos, 0, 1, 1, 6)
self._layout.set_constraints(icon, constraints)
self.add_child(icon)
def add_icon(self, icon, pos):
constraints = GridConstraints(pos, 0, 1, 1, 6)
self._layout.set_constraints(icon, constraints)
self.add_child(icon)
def __level_clicked_cb(self, item, level): def __level_clicked_cb(self, item, level):
self._shell.set_zoom_level(level) self._shell.set_zoom_level(level)

View File

@ -5,7 +5,5 @@ class CanvasView(goocanvas.CanvasView):
def __init__(self): def __init__(self):
goocanvas.CanvasView.__init__(self) goocanvas.CanvasView.__init__(self)
self.set_size_request(gtk.gdk.screen_width(),
gtk.gdk.screen_height())
self.set_bounds(0, 0, 1200, 900) self.set_bounds(0, 0, 1200, 900)
self.set_scale(gtk.gdk.screen_width() / 1200.0) self.set_scale(gtk.gdk.screen_width() / 1200.0)

View File

@ -2,7 +2,9 @@ sugardir = $(pythondir)/sugar/canvas
sugar_PYTHON = \ sugar_PYTHON = \
__init__.py \ __init__.py \
CanvasView.py \ CanvasView.py \
CanvasBox.py \
Colors.py \ Colors.py \
Grid.py \
GridBox.py \ GridBox.py \
GridLayout.py \ GridLayout.py \
GridModel.py \ GridModel.py \

View File

@ -13,9 +13,8 @@ import goocanvas
from sugar.canvas.IconColor import IconColor from sugar.canvas.IconColor import IconColor
from sugar.canvas.IconItem import IconItem from sugar.canvas.IconItem import IconItem
from sugar.canvas.CanvasView import CanvasView from sugar.canvas.CanvasView import CanvasView
from sugar.canvas.GridBox import GridBox from sugar.canvas.CanvasBox import CanvasBox
from sugar.canvas.GridModel import GridModel from sugar.canvas.Grid import Grid
from sugar.canvas.GridLayout import GridConstraints
def _new_icon_clicked_cb(icon): def _new_icon_clicked_cb(icon):
box.remove_child(icon) box.remove_child(icon)
@ -25,21 +24,26 @@ def _icon_clicked_cb(icon):
icon.connect('clicked', _new_icon_clicked_cb) icon.connect('clicked', _new_icon_clicked_cb)
box.add_child(icon, 0) box.add_child(icon, 0)
model = GridModel('#4f4f4f') model = goocanvas.CanvasModelSimple()
layout = model.get_layout() root = model.get_root_item()
box = GridBox(GridBox.HORIZONTAL, 5, 6) grid = Grid()
layout.set_constraints(box, GridConstraints(0, 0, 5, 1))
model.add(box) box = CanvasBox(grid, CanvasBox.HORIZONTAL, 1)
grid.set_constraints(box, 5, 5)
root.add_child(box)
rect = goocanvas.Rect(fill_color='red') rect = goocanvas.Rect(fill_color='red')
box.set_constraints(rect, 5, 5)
box.add_child(rect) box.add_child(rect)
icon = IconItem(color=IconColor(), icon_name='activity-web') icon = IconItem(color=IconColor(), icon_name='activity-web')
icon.connect('clicked', _icon_clicked_cb) icon.connect('clicked', _icon_clicked_cb)
box.set_constraints(icon, 5, 5)
box.add_child(icon) box.add_child(icon)
icon = IconItem(color=IconColor(), icon_name='activity-groupchat') icon = IconItem(color=IconColor(), icon_name='activity-groupchat')
box.set_constraints(icon, 5, 5)
box.add_child(icon) box.add_child(icon)
window = gtk.Window() window = gtk.Window()
@ -49,6 +53,6 @@ window.show()
canvas = CanvasView() canvas = CanvasView()
canvas.show() canvas.show()
window.add(canvas) window.add(canvas)
canvas.set_model(model.get()) canvas.set_model(model)
gtk.main() gtk.main()