[Sugar-devel] [PATCH Paint Activity] Fixed aspect ratio mode for Shape tools (OLPC#3705)

Gonzalo Odiard godiard at gmail.com
Wed Oct 27 15:56:28 EDT 2010


Thanks! Is very nice.
In the selection tool palette, we have a check box to enable change
the fixed ratio.
Can you add the checkbox to the palettes from ellipse, rectangle and line?

Gonzalo

On Wed, Oct 27, 2010 at 4:28 PM, Ayush Goyal <ayush at seeta.in> wrote:
> Added fixed aspect ratio mode for line,ellipse and rectangle tool using Shift
> key as mask.This allows drawing of straight lines & 45 degree lines from line
> tool,circle from ellipse tool and square from rectangle tool
>
> Signed-off-by: Ayush Goyal <ayush at seeta.in>
> ---
>  Area.py |   33 ++++++++++++++++++++++++++++++++-
>  1 files changed, 32 insertions(+), 1 deletions(-)
>
> diff --git a/Area.py b/Area.py
> index ba06758..0bef28b 100644
> --- a/Area.py
> +++ b/Area.py
> @@ -412,6 +412,12 @@ class Area(gtk.DrawingArea):
>
>         coords = int(x), int(y)
>
> +        if state & gtk.gdk.SHIFT_MASK:
> +            if self.tool['name'] in ['rectangle', 'ellipse']:
> +                coords = self._keep_selection_ratio(coords)
> +            elif self.tool['name'] == 'line':
> +                coords = self._keep_line_ratio(coords)
> +
>         if state & gtk.gdk.BUTTON1_MASK and self.pixmap != None:
>             if self.tool['name'] == 'pencil':
>                 self.d.brush(widget, coords, self.last,
> @@ -530,11 +536,17 @@ class Area(gtk.DrawingArea):
>             @param  event -- GdkEvent
>         """
>         coords = int(event.x), int(event.y)
> +        if event.state & gtk.gdk.SHIFT_MASK:
> +            if self.tool['name'] in ['rectangle', 'ellipse']:
> +                coords = self._keep_selection_ratio(coords)
> +            if self.tool['name'] == 'line':
> +                coords = self._keep_line_ratio(coords)
> +
>         width, height = self.window.get_size()
>         if self.desenha or self.sel_get_out:
>             if self.tool['name'] == 'line':
>                 self.pixmap.draw_line(self.gc_line, self.oldx, self.oldy,
> -                    int(event.x), int(event.y))
> +                                      coords[0], coords[1])
>                 widget.queue_draw()
>                 self.enableUndo(widget)
>
> @@ -1411,3 +1423,22 @@ class Area(gtk.DrawingArea):
>
>         return (self.oldx + sign(dx) * size,
>                 self.oldy + sign(dy) * size)
> +
> +    def _keep_line_ratio(self, coords):
> +
> +        def sign(x):
> +            return x and x / abs(x) or 0
> +
> +        dx = int(coords[0]) - self.oldx
> +        dy = int(coords[1]) - self.oldy
> +        size = max(abs(dx), abs(dy))
> +
> +        if abs(dx) > 0.5 * size and abs(dy) > 0.5 * size:
> +            return (self.oldx + sign(dx) * size,
> +                   self.oldy + sign(dy) * size)
> +        elif abs(dx) < 0.5 * size and abs(dy) > 0.5 * size:
> +            return (self.oldx,
> +                   self.oldy + sign(dy) * size)
> +        elif abs(dx) > 0.5 * size and abs(dy) < 0.5 * size:
> +            return (self.oldx + sign(dx) * size,
> +                   self.oldy)
> --
> 1.7.1
>
>



-- 
Gonzalo Odiard


More information about the Sugar-devel mailing list