Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/graphics/spreadbox.py
diff options
context:
space:
mode:
Diffstat (limited to 'sugar/graphics/spreadbox.py')
-rw-r--r--sugar/graphics/spreadbox.py190
1 files changed, 0 insertions, 190 deletions
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()