class SpreadLayout(gobject.GObject, hippo.CanvasLayout): __gtype_name__ = 'SugarSpreadLayout' def __init__(self): gobject.GObject.__init__(self) self._box = None min_width, width = self.do_get_width_request() min_height, height = self.do_get_height_request(width) self._grid = Grid(int(width / _CELL_SIZE), int(height / _CELL_SIZE)) self._grid.connect('child-changed', self._grid_child_changed_cb) def add(self, child): self._box.append(child) width, height = self._get_child_grid_size(child) self._grid.add(child, width, height) def remove(self, child): self._grid.remove(child) self._box.remove(child) def move(self, child, x, y): self._grid.move(child, x / _CELL_SIZE, y / _CELL_SIZE, locked=True) def do_set_box(self, box): self._box = box def do_get_height_request(self, for_width): return 0, gtk.gdk.screen_height() - style.GRID_CELL_SIZE def do_get_width_request(self): return 0, gtk.gdk.screen_width() def do_allocate(self, x, y, width, height, req_width, req_height, origin_changed): for child in self._box.get_layout_children(): # We need to always get requests to not confuse hippo min_w, child_width = child.get_width_request() min_h, child_height = child.get_height_request(child_width) rect = self._grid.get_child_rect(child.item) child.allocate(int(round(rect.x * _CELL_SIZE)), int(round(rect.y * _CELL_SIZE)), child_width, child_height, origin_changed) def _get_child_grid_size(self, child): min_width, width = child.get_width_request() min_height, height = child.get_height_request(width) width = math.ceil(width / _CELL_SIZE) height = math.ceil(height / _CELL_SIZE) return int(width), int(height) def _grid_child_changed_cb(self, grid, child): child.emit_request_changed()
class RandomActivityLayout(ActivityLayout): """Lay out icons randomly; try to nudge them around to resolve overlaps.""" __gtype_name__ = 'RandomActivityLayout' icon_name = 'view-freeform' """Name of icon used in home view dropdown palette.""" key = 'random-layout' """String used in profile to represent this view.""" # TRANS: label for the freeform layout in the pathway view palette_name = _('Freeform') """String used to identify this layout in home view dropdown palette.""" def __init__(self): ActivityLayout.__init__(self) min_width_, width = self.do_get_width_request() min_height_, height = self.do_get_height_request(width) self._grid = Grid(width / _CELL_SIZE, height / _CELL_SIZE) self._grid.connect('child-changed', self.__grid_child_changed_cb) def __grid_child_changed_cb(self, grid, child): child.emit_request_changed() def append(self, icon, locked=False): ActivityLayout.append(self, icon, locked) min_width_, child_width = icon.get_width_request() min_height_, child_height = icon.get_height_request(child_width) min_width_, width = self.box.get_width_request() min_height_, height = self.box.get_height_request(width) if icon in self.fixed_positions: x, y = self.fixed_positions[icon] x = min(x, width - child_width) y = min(y, height - child_height) elif hasattr(icon, 'get_bundle_id'): name_hash = hashlib.md5(icon.get_bundle_id()) x = int(name_hash.hexdigest()[:5], 16) % (width - child_width) y = int(name_hash.hexdigest()[-5:], 16) % (height - child_height) else: x = None y = None if x is None or y is None: self._grid.add(icon, child_width / _CELL_SIZE, child_height / _CELL_SIZE) else: self._grid.add(icon, child_width / _CELL_SIZE, child_height / _CELL_SIZE, x / _CELL_SIZE, y / _CELL_SIZE) def remove(self, icon): self._grid.remove(icon) ActivityLayout.remove(self, icon) def move_icon(self, icon, x, y, locked=False): self._grid.move(icon, x / _CELL_SIZE, y / _CELL_SIZE, locked) ActivityLayout.move_icon(self, icon, x, y, locked) def do_allocate(self, x, y, width, height, req_width, req_height, origin_changed): for child in self.box.get_layout_children(): # We need to always get requests to not confuse hippo min_w_, child_width = child.get_width_request() min_h_, child_height = child.get_height_request(child_width) rect = self._grid.get_child_rect(child.item) child.allocate(rect.x * _CELL_SIZE, rect.y * _CELL_SIZE, child_width, child_height, origin_changed) def allow_dnd(self): return True
class RandomLayout(FavoritesLayout): """Lay out icons randomly; try to nudge them around to resolve overlaps.""" __gtype_name__ = 'RandomLayout' icon_name = 'view-freeform' """Name of icon used in home view dropdown palette.""" key = 'random-layout' """String used in profile to represent this view.""" # TRANS: label for the freeform layout in the favorites view palette_name = _('Freeform') """String used to identify this layout in home view dropdown palette.""" def __init__(self): FavoritesLayout.__init__(self) min_width_, width = self.do_get_width_request() min_height_, height = self.do_get_height_request(width) self._grid = Grid(width / _CELL_SIZE, height / _CELL_SIZE) self._grid.connect('child-changed', self.__grid_child_changed_cb) def __grid_child_changed_cb(self, grid, child): child.emit_request_changed() def append(self, icon, locked=False): FavoritesLayout.append(self, icon, locked) min_width_, child_width = icon.get_width_request() min_height_, child_height = icon.get_height_request(child_width) min_width_, width = self.box.get_width_request() min_height_, height = self.box.get_height_request(width) if icon in self.fixed_positions: x, y = self.fixed_positions[icon] x = min(x, width - child_width) y = min(y, height - child_height) elif hasattr(icon, 'get_bundle_id'): name_hash = hashlib.md5(icon.get_bundle_id()) x = int(name_hash.hexdigest()[:5], 16) % (width - child_width) y = int(name_hash.hexdigest()[-5:], 16) % (height - child_height) else: x = None y = None if x is None or y is None: self._grid.add(icon, child_width / _CELL_SIZE, child_height / _CELL_SIZE) else: self._grid.add(icon, child_width / _CELL_SIZE, child_height / _CELL_SIZE, x / _CELL_SIZE, y / _CELL_SIZE) def remove(self, icon): self._grid.remove(icon) FavoritesLayout.remove(self, icon) def move_icon(self, icon, x, y, locked=False): self._grid.move(icon, x / _CELL_SIZE, y / _CELL_SIZE, locked) FavoritesLayout.move_icon(self, icon, x, y, locked) def do_allocate(self, x, y, width, height, req_width, req_height, origin_changed): for child in self.box.get_layout_children(): # We need to always get requests to not confuse hippo min_w_, child_width = child.get_width_request() min_h_, child_height = child.get_height_request(child_width) rect = self._grid.get_child_rect(child.item) child.allocate(rect.x * _CELL_SIZE, rect.y * _CELL_SIZE, child_width, child_height, origin_changed) def allow_dnd(self): return True