[Sugar-devel] [REVIEW] adding spiral to Home View

Gary Martin garycmartin at googlemail.com
Fri Aug 6 11:48:36 EDT 2010


Hi Walter,

Wanted to give it a quick run in my vm, but when I tried to apply it using patch, it gave me the error:

   patch: **** malformed patch at line 35: @@ -201,6 +202,11 @@ class RingLayout(FavoritesLayout):

I'm probably doing something dumb, is this the expected way to apply the patch?

--Gary

On 6 Aug 2010, at 13:58, Walter Bender wrote:

> As per http://lists.sugarlabs.org/archive/sugar-devel/2010-August/025874.html
> I have been experimenting with a variant of the Home View in which the
> circle morphs into a spiral when the number of icons grows too large.
> Icons don't shrink until the spiral runs off the screen. With this
> scheme, we can support on the order of 200+ icons on the Home View.
> 
> This is just a first pass. Please review. Thanks.
> 
> 
> From 4ad5ad7e003fdd9eeb703c1287bd9f5c8484e967 Mon Sep 17 00:00:00 2001
> From: Walter Bender <walter at sugarlabs.org>
> Date: Fri, 6 Aug 2010 08:53:10 -0400
> Subject: [PATCH] adding spiral to circle view
> 
> ---
> src/jarabe/desktop/favoriteslayout.py |   92 ++++++++++++++++++++++++++-------
> 1 files changed, 73 insertions(+), 19 deletions(-)
> 
> diff --git a/src/jarabe/desktop/favoriteslayout.py
> b/src/jarabe/desktop/favoriteslayout.py
> index 85e1b59..a945c49 100644
> --- a/src/jarabe/desktop/favoriteslayout.py
> +++ b/src/jarabe/desktop/favoriteslayout.py
> @@ -1,4 +1,5 @@
> # Copyright (C) 2008 One Laptop Per Child
> +# Copyright (C) 2010 Sugar Labs
> #
> # This program is free software; you can redistribute it and/or modify
> # it under the terms of the GNU General Public License as published by
> @@ -201,6 +202,11 @@ class RingLayout(FavoritesLayout):
>     def __init__(self):
>         FavoritesLayout.__init__(self)
>         self._locked_children = {}
> +        self._spiral = False
> +        self._radius = _MINIMUM_RADIUS
> +        self._orientation = math.pi
> +        self._icon_size = style.STANDARD_ICON_SIZE
> +        self._count = -1
> 
>     def append(self, icon, locked=False):
>         FavoritesLayout.append(self, icon, locked)
> @@ -221,31 +227,79 @@ class RingLayout(FavoritesLayout):
>             self._locked_children[child] = (x, y)
> 
>     def _calculate_radius_and_icon_size(self, children_count):
> -        # what's the radius required without downscaling?
> +        """ determine if we are drawing a circle or a spiral """
>         distance = style.STANDARD_ICON_SIZE + style.DEFAULT_SPACING
> -        icon_size = style.STANDARD_ICON_SIZE
> -        # circumference is 2*pi*r; we want this to be at least
> -        # 'children_count * distance'
> +
>         radius = children_count * distance / (2 * math.pi)
> -        # limit computed radius to reasonable bounds.
> -        radius = max(radius, _MINIMUM_RADIUS)
> -        radius = min(radius, _MAXIMUM_RADIUS)
> -        # recompute icon size from limited radius
> -        if children_count > 0:
> -            icon_size = (2 * math.pi * radius / children_count) \
> -                        - style.DEFAULT_SPACING
> -        # limit adjusted icon size.
> -        icon_size = max(icon_size, style.SMALL_ICON_SIZE)
> -        icon_size = min(icon_size, style.MEDIUM_ICON_SIZE)
> -        return radius, icon_size
> +        if radius < _MAXIMUM_RADIUS:
> +            self._spiral = False
> +            self._icon_size = style.STANDARD_ICON_SIZE
> +        else:
> +            self._spiral = True
> +            radius = _MINIMUM_RADIUS
> +
> +        # If there are fewer children, try increasing icon_size.
> +        if self._count > children_count:
> +            logging.debug('resetting count: %d > %d' % (self._count,
> children_count))
> +            if self._icon_size == style.MEDIUM_ICON_SIZE:
> +                self._icon_size = style.STANDARD_ICON_SIZE
> +            elif self._icon_size == style.SMALL_ICON_SIZE:
> +                self._icon_size = style.MEDIUM_ICON_SIZE
> +        self._count = children_count
> +
> +        return radius, self._icon_size
> +
> +    def _calculate_xy(self, icon_size, width, height):
> +        """ Convert r, o to x, y """
> +        x = -math.sin(self._orientation) * self._radius
> +        y = math.cos(self._orientation) * self._radius
> +        self._calculate_new_radius_orientation(icon_size +\
> +                                                   style.DEFAULT_SPACING)
> +
> +        x = int(x) + (width - icon_size) / 2
> +        y = int(y) + (height - icon_size - (style.GRID_CELL_SIZE / 2) ) / 2
> +        return x, y
> +
> +    def _calculate_new_radius_orientation(self, icon_size):
> +        """ Based upon current radius, calculate new increments """
> +        circumference = self._radius * 2 * math.pi
> +        n = circumference / icon_size
> +        self._orientation += 2 * math.pi / n
> +        self._radius += float(icon_size) / n
> 
>     def _calculate_position(self, radius, icon_size, index, children_count,
>                             sin=math.sin, cos=math.cos):
> +        """ Try fitting a circle or a spiral """
> +
>         width, height = self.box.get_allocation()
> -        angle = index * (2 * math.pi / children_count) - math.pi / 2
> -        x = radius * cos(angle) + (width - icon_size) / 2
> -        y = radius * sin(angle) + (height - icon_size -
> -                                   (style.GRID_CELL_SIZE/2) ) / 2
> +        if not self._spiral:
> +            angle = index * (2 * math.pi / children_count) - math.pi / 2
> +            x = radius * cos(angle) + (width - icon_size) / 2
> +            y = radius * sin(angle) + (height - icon_size -
> +                                       (style.GRID_CELL_SIZE/2) ) / 2
> +        else:
> +            min_width_, box_width = self.box.get_width_request()
> +            min_height_, box_height = self.box.get_height_request(box_width)
> +            if index == 0:
> +                self._radius = _MINIMUM_RADIUS
> +                self._orientation = math.pi
> +            x, y = self._calculate_xy(icon_size, width, height)
> +            # If we run off the edge, keep spiraling until we return.
> +            while x < min_width_ or x > box_width - icon_size or \
> +                    y < min_height_ or y > box_height - icon_size:
> +                x, y = self._calculate_xy(icon_size, width, height)
> +                # If we run past a corner, we will never return, so time to
> +                # shrink the icons.
> +                if (x < min_height_ and \
> +                        (y < min_width_ or y > box_height - icon_size)) or \
> +                   (x > box_width - icon_size and \
> +                             (y < min_width_ or y > box_height - icon_size)):
> +                    if self._icon_size == style.STANDARD_ICON_SIZE:
> +                        self._icon_size = style.MEDIUM_ICON_SIZE
> +                    elif self._icon_size == style.MEDIUM_ICON_SIZE:
> +                        self._icon_size = style.SMALL_ICON_SIZE
> +                    else: # give up
> +                        return x, y
>         return x, y
> 
>     def _get_children_in_ring(self):
> -- 
> 1.7.0.4
> 
> -walter
> 
> -- 
> Walter Bender
> Sugar Labs
> http://www.sugarlabs.org
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel



More information about the Sugar-devel mailing list