[Sugar-devel] [PATCH v2 Paint Activity] Fixed aspect ratio mode for Shape tools (OLPC#3705)
Gonzalo Odiard
godiard at gmail.com
Fri Oct 29 09:46:58 EDT 2010
Commited, thanks.
Gonzalo
On Thu, Oct 28, 2010 at 5:17 PM, Ayush Goyal <ayush at seeta.in> wrote:
> Added fixed aspect ratio mode for line,ellipse and rectangle tool using
> Shift
> key as mask or using a keep aspect ratio checkbox from palette.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 | 40 +++++++++++++++++++++++++++++++++++++++-
> toolbox.py | 11 +++++++++++
> 2 files changed, 50 insertions(+), 1 deletions(-)
> v1->v2:Added checkbox for keep aspect in shape menu palette
>
> diff --git a/Area.py b/Area.py
> index ba06758..db84e65 100644
> --- a/Area.py
> +++ b/Area.py
> @@ -173,6 +173,10 @@ class Area(gtk.DrawingArea):
> self.last = []
> self.rainbow_counter = 0
> self.keep_aspect_ratio = False
> + self.keep_ratio = {
> + 'line': False,
> + 'rectangle': False,
> + 'ellipse': False}
>
> self.font = pango.FontDescription('Sans 9')
> self._set_selection_bounds(0, 0, 0, 0)
> @@ -411,6 +415,13 @@ class Area(gtk.DrawingArea):
> self.x_cursor, self.y_cursor = int(x), int(y)
>
> coords = int(x), int(y)
> + if self.tool['name'] in ['rectangle', 'ellipse', 'line']:
> + if (state & gtk.gdk.SHIFT_MASK) or \
> + self.keep_ratio[self.tool['name']]:
> + 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':
> @@ -530,11 +541,19 @@ class Area(gtk.DrawingArea):
> @param event -- GdkEvent
> """
> coords = int(event.x), int(event.y)
> + if self.tool['name'] in ['rectangle', 'ellipse', 'line']:
> + if (event.state & gtk.gdk.SHIFT_MASK) or \
> + self.keep_ratio[self.tool['name']]:
> + 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 +1430,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)
> diff --git a/toolbox.py b/toolbox.py
> index 3c8ab92..e8569c8 100644
> --- a/toolbox.py
> +++ b/toolbox.py
> @@ -855,6 +855,10 @@ class ShapesToolbar(gtk.Toolbar):
> tool['fill'] = checkbutton.get_active()
> self.set_tool(tool=tool)
>
> + def _on_keep_aspect_checkbutton_toggled(self, checkbutton, tool):
> + self._activity.area.keep_ratio[tool['name']] =
> checkbutton.get_active()
> + self.set_tool(tool=tool)
> +
> def _configure_palette_shape_ellipse(self):
> logging.debug('Creating palette to shape ellipse')
> self._create_simple_palette(self._shape_ellipse,
> self._SHAPE_ELLIPSE)
> @@ -960,6 +964,13 @@ class ShapesToolbar(gtk.Toolbar):
> palette.content_box = gtk.VBox()
> palette.set_content(palette.content_box)
>
> + if tool['name'] in ['rectangle', 'ellipse', 'line']:
> + keep_aspect_checkbutton = gtk.CheckButton(_('Keep Aspect'))
> + ratio = self._activity.area.keep_ratio[tool['name']]
> + keep_aspect_checkbutton.set_active(ratio)
> + keep_aspect_checkbutton.connect('toggled',
> + self._on_keep_aspect_checkbutton_toggled, tool)
> + palette.content_box.pack_start(keep_aspect_checkbutton)
> # Fill option
> if not line_size_only:
> fill_checkbutton = gtk.CheckButton(_('Fill'))
> --
> 1.7.1
>
>
--
Gonzalo Odiard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20101029/8dcd812a/attachment.html>
More information about the Sugar-devel
mailing list