Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <marco@localhost.localdomain>2007-07-05 19:22:37 (GMT)
committer Marco Pesenti Gritti <marco@localhost.localdomain>2007-07-05 19:22:37 (GMT)
commit61b8811a42293498ca8285643295888938c041dc (patch)
tree450c6994bf2830f7df0d53d2ad27fe62e8a7ae0a /sugar
parentc5ab58ed6c8bc2b9125782bc5a7bc6ac9d673eb7 (diff)
Switch to the new layout manager for the mesh view
Diffstat (limited to 'sugar')
-rw-r--r--sugar/graphics/Makefile.am2
-rw-r--r--sugar/graphics/spreadbox.py190
-rw-r--r--sugar/graphics/spreadlayout.py22
3 files changed, 22 insertions, 192 deletions
diff --git a/sugar/graphics/Makefile.am b/sugar/graphics/Makefile.am
index c15c502..a945960 100644
--- a/sugar/graphics/Makefile.am
+++ b/sugar/graphics/Makefile.am
@@ -16,7 +16,7 @@ sugar_PYTHON = \
roundbox.py \
palette.py \
panel.py \
- spreadbox.py \
+ spreadlayout.py \
toggletoolbutton.py \
toolbox.py \
toolbutton.py \
diff --git a/sugar/graphics/spreadbox.py b/sugar/graphics/spreadbox.py
deleted file mode 100644
index 1c1ffc9..0000000
--- a/sugar/graphics/spreadbox.py
+++ /dev/null
@@ -1,190 +0,0 @@
-# Copyright (C) 2006-2007 Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-from array import array
-from random import random
-
-import gobject
-import hippo
-
-_X_TILES = 120
-_NUM_TRIALS = 20
-_MAX_WEIGHT = 255
-
-class _Grid(object):
- def __init__(self, x_tiles, y_tiles, cell_size):
- self._array = array('B')
- self.x_tiles = x_tiles
- self.y_tiles = y_tiles
- self.cell_size = cell_size
-
- for i in range(self.y_tiles * self.x_tiles):
- self._array.append(0)
-
- def __getitem__(self, (row, col)):
- return self._array[col + row * self.x_tiles]
-
- def __setitem__(self, (row, col), value):
- self._array[col + row * self.x_tiles] = value
-
- def compute_weight_at(self, x, y, width, height):
- weight = 0
-
- for i in range(x, x + width):
- for j in range(y, y + height):
- weight += self[j, i]
-
- return weight
-
- def add_weight_at(self, x, y, width, height):
- for i in range(x, x + width):
- for j in range(y, y + height):
- self[j, i] += 1
-
- def remove_weight_at(self, x, y, width, height):
- for i in range(x, x + width):
- for j in range(y, y + height):
- self[j, i] -= 1
-
- def from_canvas(self, dim):
- return dim / self.cell_size
-
- def to_canvas(self, dim):
- return dim * self.cell_size
-
-class _ItemInfo(gobject.GObject):
- def __init__(self):
- gobject.GObject.__init__(self)
- self.x = -1
- self.y = -1
- self.width = -1
- self.height = -1
-
- def add_weight(self, grid):
- grid.add_weight_at(self.x, self.y, self.width, self.height)
-
- def remove_weight(self, grid):
- grid.remove_weight_at(self.x, self.y, self.width, self.height)
-
- def compute_weight(self, grid, x=-1, y=-1):
- if x < 0:
- x = self.x
- if y < 0:
- y = self.y
-
- grid.compute_weight_at(x, y, self.width, self.height)
-
-class SpreadBox(hippo.CanvasBox, hippo.CanvasItem):
- __gtype_name__ = 'SugarSpreadBox'
- def __init__(self, **kwargs):
- hippo.CanvasBox.__init__(self, **kwargs)
-
- self._grid = None
- self._center = None
- self._width = -1
- self._height = -1
-
- def set_center_item(self, item):
- if self._center:
- self.remove(self._center)
-
- self.append(item, hippo.PACK_FIXED)
- self._center = item
-
- self._layout_center()
-
- def add_item(self, item):
- item.set_data('item-info', _ItemInfo())
- self.append(item, hippo.PACK_FIXED)
- self._layout_item(item)
-
- def remove_item(self, item):
- if self._grid:
- info = item.get_data('item-info')
- info.remove_weight(self._grid)
-
- self.remove(item)
-
- def _place_item(self, item, x, y):
- info = item.get_data('item-info')
- info.x = x
- info.y = y
- info.add_weight(self._grid)
-
- self.set_position(item, self._grid.to_canvas(x),
- self._grid.to_canvas(y))
-
- def _layout_item(self, item):
- if not self._grid:
- return
-
- info = item.get_data('item-info')
-
- [width, height] = item.get_allocation()
- info.width = self._grid.from_canvas(width)
- info.height = self._grid.from_canvas(height)
-
- trials = _NUM_TRIALS
- placed = False
- best_weight = _MAX_WEIGHT
-
- while trials > 0 and not placed:
- x = int(random() * (self._grid.x_tiles - info.width))
- y = int(random() * (self._grid.y_tiles - info.height))
-
- weight = info.compute_weight(self._grid, x, y)
-
- if weight == 0:
- self._place_item(item, x, y)
- placed = True
- elif weight < best_weight:
- best_x = x
- best_y = y
-
- trials -= 1
-
- if not placed:
- self._place_item(item, best_x, best_y)
-
- def _layout(self):
- for item in self.get_children():
- if item != self._center:
- self._layout_item(item)
-
- def _layout_center(self):
- if not self._center or not self._grid:
- return
-
- [width, height] = self._center.get_allocation()
- x = (self._width - width) / 2
- y = (self._height - height) / 2
- self.set_position(self._center, x, y)
-
- def do_allocate(self, width, height, origin_changed):
- hippo.CanvasBox.do_allocate(self, width, height, origin_changed)
-
- if width != self._width or height != self._height:
- cell_size = width / _X_TILES
- y_tiles = height / cell_size
-
- self._grid = _Grid(_X_TILES, y_tiles, cell_size)
- self._width = width
- self._height = height
-
- self._layout()
-
- self._layout_center()
diff --git a/sugar/graphics/spreadlayout.py b/sugar/graphics/spreadlayout.py
index 3daf20a..36a4fe1 100644
--- a/sugar/graphics/spreadlayout.py
+++ b/sugar/graphics/spreadlayout.py
@@ -35,6 +35,14 @@ class _Grid(object):
for i in range(width * height):
self._array.append(0)
+ def add_locked(self, child, x, y, width, height):
+ rect = gtk.gdk.Rectangle(x, y, width, height)
+
+ child.locked = True
+ child.grid_rect = rect
+
+ self._add_weight(rect)
+
def add(self, child, width, height):
trials = _PLACE_TRIALS
weight = _MAX_WEIGHT
@@ -50,10 +58,12 @@ class _Grid(object):
trials -= 1
child.grid_rect = rect
+ child.locked = False
+
self._add_weight(rect)
def remove(self, child):
- self._remove_weight(box_child.grid_rect)
+ self._remove_weight(child.grid_rect)
child.grid_rect = None
def _add_weight(self, rect):
@@ -92,6 +102,16 @@ class SpreadLayout(gobject.GObject,hippo.CanvasLayout):
self._grid = _Grid(width / _CELL_SIZE, height / _CELL_SIZE)
+ def add_center(self, child):
+ self._box.append(child)
+
+ width, height = self._get_child_grid_size(child)
+ box_child = self._box.find_box_child(child)
+ self._grid.add_locked(box_child,
+ int((self._grid.width - width) / 2),
+ int((self._grid.height - height) / 2),
+ width, height)
+
def add(self, child):
self._box.append(child)