From 90bf7269de06b9b1398de7eb387d52cffda72694 Mon Sep 17 00:00:00 2001 From: Manusheel Date: Tue, 24 Jul 2007 15:10:45 +0000 Subject: Bugs fixed, new functions added, existing functions changed --- diff --git a/Area.py b/Area.py index 2d858b3..62be2c1 100644 --- a/Area.py +++ b/Area.py @@ -1,18 +1,73 @@ # -*- coding: utf-8 -*- -import pygtk -pygtk.require('2.0') -import gtk -import sys, gobject, socket -from gtk import gdk -import math -import pango - -from Desenho import Desenho - -WIDTH = 800 -HEIGHT = 600 - -class Area(gtk.DrawingArea): +""" +Area.py + +Tools and events manipulation + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +Colaborators: +Bruno Gola (brunogola@gmail.com) + +Group Manager: +Irene Karaguilla Ficheman (irene@lsi.usp.br) + +Cientific Coordinator: +Roseli de Deus Lopes (roseli@lsi.usp.br) + +""" + + +import pygtk +pygtk.require('2.0') +import gtk +import sys, gobject, socket +from gtk import gdk +import math +import pango +from fill import * + +from Desenho import Desenho + +WIDTH = 800 +HEIGHT = 600 + +class Area(gtk.DrawingArea): def __init__(self, janela): """ Initialize the object from class Area which is derived from gtk.DrawingArea. @@ -20,76 +75,88 @@ class Area(gtk.DrawingArea): self -- the Area object (GtkDrawingArea) janela -- the parent window - """ - gtk.DrawingArea.__init__(self) - self.set_size_request(WIDTH, HEIGHT) - self.set_events(gtk.gdk.POINTER_MOTION_MASK | - gtk.gdk.POINTER_MOTION_HINT_MASK | - gtk.gdk.BUTTON_PRESS_MASK | - gtk.gdk.BUTTON_RELEASE_MASK| - gtk.gdk.EXPOSURE_MASK) - - self.connect("expose_event",self.expose) - self.connect("motion_notify_event", self.mousemove) - self.connect("button_press_event", self.mousedown) - self.connect("button_release_event", self.mouseup) - - self.set_extension_events(gtk.gdk.EXTENSION_EVENTS_CURSOR) - - self.tool = None - self.desenha = False - self.move = False - self.connect("configure_event", self.configure_event) - self.oldx = 0 - self.oldy = 0 - self.newx = 0 - self.newy = 0 - self.newx_ = 0 + """ + gtk.DrawingArea.__init__(self) + self.set_size_request(WIDTH, HEIGHT) + self.set_events(gtk.gdk.POINTER_MOTION_MASK | + gtk.gdk.POINTER_MOTION_HINT_MASK | + gtk.gdk.BUTTON_PRESS_MASK | + gtk.gdk.BUTTON_RELEASE_MASK| + gtk.gdk.EXPOSURE_MASK) + + self.connect("expose_event",self.expose) + self.connect("motion_notify_event", self.mousemove) + self.connect("button_press_event", self.mousedown) + self.connect("button_release_event", self.mouseup) + + self.set_extension_events(gtk.gdk.EXTENSION_EVENTS_CURSOR) + + self.tool = None + self.desenha = False + self.selmove = False + self.sel_get_out = False + self.connect("configure_event", self.configure_event) + self.oldx = 0 + self.oldy = 0 + self.newx = 0 + self.newy = 0 + self.newx_ = 0 self.newy_ = 0 - self.color_dec = 0 + self.color_dec = 0 self.polygon_start = True - self.busy = False - self.gc = None - self.gc_line = None + self.gc = None + self.gc_line = None self.gc_eraser = None - self.gc_brush = None + self.gc_brush = None self.gc_selection = None - self.pixmap = None - self.pixmap_temp = None - self.desenho = [] - self.textos = [] - self.color_ = 0 - self.color_line = 0 - self.estadoTexto = 0 - self.janela = janela + self.pixmap = None + self.pixmap_temp = None + self.pixmap_sel = None + self.desenho = [] + self.textos = [] + #self.color_ = 0 + #self.color_line = 0 + self.estadoTexto = 0 + self.janela = janela self.d = Desenho(self) self.line_size = 2 self.brush_shape = 'circle' - - colormap = self.get_colormap() - - self.cores = [ - colormap.alloc_color('#000000', True, True), # black - colormap.alloc_color('#ee33ee', True, True), # purple - colormap.alloc_color('#f4ee56', True, True), # yellow - colormap.alloc_color('#45a5dc', True, True), # blue - colormap.alloc_color('#44aa44', True, True), # green - colormap.alloc_color('#dd5555', True, True), # red - colormap.alloc_color('#ffaa11', True, True), # orange - colormap.alloc_color('#ffffff', True, True), # white - colormap.alloc_color('#00aa00', True, True) # green - selection - ] - self.font = pango.FontDescription('Sans 9') - #self.mensagem = Mensagens(self) + self.eraser_shape = 'circle' + + #This list must not be used. Using gdk.Color objects. + ''' + colormap = self.get_colormap() + + self.cores = [ + colormap.alloc_color('#ffffff', True, True), # white + colormap.alloc_color('#800000', True, True), # maroon + colormap.alloc_color('#ff0000', True, True), # red + colormap.alloc_color('#808000', True, True), # olive + colormap.alloc_color('#ffff00', True, True), # yellow + colormap.alloc_color('#008000', True, True), # green + colormap.alloc_color('#00ff00', True, True), # lime + colormap.alloc_color('#008080', True, True), # teal + colormap.alloc_color('#00ffff', True, True), # aqua + colormap.alloc_color('#000080', True, True), # navy + colormap.alloc_color('#0000ff', True, True), # blue + colormap.alloc_color('#800080', True, True), # purple + colormap.alloc_color('#ff00ff', True, True), # fuchsia + colormap.alloc_color('#000000', True, True) # black - selection + ] + ''' + + self.font = pango.FontDescription('Sans 9') + #self.mensagem = Mensagens(self) #self.mensagem.criaConexao() #start of UNDO and REDO self.first_undo = True + self.first_redo = True self.undo_times = 0 self.redo_times = 0 - self.undo_list=[]#pixmaps list to Undo func - - # Create a new backing pixmap of the appropriate size + self.undo_list=[]#pixmaps list to Undo func + + # Create a new backing pixmap of the appropriate size def configure_event(self, widget, event): """Configure the Area object. @@ -98,31 +165,38 @@ class Area(gtk.DrawingArea): widget -- the Area object (GtkDrawingArea) event -- GdkEvent - """ - win = widget.window - width = win.get_geometry()[2] - height = win.get_geometry()[3] - - self.pixmap = gtk.gdk.Pixmap(win, width, height, -1) - self.pixmap.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height) - self.pixmap_temp = gtk.gdk.Pixmap(win, width, height, -1) - self.pixmap_temp.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height) - - self.gc = widget.window.new_gc() - self.gc_eraser = widget.window.new_gc() - self.gc_eraser.set_foreground(self.cores[7]) + """ + win = widget.window + width = win.get_geometry()[2] + height = win.get_geometry()[3] + + self.pixmap = gtk.gdk.Pixmap(win, width, height, -1) + self.pixmap.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height) + + self.pixmap_temp = gtk.gdk.Pixmap(win, width, height, -1) + self.pixmap_temp.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height) + + self.pixmap_sel = gtk.gdk.Pixmap(win, width, height, -1) + self.pixmap_sel.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height) + + self.gc = widget.window.new_gc() + self.gc_eraser = widget.window.new_gc() + colormap = self.get_colormap() + white = colormap.alloc_color('#ffffff', True, True) # white + self.gc_eraser.set_foreground(white) - self.gc_brush = widget.window.new_gc() - self.gc_brush.set_foreground(self.cores[0]) - + self.gc_brush = widget.window.new_gc() + self.gc_brush.set_foreground(white) + self.gc_line = widget.window.new_gc() - self.gc_selection = widget.window.new_gc() - self.gc_selection.set_line_attributes(1, gtk.gdk.LINE_ON_OFF_DASH, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_ROUND) - self.gc_selection.set_foreground(self.cores[8]) + self.gc_selection = widget.window.new_gc() + self.gc_selection.set_line_attributes(1, gtk.gdk.LINE_ON_OFF_DASH, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_ROUND) + black = colormap.alloc_color('#000000', True, True) # black + self.gc_selection.set_foreground(black) print 'configure event' - + return True # set the new line size @@ -135,8 +209,8 @@ class Area(gtk.DrawingArea): """ self.line_size = size - self.gc_line.set_line_attributes(size, gtk.gdk.LINE_SOLID, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_ROUND) - + self.gc_line.set_line_attributes(size, gtk.gdk.LINE_SOLID, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_ROUND) + def expose(self, widget, event): """Show up the Area object (GtkDrawingArea). @@ -145,14 +219,17 @@ class Area(gtk.DrawingArea): widget -- the Area object (GtkDrawingArea) event -- GdkEvent - """ - area = event.area - if self.desenha: - widget.window.draw_drawable(self.gc, self.pixmap_temp, area[0], area[1], area[0], area[1], area[2], area[3]) - else: - widget.window.draw_drawable(self.gc, self.pixmap, area[0], area[1], area[0], area[1], area[2], area[3]) - return False - + """ + area = event.area + if self.desenha: + if self.selmove : + widget.window.draw_drawable(self.gc, self.pixmap_sel, area[0], area[1], area[0], area[1], area[2], area[3]) + else: + widget.window.draw_drawable(self.gc, self.pixmap_temp, area[0], area[1], area[0], area[1], area[2], area[3]) + else: + widget.window.draw_drawable(self.gc, self.pixmap, area[0], area[1], area[0], area[1], area[2], area[3]) + return False + def mousedown(self,widget,event): """Make the Area object (GtkDrawingArea) recognize that the mouse button was pressed. @@ -161,17 +238,27 @@ class Area(gtk.DrawingArea): widget -- the Area object (GtkDrawingArea) event -- GdkEvent - """ + """ # text - if self.busy == False: - if self.tool == 4: - self.d.text(widget,event) - if not self.move or self.tool != 26: - self.oldx = int(event.x) - self.oldy = int(event.y) - - self.desenha = True - + if self.tool == 'text': + self.d.text(widget,event) + if not self.selmove or self.tool != 'marquee-rectangular': + self.oldx = int(event.x) + self.oldy = int(event.y) + if self.selmove and self.tool != 'marquee-rectangular': #get out of the func selection + self.pixmap.draw_drawable(self.gc, self.pixmap_temp, 0,0,0,0, WIDTH, HEIGHT) + self.selmove = False + self.enableUndo(widget) + x , y, state = event.window.get_pointer() + if state & gtk.gdk.BUTTON3_MASK: + self.sel_get_out = True + self.pixmap_sel.draw_drawable(self.gc, self.pixmap_temp, 0,0,0,0, WIDTH, HEIGHT) + if state & gtk.gdk.BUTTON1_MASK: + self.pixmap_temp.draw_drawable(self.gc, self.pixmap, 0,0,0,0, WIDTH, HEIGHT) + widget.queue_draw() + self.desenha = True + + def mousemove(self,widget,event): """Make the Area object (GtkDrawingArea) recognize that the mouse is moving. @@ -181,54 +268,65 @@ class Area(gtk.DrawingArea): event -- GdkEvent """ - if self.busy == False: - x , y, state = event.window.get_pointer() - coords = int(x), int(y) - - if state & gtk.gdk.BUTTON1_MASK and self.pixmap != None: - if self.tool == 3: - self.d.eraser(widget, coords) - #brush - elif self.tool == 29: - self.d.brush(widget, coords, self.line_size, self.brush_shape) - if self.desenha: - # line - if self.tool == 1: - print self.oldx - self.configure_line(self.line_size) - self.d.line(widget, coords) - # pencil - elif self.tool == 2: - self.configure_line(self.line_size) - self.d.pencil(widget, coords) - # circle - elif self.tool == 5: - self.configure_line(self.line_size) - self.d.circle(widget,coords) - # square - elif self.tool == 6: - self.configure_line(self.line_size) - self.d.square(widget,coords) - # selection - elif self.tool == 26 and not self.move: - self.d.selection(widget,coords) - # selection - elif self.tool == 26 and self.move: - self.d.moveSelection(widget, coords) - #polygon - elif self.tool == 27: - self.configure_line(self.line_size) - self.d.polygon(widget, coords) - #triangle - elif self.tool == 30: - self.configure_line(self.line_size) - self.d.triangle(widget,coords) - #trapezoid - elif self.tool == 31: - self.configure_line(self.line_size) - self.d.trapezoid(widget,coords) - - def mouseup(self,widget,event): + x , y, state = event.window.get_pointer() + coords = int(x), int(y) + + if state & gtk.gdk.BUTTON1_MASK and self.pixmap != None: + #eraser + if self.tool == 'eraser': + self.d.eraser(widget, coords, self.line_size, self.eraser_shape) + #brush + elif self.tool == 'brush': + self.d.brush(widget, coords, self.line_size, self.brush_shape) + if self.desenha: + # line + if self.tool == 'line': + self.configure_line(self.line_size) + self.d.line(widget, coords) + # pencil + elif self.tool == 'pencil': + self.configure_line(self.line_size) + self.d.pencil(widget, coords) + # ellipse + elif self.tool == 'ellipse': + self.configure_line(self.line_size) + self.d.circle(widget,coords) + # rectangle + elif self.tool == 'rectangle': + self.configure_line(self.line_size) + self.d.square(widget,coords) + # selection + elif self.tool == 'marquee-rectangular' and not self.selmove: + self.d.selection(widget,coords) + # selection + elif self.tool == 'marquee-rectangular' and self.selmove: + self.d.moveSelection(widget, coords) + #polygon + elif self.tool == 'polygon': + self.configure_line(self.line_size) + self.d.polygon(widget, coords) + #triangle + elif self.tool == 'triangle': + self.configure_line(self.line_size) + self.d.triangle(widget,coords) + #trapezoid + elif self.tool == 'trapezoid': + self.configure_line(self.line_size) + self.d.trapezoid(widget,coords) + #arrow + elif self.tool == 'arrow': + self.configure_line(self.line_size) + self.d.arrow(widget,coords) + #parallelogram + elif self.tool == 'parallelogram': + self.configure_line(self.line_size) + self.d.parallelogram(widget,coords) + #star + elif self.tool == 'star': + self.configure_line(self.line_size) + self.d.star(widget,coords) + + def mouseup(self,widget,event): """Make the Area object (GtkDrawingArea) recognize that the mouse was released. Keyword arguments: @@ -237,106 +335,112 @@ class Area(gtk.DrawingArea): event -- GdkEvent """ - if self.busy == False: - if self.desenha == True: - # line - if self.tool == 1: - self.pixmap.draw_line(self.gc_line,self.oldx,self.oldy, int (event.x), int(event.y)) - widget.queue_draw() - self.enableUndo(widget) - # circle - elif self.tool == 5: - self.pixmap.draw_arc(self.gc, True, self.newx, self.newy, self.newx_, self.newy_, 0, 360*64) - self.pixmap.draw_arc(self.gc_line, False, self.newx, self.newy, self.newx_, self.newy_, 0, 360*64) - - widget.queue_draw() - self.enableUndo(widget) - # square - elif self.tool == 6: - self.pixmap.draw_rectangle(self.gc, True, self.newx,self.newy, self.newx_,self.newy_) - self.pixmap.draw_rectangle(self.gc_line, False, self.newx,self.newy, self.newx_,self.newy_) - - widget.queue_draw() - self.enableUndo(widget) - # selection - elif self.tool == 26: - if self.move == False: - self.pixmap_temp.draw_drawable(self.gc,self.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - self.move = True - self.sx = int (event.x) - self.sy = int(event.y) - self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.FLEUR)) - elif self.move == True: - self.pixmap.draw_drawable(self.gc, self.pixmap_temp, 0,0,0,0, WIDTH, HEIGHT) - # FIXME: Adicionar cursor formato selecao - self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.CROSSHAIR)) - self.move = False - self.enableUndo(widget) - # polygon - elif self.tool == 27: - if self.polygon_start: - self.enableUndo(widget) - self.pixmap.draw_line(self.gc_line,self.oldx,self.oldy, int (event.x), int( event.y )) - self.lastx = event.x - self.lasty = event.y - self.firstx = self.oldx - self.firsty = self.oldy - self.polygon_start = False - else: - self.dx = math.fabs(event.x - self.firstx) - self.dy = math.fabs(event.y - self.firsty) - if (self.dx < 20) & (self.dy < 20): - self.pixmap.draw_line(self.gc_line,int (self.firstx), int (self.firsty), int (self.lastx), int (self.lasty)) - self.polygon_start = True - self.undo_times -= 1#destroy the undo screen of polygon start - self.enableUndo(widget) - else: - self.pixmap.draw_line(self.gc_line,int (self.lastx),int (self.lasty), int (event.x), int( event.y )) - self.lastx = event.x - self.lasty = event.y - widget.queue_draw() - - elif self.tool == 2:# or 4 check this for desire tool - widget.queue_draw() - self.enableUndo(widget) - - #bucket - elif self.tool == 28: - # New algorithm. See Desenho.py - width, height = self.window.get_size() - self.busy = True - image = self.pixmap.get_image(0,0, width, height) - fill_image = self.d.fill(image, int(event.x), int(event.y), self.color_dec) - - self.pixmap.draw_image(self.gc, fill_image,0,0,0,0, width, height) - self.pixmap_temp.draw_image(self.gc, fill_image,0,0,0,0, width, height) - - del image - del fill_image - - widget.queue_draw() - self.busy = False + if self.desenha == True: + # line + if self.tool == 'line': + self.pixmap.draw_line(self.gc_line,self.oldx,self.oldy, int (event.x), int(event.y)) + widget.queue_draw() + self.enableUndo(widget) + # ellipse + elif self.tool == 'ellipse': + self.pixmap.draw_arc(self.gc, True, self.newx, self.newy, self.newx_, self.newy_, 0, 360*64) + self.pixmap.draw_arc(self.gc_line, False, self.newx, self.newy, self.newx_, self.newy_, 0, 360*64) + widget.queue_draw() + self.enableUndo(widget) + # rectangle + elif self.tool == 'rectangle': + self.pixmap.draw_rectangle(self.gc, True, self.newx,self.newy, self.newx_,self.newy_) + self.pixmap.draw_rectangle(self.gc_line, False, self.newx,self.newy, self.newx_,self.newy_) + widget.queue_draw() + self.enableUndo(widget) + # selection + elif self.tool == 'marquee-rectangular': + # FIXME: Adicionar cursor formato selecao + if self.selmove == False: + self.pixmap_temp.draw_drawable(self.gc,self.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + self.sx = int (event.x) + self.sy = int(event.y) + self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.FLEUR)) + self.selmove = True + self.sel_get_out = False + elif self.selmove and self.sel_get_out: #get out of the func selection + self.pixmap.draw_drawable(self.gc, self.pixmap_temp, 0,0,0,0, WIDTH, HEIGHT) + self.selmove = False + self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.TCROSS)) + self.oldx = event.x + self.oldy = event.y self.enableUndo(widget) - - elif self.tool == 30: - self.pixmap.draw_polygon(self.gc, True, self.d.points) - self.pixmap.draw_polygon(self.gc_line, False, self.d.points) - widget.queue_draw() + # polygon + elif self.tool == 'polygon': + if self.polygon_start: self.enableUndo(widget) + self.pixmap.draw_line(self.gc_line,self.oldx,self.oldy, int (event.x), int( event.y )) + self.lastx = event.x + self.lasty = event.y + self.firstx = self.oldx + self.firsty = self.oldy + self.polygon_start = False + else: + self.dx = math.fabs(event.x - self.firstx) + self.dy = math.fabs(event.y - self.firsty) + if (self.dx < 20) & (self.dy < 20): + self.pixmap.draw_line(self.gc_line,int (self.firstx), int (self.firsty), int (self.lastx), int (self.lasty)) + self.polygon_start = True + self.undo_times -= 1#destroy the undo screen of polygon start + self.enableUndo(widget) + else: + self.pixmap.draw_line(self.gc_line,int (self.lastx),int (self.lasty), int (event.x), int( event.y )) + self.lastx = event.x + self.lasty = event.y + widget.queue_draw() - elif self.tool == 31: - self.pixmap.draw_polygon(self.gc, True, self.d.points) - self.pixmap.draw_polygon(self.gc_line, False, self.d.points) - widget.queue_draw() - self.enableUndo(widget) - if self.tool == 29 or self.tool == 3: + elif self.tool == 'pencil': #to undo pencil widget.queue_draw() self.enableUndo(widget) - if self.tool == 4: - widget.queue_draw() + + #bucket + elif self.tool == 'bucket': + # New algorithm. See Desenho.py + width, height = self.window.get_size() + fill(self.pixmap, self.gc, int(event.x), int(event.y), width, height, self.color_dec) + widget.queue_draw() + self.enableUndo(widget) + + elif self.tool == 'triangle': + self.pixmap.draw_polygon(self.gc, True, self.d.points) + self.pixmap.draw_polygon(self.gc_line, False, self.d.points) + widget.queue_draw() + self.enableUndo(widget) + + elif self.tool == 'trapezoid': + self.pixmap.draw_polygon(self.gc, True, self.d.points) + self.pixmap.draw_polygon(self.gc_line, False, self.d.points) + widget.queue_draw() + self.enableUndo(widget) + + elif self.tool == 'arrow': + self.pixmap.draw_polygon(self.gc, True, self.d.points) + self.pixmap.draw_polygon(self.gc_line, False, self.d.points) + widget.queue_draw() + self.enableUndo(widget) + + elif self.tool == 'parallelogram': + self.pixmap.draw_polygon(self.gc, True, self.d.points) + self.pixmap.draw_polygon(self.gc_line, False, self.d.points) + widget.queue_draw() + self.enableUndo(widget) + + elif self.tool == 'star': + self.pixmap.draw_polygon(self.gc, True, self.d.points) + self.pixmap.draw_polygon(self.gc_line, False, self.d.points) + widget.queue_draw() self.enableUndo(widget) - self.desenha = False - + + if self.tool == 'brush' or self.tool == 'eraser': + widget.queue_draw() + self.enableUndo(widget) + self.desenha = False + #this func make a basic Undo def undo(self): @@ -349,7 +453,8 @@ class Area(gtk.DrawingArea): self.polygon_start = True if self.first_undo:#if is the first time you click on UNDO self.undo_times -= 1 - self.redo_times = 1 + if self.undo_times == 0: #to work when clear screen (bug fixed) + self.redo_times = 1 elif (self.first_redo) and (self.undo_times!=0): self.undo_times += 1 @@ -375,7 +480,7 @@ class Area(gtk.DrawingArea): #special case of func polygon - if self.tool == 27: + if self.tool == 'polygon': self.polygon_start = True #start the polygon again @@ -387,16 +492,15 @@ class Area(gtk.DrawingArea): """ #print "REDO no.%d" %(self.redo_times) + if self.first_redo: + self.undo_times -=1 + self.redo_times +=1 + self.first_redo=False if (self.redo_times>0): self.redo_times -= 1 self.undo_times += 1 - - if self.first_redo: - self.undo_times -=1 - self.redo_times +=1 - self.first_redo=False try: #to not try paint someting wrong #print "Drawing undo[%d]" %(self.undo_times) self.pixmap.draw_drawable(self.gc, self.undo_list[self.undo_times], 0,0,0,0, WIDTH, HEIGHT) @@ -418,7 +522,7 @@ class Area(gtk.DrawingArea): self.undo_times += 1 self.undo_list.append(None)#alloc memory - self.undo_list[self.undo_times] = gtk.gdk.Pixmap(widget.window, WIDTH, HEIGHT, -1) #define type + self.undo_list[self.undo_times] = gtk.gdk.Pixmap(widget.window, WIDTH, HEIGHT, -1) #define type self.undo_list[self.undo_times].draw_drawable(self.gc,self.pixmap,0,0,0,0, WIDTH, HEIGHT) #copy workarea self.undo_times += 1 self.redo_times = 0 @@ -435,26 +539,35 @@ class Area(gtk.DrawingArea): Keyword arguments: self -- the Area object (GtkDrawingArea) - color -- integer "enum" + color -- a gdk.Color object """ - self.color_ = color - self.gc.set_foreground(self.cores[color]) - - + #self.color_ = color + #self.gc.set_foreground(self.cores[color]) + self.gc.set_foreground(color) + + def _set_stroke_color(self, color): """Set stroke color. Keyword arguments: self -- the Area object (GtkDrawingArea) - color -- integer "enum" + color -- a gdk.Color object """ - self.color_line = color + ''' + self.color_line = color self.gc_line.set_foreground(self.cores[color]) self.gc_line.set_line_attributes(1, gtk.gdk.LINE_ON_OFF_DASH, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_ROUND) self.gc_brush.set_foreground(self.cores[color]) self.color_dec = self.cores[color].pixel + ''' + + #self.color_line = color + self.gc_line.set_foreground(color) + self.gc_line.set_line_attributes(1, gtk.gdk.LINE_ON_OFF_DASH, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_ROUND) + self.gc_brush.set_foreground(color) + self.color_dec = color.pixel def _set_grayscale(self,widget): """Apply grayscale effect. @@ -464,10 +577,10 @@ class Area(gtk.DrawingArea): """ pix = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, WIDTH, HEIGHT) - pix_ = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, WIDTH, HEIGHT) + pix_ = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, WIDTH, HEIGHT) pix.get_from_drawable(self.pixmap, gtk.gdk.colormap_get_system(), 0, 0, 0, 0, WIDTH, HEIGHT) pix.saturate_and_pixelate(pix_, 0 ,0) - + self.pixmap.draw_pixbuf(self.gc, pix_, 0, 0, 0, 0, WIDTH, HEIGHT, dither=gtk.gdk.RGB_DITHER_NORMAL, x_dither=0, y_dither=0) self.pixmap_temp.draw_pixbuf(self.gc, pix_, 0, 0, 0, 0, WIDTH, HEIGHT, dither=gtk.gdk.RGB_DITHER_NORMAL, x_dither=0, y_dither=0) diff --git a/Botao.py b/Botao.py deleted file mode 100644 index de4d5c4..0000000 --- a/Botao.py +++ /dev/null @@ -1,105 +0,0 @@ -import pygtk -pygtk.require('2.0') -import gtk -from gtk import gdk - - -class Botao: - def __init__(self, area): - """Initialize the Botao object. - - Keyword arguments: - self -- Botao.Botao instance - area -- gtk.Fixed object - - """ - self.area = area - self.botoes = [] - self.id = 0 - self.desenha = False - self.local = 0,0 - self.tooltip = gtk.Tooltips() - - def adicionaBotao(self, archive, tipo, x, y, mousedown, tooltip_): - """Add button. - - Keyword arguments: - self -- Botao.Botao instance - archive -- button icon (image file) - tipo -- integer "enum" - x -- integer (horizontal position) - y -- integer (vertical position) - mousedown -- method Oficina.mousedown of Oficina.Oficina instance - tooltip_ -- string (name of the button) - - """ - img = gtk.Image() - img.set_from_file("./images/" + archive) - - eventbox = gtk.EventBox() - eventbox.add(img) - #eventbox.set_visible_window(False) - eventbox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white")) - - eventbox.set_events(gtk.gdk.POINTER_MOTION_MASK | - gtk.gdk.POINTER_MOTION_HINT_MASK | - gtk.gdk.BUTTON_PRESS_MASK | - gtk.gdk.BUTTON_RELEASE_MASK) - - eventbox.connect("motion_notify_event", self.mousemove,self.id) - eventbox.connect("button_release_event", self.mouseup) - eventbox.connect("button_press_event", self.mousedown, self.id) - eventbox.connect("button_press_event", mousedown, tipo) - # Drag'n'drop - self.area.put(eventbox, x, y) - self.botoes.append(eventbox) - self.id += 1 - - self.tooltip.set_tip(eventbox, tooltip_, None) - #self.tooltip.enable() - - def mousedown(self,widget,event, id): - """Recognize that the mouse was pressed in one of the buttons. - - Keyword arguments: - self -- Botao.Botao instance - widget -- gtk.EventBox - event -- GdkEvent - id -- integer "enum" - - """ - self.desenha = True - ex = event.x - ey = event.y - self.local = ex, ey - - def mouseup(self,widget,event): - """Recognize that the mouse was released in one of the buttons. - - Keyword arguments: - self -- Botao.Botao instance - widget -- gtk.EventBox - event -- GdkEvent - - """ - self.desenha = False - - def mousemove(self,widget,event, id): - """Recognize that the mouse was moved. - - Keyword arguments: - self -- Botao.Botao instance - widget -- gtk.EventBox - event -- GdkEvent - id -- integer "enum" - - """ - x , y, state = self.area.window.get_pointer() - ex, ey = self.local - x_ = int(x - ex) - y_ = int(y - ey) - if state & gtk.gdk.BUTTON1_MASK and self.desenha: - self.area.move(self.botoes[id], x_, y_) - - - diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..fa12d2a --- /dev/null +++ b/COPYING @@ -0,0 +1,343 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software + interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Program does not specify a +version number of this License, you may choose any version ever +published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Cursores.py b/Cursores.py deleted file mode 100644 index 82fef79..0000000 --- a/Cursores.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -import pygtk -pygtk.require('2.0') -import gtk -from gtk import gdk - -class Cursores: - def __init__(self, archive): - """Initialize Cursores object. - - Keyword arguments: - self -- Cursores.Cursores instance - archive -- - - """ - color = gtk.gdk.Color() - pix = gtk.gdk.pixbuf_new_from_file("./images/" + archive) - self.cursor_ = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - def cursor(self): - """Return self.cursor_. - - Keyword arguments: - self -- Cursores.Cursores instance - - """ - return self.cursor_ - - diff --git a/Cursors.py b/Cursors.py deleted file mode 100644 index d501b1d..0000000 --- a/Cursors.py +++ /dev/null @@ -1,28 +0,0 @@ -import pygtk -pygtk.require('2.0') -import gtk -from gtk import gdk - -class Cursors: - def __init__(self, archive): - """Initialize Cursors object. - - Keyword arguments: - self -- Cursors.Cursors instance - archive -- - - """ - color = gtk.gdk.Color() - pix = gtk.gdk.pixbuf_new_from_file("./images/" + archive) - self._cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - def cursor(self): - """Return self._cursor. - - Keyword arguments: - self -- Cursors.Cursors instance - - """ - return self._cursor - - diff --git a/Desenho.py b/Desenho.py index 8e5072f..b564143 100644 --- a/Desenho.py +++ b/Desenho.py @@ -1,17 +1,71 @@ # -*- coding: utf-8 -*- -import pygtk -pygtk.require('2.0') -import gtk -import sys, gobject, socket -from gtk import gdk -import math -import pango - - -WIDTH = 1195 -HEIGHT = 800 - -class Desenho: +""" +Desenho.py + +Pixmap manipulation + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +Colaborators: +Bruno Gola (brunogola@gmail.com) + +Group Manager: +Irene Karaguilla Ficheman (irene@lsi.usp.br) + +Cientific Coordinator: +Roseli de Deus Lopes (roseli@lsi.usp.br) + +""" + + +import pygtk +pygtk.require('2.0') +import gtk +import sys, gobject, socket +from gtk import gdk +import math +import pango + + +WIDTH = 1195 +HEIGHT = 800 + +class Desenho: def __init__(self, d_): """Initialize Desenho object. @@ -19,9 +73,9 @@ class Desenho: self -- Desenho.Desenho instance d_ -- Area object (GtkDrawingArea) - """ + """ self.d = d_ - + def line(self, widget, coords): """Draw line. @@ -30,13 +84,13 @@ class Desenho: widget -- Area object (GtkDrawingArea) coords -- Two value tuple - """ - self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - self.d.pixmap_temp.draw_line(self.d.gc_line,self.d.oldx,self.d.oldy,coords[0],coords[1]) - self.d.newx = coords[0] - self.d.newy = coords[1] - widget.queue_draw() - + """ + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + self.d.pixmap_temp.draw_line(self.d.gc_line,self.d.oldx,self.d.oldy,coords[0],coords[1]) + self.d.newx = coords[0] + self.d.newy = coords[1] + widget.queue_draw() + def eraser(self, widget, coords, size = 30, shape = 'circle'): """Erase part of the drawing. @@ -47,16 +101,16 @@ class Desenho: size -- integer (default 30) shape -- string (default 'circle') - """ + """ self.d.desenha = False - if(shape == 'circle'): - self.d.pixmap.draw_arc(self.d.gc_eraser, True, coords[0], coords[1], size, size, 0, 360*64) + if(shape == 'circle'): + self.d.pixmap.draw_arc(self.d.gc_eraser, True, coords[0], coords[1], size, size, 0, 360*64) self.d.pixmap_temp.draw_arc(self.d.gc_eraser, True, coords[0], coords[1], size, size, 0, 360*64) if(shape == 'square'): - self.d.pixmap.draw_rectangle(self.d.gc_borracha, True, coords[0], coords[1], size, size) - self.d.pixmap_temp.draw_rectangle(self.d.gc_borracha, True, coords[0], coords[1], size, size) - self.d.oldx = coords[0] - self.d.oldy = coords[1] + self.d.pixmap.draw_rectangle(self.d.gc_eraser, True, coords[0], coords[1], size, size) + self.d.pixmap_temp.draw_rectangle(self.d.gc_eraser, True, coords[0], coords[1], size, size) + self.d.oldx = coords[0] + self.d.oldy = coords[1] widget.queue_draw() def brush(self, widget, coords, size = 5, shape = 'circle'): @@ -69,17 +123,17 @@ class Desenho: size -- integer (default 30) shape -- string (default 'circle') - """ + """ self.d.desenha = False - if(shape == 'circle'): - self.d.pixmap.draw_arc(self.d.gc_brush, True, coords[0], coords[1], size, size, 0, 360*64) + if(shape == 'circle'): + self.d.pixmap.draw_arc(self.d.gc_brush, True, coords[0], coords[1], size, size, 0, 360*64) self.d.pixmap_temp.draw_arc(self.d.gc_brush, True, coords[0], coords[1], size, size, 0, 360*64) if(shape == 'square'): self.d.pixmap.draw_rectangle(self.d.gc_brush, True, coords[0], coords[1], size, size) - self.d.pixmap_temp.draw_rectangle(self.d.gc_brush, True, coords[0], coords[1], size, size) - self.d.oldx = coords[0] - self.d.oldy = coords[1] - widget.queue_draw() + self.d.pixmap_temp.draw_rectangle(self.d.gc_brush, True, coords[0], coords[1], size, size) + self.d.oldx = coords[0] + self.d.oldy = coords[1] + widget.queue_draw() def square(self, widget, coords): """Draw a square. @@ -89,44 +143,44 @@ class Desenho: widget -- Area object (GtkDrawingArea) coords -- Two value tuple - """ - widget.queue_draw() - - if coords[0] > WIDTH: - coords0 = WIDTH - else: - coords0 = coords[0] - - if coords [1] > HEIGHT: - coords1 = HEIGHT - else: - coords1 = coords[1] - - self.d.newx_ = coords0 - self.d.oldx - self.d.newy_ = coords1 - self.d.oldy - - if self.d.newx_ >= 0: - self.d.newx = self.d.oldx - else: - if coords0 > 0: - self.d.newx = coords0 - self.d.newx_ = - self.d.newx_ - else: - self.d.newx = 0 - self.d.newx_ = self.d.oldx - - if self.d.newy_ >= 0: - self.d.newy = self.d.oldy - else: - if coords1 > 0: - self.d.newy_ = - self.d.newy_ - self.d.newy = coords1 - else: - self.d.newy = 0 - self.d.newy_ = self.d.oldy - - self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - self.d.pixmap_temp.draw_rectangle(self.d.gc, True ,self.d.newx,self.d.newy,self.d.newx_,self.d.newy_) + """ + widget.queue_draw() + + if coords[0] > WIDTH: + coords0 = WIDTH + else: + coords0 = coords[0] + + if coords [1] > HEIGHT: + coords1 = HEIGHT + else: + coords1 = coords[1] + + self.d.newx_ = coords0 - self.d.oldx + self.d.newy_ = coords1 - self.d.oldy + + if self.d.newx_ >= 0: + self.d.newx = self.d.oldx + else: + if coords0 > 0: + self.d.newx = coords0 + self.d.newx_ = - self.d.newx_ + else: + self.d.newx = 0 + self.d.newx_ = self.d.oldx + + if self.d.newy_ >= 0: + self.d.newy = self.d.oldy + else: + if coords1 > 0: + self.d.newy_ = - self.d.newy_ + self.d.newy = coords1 + else: + self.d.newy = 0 + self.d.newy_ = self.d.oldy + + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + self.d.pixmap_temp.draw_rectangle(self.d.gc, True ,self.d.newx,self.d.newy,self.d.newx_,self.d.newy_) self.d.pixmap_temp.draw_rectangle(self.d.gc_line, False ,self.d.newx,self.d.newy,self.d.newx_,self.d.newy_) @@ -138,28 +192,28 @@ class Desenho: widget -- Area object (GtkDrawingArea) coords -- Two value tuple - """ - widget.queue_draw() - - if coords[0] > WIDTH: - coords0 = WIDTH - else: - coords0 = coords[0] - - if coords [1] > HEIGHT: - coords1 = HEIGHT - else: + """ + widget.queue_draw() + + if coords[0] > WIDTH: + coords0 = WIDTH + else: + coords0 = coords[0] + + if coords [1] > HEIGHT: + coords1 = HEIGHT + else: coords1 = coords[1] if coords0 < 0: coords0 = 0 if coords1 < 0: - coords1 = 0 + coords1 = 0 - self.points = [(self.d.oldx, self.d.oldy), (self.d.oldx+int((coords0-self.d.oldx)/2), coords1), (coords0,self.d.oldy)] + self.points = [(self.d.oldx, self.d.oldy), (self.d.oldx+int((coords0-self.d.oldx)/2), coords1), (coords0,self.d.oldy)] self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - self.d.pixmap_temp.draw_polygon(self.d.gc, True, self.points) + self.d.pixmap_temp.draw_polygon(self.d.gc, True, self.points) self.d.pixmap_temp.draw_polygon(self.d.gc_line, False, self.points) def trapezoid(self, widget, coords): @@ -170,29 +224,137 @@ class Desenho: widget -- Area object (GtkDrawingArea) coords -- Two value tuple - """ - widget.queue_draw() - - if coords[0] > WIDTH: - coords0 = WIDTH - else: - coords0 = coords[0] - - if coords[1] > HEIGHT: - coords1 = HEIGHT - else: + """ + widget.queue_draw() + + if coords[0] > WIDTH: + coords0 = WIDTH + else: + coords0 = coords[0] + + if coords[1] > HEIGHT: + coords1 = HEIGHT + else: coords1 = coords[1] if coords0 < 0: coords0 = 0 if coords1 < 0: - coords1 = 0 + coords1 = 0 dif = int((coords0 - self.d.oldx)/4) - self.points = [(self.d.oldx, self.d.oldy), (self.d.oldx+dif, coords1), (coords0-dif, coords1) , (coords0,self.d.oldy)] + self.points = [(self.d.oldx, self.d.oldy), (self.d.oldx+dif, coords1), (coords0-dif, coords1) , (coords0,self.d.oldy)] + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + self.d.pixmap_temp.draw_polygon(self.d.gc, True, self.points) + self.d.pixmap_temp.draw_polygon(self.d.gc_line, False, self.points) + + def arrow(self, widget, coords): + """Draw a arrow. + + Keyword arguments: + self -- Desenho.Desenho instance + widget -- Area object (GtkDrawingArea) + coords -- Two value tuple + + """ + widget.queue_draw() + + if coords[0] > WIDTH: + coords0 = WIDTH + else: + coords0 = coords[0] + + if coords [1] > HEIGHT: + coords1 = HEIGHT + else: + coords1 = coords[1] + + if coords0 < 0: + coords0 = 0 + + if coords1 < 0: + coords1 = 0 + self.width = coords0 - self.d.oldx + self.height = coords1 - self.d.oldy + self.points = [(self.d.oldx,self.d.oldy), (self.d.oldx+int(self.width/6),coords1), (self.d.oldx+int(self.width/6),self.d.oldy+int(self.height/3)), (coords0,self.d.oldy+int(self.height/3)), (coords0,self.d.oldy-int(self.height/3)), (self.d.oldx+int(self.width/6),self.d.oldy-int(self.height/3)), (self.d.oldx+int(self.width/6),self.d.oldy-self.height)] + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + self.d.pixmap_temp.draw_polygon(self.d.gc, True, self.points) + self.d.pixmap_temp.draw_polygon(self.d.gc_line, False, self.points) + + def parallelogram(self, widget, coords): + """Draw a parallelogram. + + Keyword arguments: + self -- Desenho.Desenho instance + widget -- Area object (GtkDrawingArea) + coords -- Two value tuple + + """ + widget.queue_draw() + + if coords[0] > WIDTH: + coords0 = WIDTH + else: + coords0 = coords[0] + + if coords[1] > HEIGHT: + coords1 = HEIGHT + else: + coords1 = coords[1] + + if coords0 < 0: + coords0 = 0 + + if coords1 < 0: + coords1 = 0 + + self.width = int((coords0 - self.d.oldx)/4) + self.points = [(self.d.oldx,self.d.oldy), (coords0-self.width, self.d.oldy), (coords0,coords1), (self.d.oldx+self.width,coords1)] + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + self.d.pixmap_temp.draw_polygon(self.d.gc, True, self.points) + self.d.pixmap_temp.draw_polygon(self.d.gc_line, False, self.points) + + def star(self, widget, coords): + """Draw a arrow. + + Keyword arguments: + self -- Desenho.Desenho instance + widget -- Area object (GtkDrawingArea) + coords -- Two value tuple + + """ + widget.queue_draw() + + if coords[0] > WIDTH: + coords0 = WIDTH + else: + coords0 = coords[0] + + if coords [1] > HEIGHT: + coords1 = HEIGHT + else: + coords1 = coords[1] + + if coords0 < 0: + coords0 = 0 + + if coords1 < 0: + coords1 = 0 + self.width = coords0 - self.d.oldx + self.height = coords1 - self.d.oldy + self.points = [(self.d.oldx,self.d.oldy),\ +(self.d.oldx+int(self.width*0.25), self.d.oldy+int(self.height*0.4)),\ +(self.d.oldx+int(self.width),self.d.oldy+int(self.height*0.4)),\ +(self.d.oldx+int(self.width*0.35), self.d.oldy+int(self.height*0.6)),\ +(self.d.oldx+int(self.width*0.6), self.d.oldy+self.height),\ +(self.d.oldx, self.d.oldy+int(self.height*0.75)),\ +(self.d.oldx-int(self.width*0.6), self.d.oldy+self.height),\ +(self.d.oldx-int(self.width*0.35), self.d.oldy+int(self.height*0.6)),\ +(self.d.oldx-int(self.width),self.d.oldy+int(self.height*0.4)),\ +(self.d.oldx-int(self.width*0.25), self.d.oldy+int(self.height*0.4))] self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - self.d.pixmap_temp.draw_polygon(self.d.gc, True, self.points) + self.d.pixmap_temp.draw_polygon(self.d.gc, True, self.points) self.d.pixmap_temp.draw_polygon(self.d.gc_line, False, self.points) @@ -204,44 +366,44 @@ class Desenho: widget -- Area object (GtkDrawingArea) coords -- Two value tuple - """ - widget.queue_draw() - - if coords[0] > WIDTH: - coords0 = WIDTH - else: - coords0 = coords[0] - - if coords [1] > HEIGHT: - coords1 = HEIGHT - else: - coords1 = coords[1] - - self.d.newx_ = coords0 - self.d.oldx - self.d.newy_ = coords1 - self.d.oldy - - if self.d.newx_ >= 0: - self.d.newx = self.d.oldx - else: - if coords0 > 0: - self.d.newx = coords0 - self.d.newx_ = - self.d.newx_ - else: - self.d.newx = 0 - self.d.newx_ = self.d.oldx - - if self.d.newy_ >= 0: - self.d.newy = self.d.oldy - else: - if coords1 > 0: - self.d.newy_ = - self.d.newy_ - self.d.newy = coords1 - else: - self.d.newy = 0 - self.d.newy_ = self.d.oldy - - self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - self.d.pixmap_temp.draw_rectangle(self.d.gc_selection, False ,self.d.newx,self.d.newy,self.d.newx_,self.d.newy_) + """ + widget.queue_draw() + + if coords[0] > WIDTH: + coords0 = WIDTH + else: + coords0 = coords[0] + + if coords [1] > HEIGHT: + coords1 = HEIGHT + else: + coords1 = coords[1] + + self.d.newx_ = coords0 - self.d.oldx + self.d.newy_ = coords1 - self.d.oldy + + if self.d.newx_ >= 0: + self.d.newx = self.d.oldx + else: + if coords0 > 0: + self.d.newx = coords0 + self.d.newx_ = - self.d.newx_ + else: + self.d.newx = 0 + self.d.newx_ = self.d.oldx + + if self.d.newy_ >= 0: + self.d.newy = self.d.oldy + else: + if coords1 > 0: + self.d.newy_ = - self.d.newy_ + self.d.newy = coords1 + else: + self.d.newy = 0 + self.d.newy_ = self.d.oldy + + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + self.d.pixmap_temp.draw_rectangle(self.d.gc_selection, False ,self.d.newx,self.d.newy,self.d.newx_,self.d.newy_) def circle(self, widget, coords): @@ -252,48 +414,48 @@ class Desenho: widget -- Area object (GtkDrawingArea) coords -- Two value tuple - """ - widget.queue_draw() - - if coords[0] > WIDTH: - coords0 = WIDTH - else: - coords0 = coords[0] - - if coords [1] > HEIGHT: - coords1 = HEIGHT - else: - coords1 = coords[1] - - self.d.newx_ = coords0 - self.d.oldx - self.d.newy_ = coords1 - self.d.oldy - print "coords0", coords0 - - if self.d.newx_ >= 0: - self.d.newx = self.d.oldx - else: - if coords0 > 0: - self.d.newx = coords0 - self.d.newx_ = - self.d.newx_ - else: - self.d.newx = 0 - self.d.newx_ = self.d.oldx - - if self.d.newy_ >= 0: - self.d.newy = self.d.oldy - else: - if coords1 > 0: - self.d.newy = coords1 - self.d.newy_ = - self.d.newy_ - else: - self.d.newy = 0 - self.d.newy_ = self.d.oldy - - self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - self.d.pixmap_temp.draw_arc(self.d.gc, True, self.d.newx, self.d.newy, self.d.newx_,self.d.newy_, 0, 360*64) + """ + widget.queue_draw() + + if coords[0] > WIDTH: + coords0 = WIDTH + else: + coords0 = coords[0] + + if coords [1] > HEIGHT: + coords1 = HEIGHT + else: + coords1 = coords[1] + + self.d.newx_ = coords0 - self.d.oldx + self.d.newy_ = coords1 - self.d.oldy + print "coords0", coords0 + + if self.d.newx_ >= 0: + self.d.newx = self.d.oldx + else: + if coords0 > 0: + self.d.newx = coords0 + self.d.newx_ = - self.d.newx_ + else: + self.d.newx = 0 + self.d.newx_ = self.d.oldx + + if self.d.newy_ >= 0: + self.d.newy = self.d.oldy + else: + if coords1 > 0: + self.d.newy = coords1 + self.d.newy_ = - self.d.newy_ + else: + self.d.newy = 0 + self.d.newy_ = self.d.oldy + + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + self.d.pixmap_temp.draw_arc(self.d.gc, True, self.d.newx, self.d.newy, self.d.newx_,self.d.newy_, 0, 360*64) self.d.pixmap_temp.draw_arc(self.d.gc_line, False, self.d.newx, self.d.newy, self.d.newx_, self.d.newy_, 0, 360*64) - - + + def pencil(self, widget, coords): """Draw a pencil. @@ -303,11 +465,11 @@ class Desenho: coords -- Two value tuple """ - self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - self.d.pixmap.draw_line(self.d.gc_line,self.d.oldx,self.d.oldy,coords[0],coords[1]) - self.d.oldx = coords[0] - self.d.oldy = coords[1] - widget.queue_draw() + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + self.d.pixmap.draw_line(self.d.gc_line,self.d.oldx,self.d.oldy,coords[0],coords[1]) + self.d.oldx = coords[0] + self.d.oldy = coords[1] + widget.queue_draw() def clear(self): """Clear the drawing. @@ -315,12 +477,12 @@ class Desenho: Keyword arguments: self -- Desenho.Desenho instance - """ - self.d.desenho = [] - self.d.textos = [] - self.d.pixmap.draw_rectangle(self.d.get_style().white_gc, True,0, 0, WIDTH, HEIGHT) - self.d.pixmap_temp.draw_rectangle(self.d.get_style().white_gc, True,0, 0, WIDTH, HEIGHT) - self.d.queue_draw() + """ + self.d.desenho = [] + self.d.textos = [] + self.d.pixmap.draw_rectangle(self.d.get_style().white_gc, True,0, 0, WIDTH, HEIGHT) + self.d.pixmap_temp.draw_rectangle(self.d.get_style().white_gc, True,0, 0, WIDTH, HEIGHT) + self.d.queue_draw() def text(self,widget,event): """Make a selection. @@ -330,37 +492,42 @@ class Desenho: widget -- Area object (GtkDrawingArea) event -- GdkEvent - """ - if self.d.estadoTexto == 0: - self.d.estadoTexto = 1 - print event.x - self.d.janela._fixed.move(self.d.janela._textview, int(event.x)+200, int(event.y)+100) - self.d.janela._textview.show() - else: + """ + if self.d.estadoTexto == 0: + self.d.estadoTexto = 1 + print event.x + self.d.janela._fixed.move(self.d.janela._textview, int(event.x)+200, int(event.y)+100) + self.d.janela._textview.show() + else: self.d.estadoTexto = 0 - texto = self.d.janela._textview.get_text() - layout = self.d.create_pango_layout(texto) + texto = self.d.janela._textview.get_text() + layout = self.d.create_pango_layout(texto) layout.set_font_description(self.d.font) - self.d.pixmap.draw_layout(self.d.gc, self.d.oldx, self.d.oldy, layout) - self.d.pixmap_temp.draw_layout(self.d.gc, self.d.oldx, self.d.oldy, layout) + self.d.pixmap.draw_layout(self.d.gc, self.d.oldx, self.d.oldy, layout) + self.d.pixmap_temp.draw_layout(self.d.gc, self.d.oldx, self.d.oldy, layout) self.d.janela._textview.hide() - self.d.janela._textview.set_text('') - - widget.queue_draw() - - def loadImage(self, name): + self.d.janela._textview.set_text('') + + self.d.enableUndo(widget) + + widget.queue_draw() + + def loadImage(self, name, widget): """Load an image. Keyword arguments: self -- Desenho.Desenho instance name -- string (image file path) - """ - pixbuf = gtk.gdk.pixbuf_new_from_file(name) + """ + pixbuf = gtk.gdk.pixbuf_new_from_file(name) self.d.pixmap.draw_pixbuf(self.d.gc, pixbuf, 0, 0, 0, 0, width=-1, height=-1, dither=gtk.gdk.RGB_DITHER_NORMAL, x_dither=0, y_dither=0) - self.d.pixmap_temp.draw_pixbuf(self.d.gc, pixbuf, 0, 0, 0, 0, width=-1, height=-1, dither=gtk.gdk.RGB_DITHER_NORMAL, x_dither=0, y_dither=0) - self.d.queue_draw() - + self.d.pixmap_temp.draw_pixbuf(self.d.gc, pixbuf, 0, 0, 0, 0, width=-1, height=-1, dither=gtk.gdk.RGB_DITHER_NORMAL, x_dither=0, y_dither=0) + + self.d.enableUndo(widget) + + self.d.queue_draw() + def moveSelection(self, widget, coords): """Move the selection. @@ -369,31 +536,40 @@ class Desenho: widget -- Area object (GtkDrawingArea) coords -- Two value tuple - """ - self.d.pixmap_temp.draw_rectangle(self.d.get_style().white_gc, True,0, 0, WIDTH, HEIGHT) - self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - - if self.d.sx > self.d.oldx: - x0 = self.d.oldx - else: - x0 = self.d.sx - - if self.d.sy > self.d.oldy: - x1 = self.d.oldy - else: - x1 = self.d.sy - - w = self.d.sx - self.d.oldx - if w < 0: - w = - w - - h = self.d.sy - self.d.oldy - if h < 0: - h = - h - - self.d.pixmap_temp.draw_rectangle(self.d.get_style().white_gc, True, x0, x1, w, h) - self.d.pixmap_temp.draw_drawable(self.d.gc, self.d.pixmap, x0, x1, coords[0] - w/2, coords[1]- h/2, w, h) - widget.queue_draw() + """ + self.d.pixmap_temp.draw_rectangle(self.d.get_style().white_gc, True,0, 0, WIDTH, HEIGHT) + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + + self.d.pixmap_sel.draw_rectangle(self.d.get_style().white_gc, True,0, 0, WIDTH, HEIGHT) + self.d.pixmap_sel.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + + if self.d.sx > self.d.oldx: + x0 = self.d.oldx + else: + x0 = self.d.sx + + if self.d.sy > self.d.oldy: + x1 = self.d.oldy + else: + x1 = self.d.sy + + w = self.d.sx - self.d.oldx + if w < 0: + w = - w + + h = self.d.sy - self.d.oldy + if h < 0: + h = - h + + self.d.pixmap_temp.draw_rectangle(self.d.get_style().white_gc, True, x0, x1, w, h) + self.d.pixmap_temp.draw_drawable(self.d.gc, self.d.pixmap, x0, x1, coords[0] - w/2, coords[1]- h/2, w, h) + + self.d.pixmap_sel.draw_rectangle(self.d.get_style().white_gc, True, x0, x1, w, h) + self.d.pixmap_sel.draw_drawable(self.d.gc, self.d.pixmap, x0, x1, coords[0] - w/2, coords[1]- h/2, w, h) + #to draw the selection green line rectangle + self.d.pixmap_sel.draw_rectangle(self.d.gc_selection, False ,coords[0] - w/2, coords[1]- h/2, w, h) + + widget.queue_draw() def polygon(self, widget, coords): """Draw polygon. @@ -403,14 +579,14 @@ class Desenho: widget -- Area object (GtkDrawingArea) coords -- Two value tuple - """ - self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) - if self.d.polygon_start: - self.d.pixmap_temp.draw_line(self.d.gc_line,self.d.oldx,self.d.oldy,coords[0],coords[1]) - else: - self.d.pixmap_temp.draw_line(self.d.gc_line,int (self.d.lastx), int (self.d.lasty),coords[0],coords[1]) - self.d.newx = coords[0] - self.d.newy = coords[1] + """ + self.d.pixmap_temp.draw_drawable(self.d.gc,self.d.pixmap, 0 , 0 ,0,0, WIDTH, HEIGHT) + if self.d.polygon_start: + self.d.pixmap_temp.draw_line(self.d.gc_line,self.d.oldx,self.d.oldy,coords[0],coords[1]) + else: + self.d.pixmap_temp.draw_line(self.d.gc_line,int (self.d.lastx), int (self.d.lasty),coords[0],coords[1]) + self.d.newx = coords[0] + self.d.newy = coords[1] widget.queue_draw() @@ -449,5 +625,5 @@ class Desenho: newedge.append((s, t)) edge = newedge - return image - + return image + diff --git a/Main.py b/Main.py deleted file mode 100644 index 5dafb95..0000000 --- a/Main.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/env python -import pygtk -pygtk.require('2.0') -import sys,gtk,gobject,random,socket,select -import threading -import math -import pango -from gtk import gdk - -from Oficina import Oficina - -def main(): - """Run the program. - """ - oficina = Oficina() - gtk.main() - -if __name__ == "__main__": - main() - diff --git a/NEWS b/NEWS index 1dae861..dcac8d6 100755 --- a/NEWS +++ b/NEWS @@ -1,3 +1,24 @@ +4 +=== +Fixed bug with pixmap_temp +New FILL fuction, linked to C module (pekayatt) +Color list in Area.py is not used anymore. Toolbox.py now passes a gdk.Color (nathalia.sautchuk, alexandre) +Fixed Cursors errors (nathalia.sautchuk) +Fixed Image load bug, now enableUndo is working with it (pekayatt) +Added COPYING (alexandre) +Fixed bug that corrupted colors in toolbox.py (alexandre) +Adding file header and cleaning unused files (nathalia.sautchuk) +Tools assigned by string instead of numbers (nathalia.sautchuk) +Changing and Adding new colors (nathalia.sautchuk) +ToolsToolbar now keeps color and size when user chooses different tools (alexandre) +Adding new cursors (nathalia.sautchuk) +New selection, the selectionbox remains (pekayatt) +Fixed line size (nathalia.sautchuk, alexandre) +Implemented Eraser shapes (nathalia.sautchuk) +Fixed undo bugs and new selection function (pekayatt) +Trapezoid and triangle functions added, minor changes on fill function, bug on fuction undo solved (andre) +Fill function changed (alexandre) + 3 === Addition of a new SVG Icon with fixes to some bugs. Project name changed from Oficina to Paint @@ -8,5 +29,5 @@ Make it work with python setup.py: John Palmeiri and Manusheel Gupta 1 === -First Sugar Version: joyce, andremossinato, pekayatt, barbolo, nathalia.sautchuk, alexandremartinazzo from LSI Research Group, University of Sau Paulo,Brazil with manusheel gupta(manu@laptop.org) from OLPC, Cambridge +First Sugar Version: joyce, andremossinato, pekayatt, barbolo, nathalia.sautchuk, alexandremartinazzo from LSI Research Group, University of Sau Paulo,Brazil with manusheel gupta(manu@laptop.org) and Eben Eliason(eben@laptop.org)from OLPC, Cambridge diff --git a/Oficina.py b/Oficina.py deleted file mode 100644 index d50ae5d..0000000 --- a/Oficina.py +++ /dev/null @@ -1,254 +0,0 @@ -import pygtk -pygtk.require('2.0') -import gtk -from gtk import gdk -import os - -from Cursors import Cursores -from Botao import Botao -from Area import Area - -DRAW_WIDTH = 1200 -DRAW_HEIGHT = 800 - -class Oficina: - def __init__(self): - """Initialize the Oficina object. - - Keyword arguments: - self -- Oficina.Oficina instance - - """ - #self.window = gtk.Window() - - #self.areaFixa = gtk.Fixed() - #self.areaFixa.set_size_request(DRAW_WIDTH, DRAW_HEIGHT) - - # cor de fundo da janela - #color = gtk.gdk.color_parse("white") - #self.window.modify_bg(gtk.STATE_NORMAL, color) - - # imagem de fundo - #self.fundo = gtk.Image() - #self.fundo.set_from_file('fundo.png') - #self.areaFixa.put(self.fundo, 0, 0) - - # cursores - self.cursorLapis = Cursores('lapis_cursor.png') - self.cursorCirculo = Cursores('circulo_cursor.png') - self.cursorBorracha = Cursores('borracha_cursor.png') - self.cursorQuadrado = Cursores('quadrado_cursor.png') - self.cursorLinha = Cursores('linha_cursor.png') - self.cursorLetra = Cursores('letra_cursor.png') - self.cursorSelecao = Cursores('selecao_cursor.png') - self.cursorPoligono = Cursores('poligono_cursor.png') - self.cursorMove = Cursores('move_cursor.png') - - self.area = Area(self) - self.area.ferramenta = 2 - #self.areaFixa.put(self.area,0,0) - - # botoes de evento - # ferramentas - - botao = Botao(self.areaFixa) - botao.adicionaBotao('corlinha.png',-1,15,10,self.mousedown, "Cor Linha") - botao.adicionaBotao('balde.png',-2,15,40,self.mousedown, "Balde") - - botao.adicionaBotao('linha.png',1,15,100,self.mousedown, "Linha") - botao.adicionaBotao('lapis.png',2,130,110,self.mousedown, "Lapis") - botao.adicionaBotao('borracha.png',3,90,180,self.mousedown, "Borracha") - botao.adicionaBotao('letra.png',4,50,220,self.mousedown, "Letra") - botao.adicionaBotao('circulo.png',5,25,270,self.mousedown, "Circulo") - botao.adicionaBotao('quadrado.png',6,20,320,self.mousedown, "Quadrado") - botao.adicionaBotao('vassoura.png',7,20,360,self.mousedown, "Vassoura") - # cor preenchimento - # deprecated - botao.adicionaBotao('roxo.png',8,210,42,self.mousedown, "Preenchimento Roxo") - botao.adicionaBotao('amarelo.png',9,54,40,self.mousedown, "Preenchimento Amarelo") - botao.adicionaBotao('preto.png',10,90,42,self.mousedown, "Preenchimento Preto") - botao.adicionaBotao('azul.png',11,120,40,self.mousedown, "Preenchimento Azul") - botao.adicionaBotao('verde.png',12,150,42,self.mousedown, "Preenchimento Verde") - botao.adicionaBotao('vermelho.png',13,180,40,self.mousedown, "Preenchimento Vermelho") - botao.adicionaBotao('laranja.png',14,280,42,self.mousedown, "Preenchimento Laranja") - botao.adicionaBotao('branco.png',15,240,40,self.mousedown, "Preenchimento Branco") - - # cor linha - # deprecated - botao.adicionaBotao('roxo.png',16,210,12,self.mousedown, "Linha Roxa") - botao.adicionaBotao('amarelo.png',17,54,10,self.mousedown, "Linha Amarela") - botao.adicionaBotao('preto.png',18,90,12,self.mousedown, "Linha Preta") - botao.adicionaBotao('azul.png',19,120,10,self.mousedown, "Linha Azul") - botao.adicionaBotao('verde.png',20,150,12,self.mousedown, "Linha Verde") - botao.adicionaBotao('vermelho.png',21,180,10,self.mousedown, "Linha Vermelha") - botao.adicionaBotao('laranja.png',22,280,12,self.mousedown, "Linha Laranja") - botao.adicionaBotao('branco.png',23,240,10,self.mousedown, "Linha Branca") - - botao.adicionaBotao('abrir.png',24,660,10,self.mousedown, "Abrir") - botao.adicionaBotao('salvar.png',25,600,10,self.mousedown, "Salvar") - botao.adicionaBotao('selecao.png',26,550,10,self.mousedown, "Selecao") - botao.adicionaBotao('poligono.png',27,70,95,self.mousedown, "Poligono") - - self.window.add(self.areaFixa) - self.window.connect("destroy", gtk.main_quit) - # desenho de texto - - self.entrada = gtk.Entry(max=50) - self.areaFixa.put(self.entrada,100,100) - - self.window.show_all() - self.entrada.hide() - - #self.area.show() - # - - def mousedown(self,widget,event, ferramenta): - """Verify what event was called when the mouse pressed a button. - - Keyword arguments: - self -- Oficina.Oficina instance - widget -- gtk.EventBox - event -- GdkEvent - ferramenta -- integer "enum" - - """ - self.entrada.hide() - if ferramenta == 7: - self.area.d.limpatudo() #vassoura - elif ferramenta == 8: - self.area.mudacor(0) #roxo - elif ferramenta == 9: - self.area.mudacor(1) #amarelo - elif ferramenta == 10: - self.area.mudacor(2) #preto - elif ferramenta == 11: - self.area.mudacor(3) #azul - elif ferramenta == 12: - self.area.mudacor(4) #verde - elif ferramenta == 13: - self.area.mudacor(5) #vermelho - elif ferramenta == 14: - self.area.mudacor(6) #laranja - elif ferramenta == 15: - self.area.mudacor(7) #branco - elif ferramenta == 16: - self.area.mudacorlinha(0) - elif ferramenta == 17: - self.area.mudacorlinha(1) - elif ferramenta == 18: - self.area.mudacorlinha(2) - elif ferramenta == 19: - self.area.mudacorlinha(3) - elif ferramenta == 20: - self.area.mudacorlinha(4) - elif ferramenta == 21: - self.area.mudacorlinha(5) - elif ferramenta == 22: - self.area.mudacorlinha(6) - elif ferramenta == 23: - self.area.mudacorlinha(7) - elif ferramenta == 24: - dialog = gtk.FileChooserDialog(title=('Abrir Arquivo...'), - action=gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK)) - dialog.show_all() - response = dialog.run() - if response == gtk.RESPONSE_OK: - print dialog.get_filename(), 'selected' - gtk28 = False - file_path = dialog.get_filename() - file_path = self.decode_path((file_path,))[0] - self.open(file_path) - elif response == gtk.RESPONSE_CANCEL: - print 'Closed, no files selected' - dialog.destroy() - - elif ferramenta == 25: - dialog = gtk.FileChooserDialog(title=('Salvar Arquivo como...'), - action=gtk.FILE_CHOOSER_ACTION_SAVE, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK)) - - dialog.show_all() - response = dialog.run() - if response == gtk.RESPONSE_OK: - print dialog.get_filename(), 'selected' - gtk28 = False - file_path = dialog.get_filename() - file_path = self.decode_path((file_path,))[0] - self.save(file_path) - elif response == gtk.RESPONSE_CANCEL: - print 'Closed, no files selected' - dialog.destroy() - - else: - if ferramenta == 1: - print "linha" - self.area.window.set_cursor(self.cursorLinha.cursor()) - elif ferramenta == 2: - print "lapis" - self.area.window.set_cursor(self.cursorLapis.cursor()) - elif ferramenta == 3: - print "borracha" - self.area.window.set_cursor(self.cursorBorracha.cursor()) - elif ferramenta == 4: - print "letra" - self.area.window.set_cursor(self.cursorLetra.cursor()) - elif ferramenta == 5: - print "circulo" - self.area.window.set_cursor(self.cursorCirculo.cursor()) - elif ferramenta == 6: - print "quadrado" - self.area.window.set_cursor(self.cursorQuadrado.cursor()) - elif ferramenta == 26: - self.area.window.set_cursor(self.cursorSelecao.cursor()) - elif ferramenta == 27: - self.area.window.set_cursor(self.cursorPoligono.cursor()) - self.area.primeira = 1 - - self.area.ferramenta = ferramenta - - def open(self, name): - self.area.d.limpatudo() - self.area.d.loadImage(name) - - def save(self, name): - """Save the drawing. - - Keyword arguments: - self -- Oficina.Oficina instance - name -- string (path where the file will be saved) - - """ - pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, DRAW_WIDTH, DRAW_HEIGHT) - pixbuf.get_from_drawable(self.area.pixmap, gtk.gdk.colormap_get_system(), 0, 0, 0, 0, -1, -1) - pixbuf.save(name + ".png", "png", {}) - - def decode_path(self, file_paths): - """ - - Keyword arguments: - self -- Oficina.Oficina instance - file_paths -- tuple with the string of the path - - """ - file_paths_list = list() - if os.name == 'nt': # Windows - for file_path in file_paths: - file_path = file_path.decode('utf8') - file_paths_list.append(file_path) - print "file_path", file_path - - else: - for file_path in file_paths: - try: - file_path = file_path.decode(sys.getfilesystemencoding()) - except: - try: - file_path = file_path.decode('utf-8') - except: - pass - file_paths_list.append(file_path) - - return file_paths_list diff --git a/OficinaActivity.py b/OficinaActivity.py index add4fca..cbb3ce6 100644 --- a/OficinaActivity.py +++ b/OficinaActivity.py @@ -1,3 +1,58 @@ +# -*- coding: utf-8 -*- +""" +Desenho.py + +Create Oficina Activity + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +Colaborators: +Bruno Gola (brunogola@gmail.com) + +Group Manager: +Irene Karaguilla Ficheman (irene@lsi.usp.br) + +Cientific Coordinator: +Roseli de Deus Lopes (roseli@lsi.usp.br) + +""" + + import os from gettext import gettext as _ @@ -8,7 +63,6 @@ from sugar.activity import activity #from Oficina import Oficina from toolbox import Toolbox from Area import Area -from Cursors import Cursors # DRAW_WIDTH = 1195 # DRAW_HEIGHT = 800 @@ -41,8 +95,8 @@ class OficinaActivity(activity.Activity): color = gtk.gdk.color_parse("white") self._fixed.modify_bg(gtk.STATE_NORMAL, color) - self.bg = gtk.Image() - self.bg.set_from_file('./icons/bg.svg') + self.bg = gtk.Image() + self.bg.set_from_file('./icons/bg.svg') self._fixed.put(self.bg, 200, 100) self.bg.show() @@ -75,8 +129,10 @@ class OficinaActivity(activity.Activity): print 'read file...' print file_path #self._area.d.limpatudo() - #self._area.d.clear() - self._area.d.loadImage(file_path) + #self._area.d.clear() + self._area.d.loadImage(file_path, self._area) + self._area.undo_times = 1 + self._area.redo_times = 0 def write_file(self, file_path): @@ -88,7 +144,7 @@ class OficinaActivity(activity.Activity): ''' print file_path width, height = self._area.window.get_size() - pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, width, height) - pixbuf.get_from_drawable(self._area.pixmap, gtk.gdk.colormap_get_system(), 0, 0, 0, 0, -1, -1) + pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, width, height) + pixbuf.get_from_drawable(self._area.pixmap, gtk.gdk.colormap_get_system(), 0, 0, 0, 0, -1, -1) pixbuf.save(file_path, 'png', {}) diff --git a/Rede.py b/Rede.py deleted file mode 100644 index 526069b..0000000 --- a/Rede.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -from gtk import gdk - -class Mensagens: - def __init__(self, areadesenho): - pass - def criaConexao(self): - pass - def enviaServidor(self, msg): - pass - def getMessage(self, source, condition): - pass - def handle_data(self, data): - pass - - diff --git a/activity/.svn/entries b/activity/.svn/entries index 243708e..8a448fc 100644 --- a/activity/.svn/entries +++ b/activity/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/activity https://oficina.googlecode.com/svn @@ -32,7 +32,7 @@ file -2007-07-16T13:46:21.000000Z +2007-07-23T19:49:35.000000Z 5ced69d7f93f9c3a0c09a10a4d041748 2007-07-15T19:56:43.170916Z 48 @@ -44,7 +44,7 @@ file -2007-07-16T13:46:21.000000Z +2007-07-23T19:49:35.000000Z d4879eae4813a66794e2c9f286b1f06c 2007-07-15T19:56:43.170916Z 48 diff --git a/activity/activity.info b/activity/activity.info index d99c8a1..d30d8c6 100644 --- a/activity/activity.info +++ b/activity/activity.info @@ -1,6 +1,6 @@ [Activity] name = Paint -activity_version = 3 +activity_version = 1 service_name = org.laptop.Oficina icon = activity-rgbpaint class = OficinaActivity.OficinaActivity diff --git a/activity/activity.info~ b/activity/activity.info~ deleted file mode 100644 index d30d8c6..0000000 --- a/activity/activity.info~ +++ /dev/null @@ -1,7 +0,0 @@ -[Activity] -name = Paint -activity_version = 1 -service_name = org.laptop.Oficina -icon = activity-rgbpaint -class = OficinaActivity.OficinaActivity - diff --git a/eggfill.c b/eggfill.c new file mode 100644 index 0000000..5f1010a --- /dev/null +++ b/eggfill.c @@ -0,0 +1,193 @@ +/* +eggfill.c + +Fill function and queue list + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +*/ +#include +#include "eggfill.h" + +/*for queue*/ +#define front(Q) ( (Q)->Front ) +#define rear(Q) ( (Q)->Rear ) + +struct Node { + ElementType Element; + PtrToNode Next; + }; + +struct QueueL{ + PtrToNode Front; + PtrToNode Rear; + } ; + +/* this queue has a Header that points to the Front and Rear elements */ +/* empty queue: Q->Front = NULL and Q->Rear = NULL */ + +/* check if queue Q is empty */ +int IsEmpty( Queue Q ){ + return ((front(Q)==NULL) && (rear(Q)==NULL)); +} + +Queue CreateQueue( void ){ + Queue Q; + Q = malloc ( sizeof (struct Node)); + + /* check if there is enough space */ + if( Q == NULL ) + printf( "Out of space!!!" ); + + front(Q) = NULL; + rear(Q) = NULL; + + return Q; +} + +void DisposeQueue( Queue Q ){ + MakeEmpty(Q); + free(Q); +} + +void MakeEmpty( Queue Q ){ + if( Q == NULL ) + printf( "Must use CreateQueue first" ); + else + while( !IsEmpty( Q ) ) + Dequeue( Q ); +} + + +void Enqueue( ElementType X, Queue Q ){ + PtrToNode TmpCell; + TmpCell = malloc( sizeof( struct Node ) ); + if( TmpCell == NULL ) + printf( "Out of space!!!" ); + else { + TmpCell->Element = X; + TmpCell->Next = NULL;//rear(Q); + if (IsEmpty(Q)){ + //printf("The Queue is empty\n"); + front(Q)=TmpCell; + } else rear(Q)->Next = TmpCell; + rear(Q) = TmpCell; + } +} + + +//Mostra o Elemento e 1o da Fila +ElementType Front( Queue Q ){ + if (IsEmpty(Q)){ + printf( "Empty queue" ); + return 0; /* Return value used to avoid warning */ + } else { + return front(Q)->Element; + } +} + +void Dequeue( Queue Q ){ + PtrToNode tmpCell; + tmpCell = malloc( sizeof( struct Node ) ); + if( IsEmpty( Q ) ) + printf( "Empty queue" ); + else { + tmpCell=front(Q); + front(Q)=front(Q)->Next; + if (front(Q)==NULL) + rear(Q)=NULL; + free(tmpCell); + } +} /* end of queue*/ + +void fill(GdkDrawable *drawable, GdkGC *gc, int x, int y, int width, int height, int color){ + + int color_start; + + Queue lista_xy; + + lista_xy = CreateQueue(); + + GdkImage *image; + image = gdk_drawable_get_image(drawable,0,0,width,height); + + color_start = gdk_image_get_pixel(image, x, y); + + if (color!=color_start) { + Enqueue(x, lista_xy); + Enqueue(y, lista_xy); + gdk_image_put_pixel(image, x, y, color); + while (!IsEmpty(lista_xy)) { + if (x+1 < width){ + if (gdk_image_get_pixel(image, x+1, y) == color_start){ + gdk_image_put_pixel(image, x+1, y, color); + Enqueue(x+1, lista_xy); + Enqueue(y, lista_xy); + } + } + if (x-1 >= 0){ + if (gdk_image_get_pixel(image, x-1, y) == color_start){ + gdk_image_put_pixel(image, x-1, y, color); + Enqueue(x-1, lista_xy); + Enqueue(y, lista_xy); + } + } + if (y+1 < height){ + if (gdk_image_get_pixel(image, x, y+1) == color_start){ + gdk_image_put_pixel(image, x, y+1, color); + Enqueue(x, lista_xy); + Enqueue(y+1, lista_xy); + } + } + if (y-1 >= 0){ + if (gdk_image_get_pixel(image, x, y-1) == color_start){ + gdk_image_put_pixel(image, x, y-1, color); + Enqueue(x, lista_xy); + Enqueue(y-1, lista_xy); + } + } + x = Front(lista_xy); + Dequeue(lista_xy); + y = Front(lista_xy); + Dequeue(lista_xy); + } + } + + gdk_draw_image(drawable, gc, image, 0,0,0,0,width,height); + +} diff --git a/eggfill.h b/eggfill.h new file mode 100644 index 0000000..2d1d90a --- /dev/null +++ b/eggfill.h @@ -0,0 +1,63 @@ +/* +eggfill.h + +Fill function and queue list + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +*/ +#include +#include +#include + +/*to implement a queue */ +typedef int ElementType; +struct Node; +typedef struct Node *PtrToNode; +typedef PtrToNode List; +typedef PtrToNode Position; +typedef struct QueueL *Queue; +int IsEmpty( Queue Q ); +Queue CreateQueue( void ); +void DisposeQueue( Queue Q ); +void MakeEmpty( Queue Q ); +void Enqueue( ElementType X, Queue Q ); +ElementType Front( Queue Q ); +void Dequeue( Queue Q ); +/*end of queue*/ +void fill(GdkDrawable *drawable, GdkGC *gc, int x, int y, int width, int height, int color); diff --git a/fill.so b/fill.so new file mode 100755 index 0000000..9668cb5 --- /dev/null +++ b/fill.so Binary files differ diff --git a/fill_src/.svn/all-wcprops b/fill_src/.svn/all-wcprops new file mode 100644 index 0000000..b2713ff --- /dev/null +++ b/fill_src/.svn/all-wcprops @@ -0,0 +1,47 @@ +K 25 +svn:wc:ra_dav:version-url +V 31 +/svn/!svn/ver/73/trunk/fill_src +END +eggfill.h +K 25 +svn:wc:ra_dav:version-url +V 41 +/svn/!svn/ver/73/trunk/fill_src/eggfill.h +END +fill.override +K 25 +svn:wc:ra_dav:version-url +V 45 +/svn/!svn/ver/73/trunk/fill_src/fill.override +END +fill.defs +K 25 +svn:wc:ra_dav:version-url +V 41 +/svn/!svn/ver/73/trunk/fill_src/fill.defs +END +fill.c +K 25 +svn:wc:ra_dav:version-url +V 38 +/svn/!svn/ver/73/trunk/fill_src/fill.c +END +eggfill.c +K 25 +svn:wc:ra_dav:version-url +V 41 +/svn/!svn/ver/73/trunk/fill_src/eggfill.c +END +Makefile +K 25 +svn:wc:ra_dav:version-url +V 40 +/svn/!svn/ver/73/trunk/fill_src/Makefile +END +fillmodule.c +K 25 +svn:wc:ra_dav:version-url +V 44 +/svn/!svn/ver/73/trunk/fill_src/fillmodule.c +END diff --git a/fill_src/.svn/entries b/fill_src/.svn/entries new file mode 100644 index 0000000..c8a6985 --- /dev/null +++ b/fill_src/.svn/entries @@ -0,0 +1,112 @@ +8 + +dir +76 +https://oficina.googlecode.com/svn/trunk/fill_src +https://oficina.googlecode.com/svn + + + +2007-07-23T17:47:19.360150Z +73 +pekayatt + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +e2fb0b9f-bc32-0410-ab74-19e9d00b4e58 + +eggfill.h +file + + + + +2007-07-23T19:49:36.000000Z +5caebde9b82e0aed2dfc7a9e78e7ba37 +2007-07-23T17:47:19.360150Z +73 +pekayatt + +fill.override +file + + + + +2007-07-23T19:49:36.000000Z +8a88924614be96f7743360b57972c735 +2007-07-23T17:47:19.360150Z +73 +pekayatt + +fill.defs +file + + + + +2007-07-23T19:49:36.000000Z +73392e9b1d2f00ff7560fafd2f63afe6 +2007-07-23T17:47:19.360150Z +73 +pekayatt + +fill.c +file + + + + +2007-07-23T19:49:36.000000Z +29e282d52adc6113fb9deade1c0874fe +2007-07-23T17:47:19.360150Z +73 +pekayatt + +eggfill.c +file + + + + +2007-07-23T19:49:36.000000Z +a97a14d9c934b42346748a925d532185 +2007-07-23T17:47:19.360150Z +73 +pekayatt + +Makefile +file + + + + +2007-07-23T19:49:36.000000Z +c09aa8e741fa2d9fb4aa477c6331c86d +2007-07-23T17:47:19.360150Z +73 +pekayatt + +fillmodule.c +file + + + + +2007-07-23T19:49:36.000000Z +882baa193e1332c948ba7b6972180ca6 +2007-07-23T17:47:19.360150Z +73 +pekayatt + diff --git a/fill_src/.svn/format b/fill_src/.svn/format new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/fill_src/.svn/format @@ -0,0 +1 @@ +8 diff --git a/fill_src/.svn/text-base/Makefile.svn-base b/fill_src/.svn/text-base/Makefile.svn-base new file mode 100644 index 0000000..dc1f3ec --- /dev/null +++ b/fill_src/.svn/text-base/Makefile.svn-base @@ -0,0 +1,55 @@ +#Copyright 2007, NATE-LSI-EPUSP + +#Oficina is developed in Brazil at Escola Politécnica of +#Universidade de São Paulo. NATE is part of LSI (Integrable +#Systems Laboratory) and stands for Learning, Work and Entertainment +#Research Group. Visit our web page: +#www.nate.lsi.usp.br +#Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +#Oficina is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation version 2 of +#the License. + +#Oficina 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 +#General Public License for more details. + +#You should have received a copy of the GNU General Public +#License along with Oficina; if not, write to the +#Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +#Boston, MA 02110-1301 USA. +#The copy of the GNU General Public License is found in the +#COPYING file included in the source distribution. + + +#Authors: + +#Joyce Alessandra Saul (joycealess@gmail.com) +#Andre Mossinato (andremossinato@gmail.com) +#Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +#Pedro Kayatt (pekayatt@gmail.com) +#Rafael Barbolo Lopes (barbolo@gmail.com) +#Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +CFLAGS = `pkg-config --cflags gtk+-2.0 pygtk-2.0` -I/usr/include/python2.5/ -I. -I/usr/include/pygtk-2.0/ +LDFLAGS = `pkg-config --libs gtk+-2.0 pygtk-2.0` + +fill.so: fill.o eggfill.o fillmodule.o + $(CC) $(LDFLAGS) -shared $^ -o $@ + +DEFS=`pkg-config --variable=defsdir pygtk-2.0` +# Generate the C wrapper +fill.c: fill.defs fill.override + pygtk-codegen-2.0 --prefix fill \ + --register $(DEFS)/gdk-types.defs \ + --register $(DEFS)/gdk-base.defs \ + --register $(DEFS)/gtk-types.defs \ + --override fill.override \ + fill.defs > $@ + +clean: + rm -f fill.so *.o fill.c *~ + diff --git a/fill_src/.svn/text-base/eggfill.c.svn-base b/fill_src/.svn/text-base/eggfill.c.svn-base new file mode 100644 index 0000000..5f1010a --- /dev/null +++ b/fill_src/.svn/text-base/eggfill.c.svn-base @@ -0,0 +1,193 @@ +/* +eggfill.c + +Fill function and queue list + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +*/ +#include +#include "eggfill.h" + +/*for queue*/ +#define front(Q) ( (Q)->Front ) +#define rear(Q) ( (Q)->Rear ) + +struct Node { + ElementType Element; + PtrToNode Next; + }; + +struct QueueL{ + PtrToNode Front; + PtrToNode Rear; + } ; + +/* this queue has a Header that points to the Front and Rear elements */ +/* empty queue: Q->Front = NULL and Q->Rear = NULL */ + +/* check if queue Q is empty */ +int IsEmpty( Queue Q ){ + return ((front(Q)==NULL) && (rear(Q)==NULL)); +} + +Queue CreateQueue( void ){ + Queue Q; + Q = malloc ( sizeof (struct Node)); + + /* check if there is enough space */ + if( Q == NULL ) + printf( "Out of space!!!" ); + + front(Q) = NULL; + rear(Q) = NULL; + + return Q; +} + +void DisposeQueue( Queue Q ){ + MakeEmpty(Q); + free(Q); +} + +void MakeEmpty( Queue Q ){ + if( Q == NULL ) + printf( "Must use CreateQueue first" ); + else + while( !IsEmpty( Q ) ) + Dequeue( Q ); +} + + +void Enqueue( ElementType X, Queue Q ){ + PtrToNode TmpCell; + TmpCell = malloc( sizeof( struct Node ) ); + if( TmpCell == NULL ) + printf( "Out of space!!!" ); + else { + TmpCell->Element = X; + TmpCell->Next = NULL;//rear(Q); + if (IsEmpty(Q)){ + //printf("The Queue is empty\n"); + front(Q)=TmpCell; + } else rear(Q)->Next = TmpCell; + rear(Q) = TmpCell; + } +} + + +//Mostra o Elemento e 1o da Fila +ElementType Front( Queue Q ){ + if (IsEmpty(Q)){ + printf( "Empty queue" ); + return 0; /* Return value used to avoid warning */ + } else { + return front(Q)->Element; + } +} + +void Dequeue( Queue Q ){ + PtrToNode tmpCell; + tmpCell = malloc( sizeof( struct Node ) ); + if( IsEmpty( Q ) ) + printf( "Empty queue" ); + else { + tmpCell=front(Q); + front(Q)=front(Q)->Next; + if (front(Q)==NULL) + rear(Q)=NULL; + free(tmpCell); + } +} /* end of queue*/ + +void fill(GdkDrawable *drawable, GdkGC *gc, int x, int y, int width, int height, int color){ + + int color_start; + + Queue lista_xy; + + lista_xy = CreateQueue(); + + GdkImage *image; + image = gdk_drawable_get_image(drawable,0,0,width,height); + + color_start = gdk_image_get_pixel(image, x, y); + + if (color!=color_start) { + Enqueue(x, lista_xy); + Enqueue(y, lista_xy); + gdk_image_put_pixel(image, x, y, color); + while (!IsEmpty(lista_xy)) { + if (x+1 < width){ + if (gdk_image_get_pixel(image, x+1, y) == color_start){ + gdk_image_put_pixel(image, x+1, y, color); + Enqueue(x+1, lista_xy); + Enqueue(y, lista_xy); + } + } + if (x-1 >= 0){ + if (gdk_image_get_pixel(image, x-1, y) == color_start){ + gdk_image_put_pixel(image, x-1, y, color); + Enqueue(x-1, lista_xy); + Enqueue(y, lista_xy); + } + } + if (y+1 < height){ + if (gdk_image_get_pixel(image, x, y+1) == color_start){ + gdk_image_put_pixel(image, x, y+1, color); + Enqueue(x, lista_xy); + Enqueue(y+1, lista_xy); + } + } + if (y-1 >= 0){ + if (gdk_image_get_pixel(image, x, y-1) == color_start){ + gdk_image_put_pixel(image, x, y-1, color); + Enqueue(x, lista_xy); + Enqueue(y-1, lista_xy); + } + } + x = Front(lista_xy); + Dequeue(lista_xy); + y = Front(lista_xy); + Dequeue(lista_xy); + } + } + + gdk_draw_image(drawable, gc, image, 0,0,0,0,width,height); + +} diff --git a/fill_src/.svn/text-base/eggfill.h.svn-base b/fill_src/.svn/text-base/eggfill.h.svn-base new file mode 100644 index 0000000..2d1d90a --- /dev/null +++ b/fill_src/.svn/text-base/eggfill.h.svn-base @@ -0,0 +1,63 @@ +/* +eggfill.h + +Fill function and queue list + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +*/ +#include +#include +#include + +/*to implement a queue */ +typedef int ElementType; +struct Node; +typedef struct Node *PtrToNode; +typedef PtrToNode List; +typedef PtrToNode Position; +typedef struct QueueL *Queue; +int IsEmpty( Queue Q ); +Queue CreateQueue( void ); +void DisposeQueue( Queue Q ); +void MakeEmpty( Queue Q ); +void Enqueue( ElementType X, Queue Q ); +ElementType Front( Queue Q ); +void Dequeue( Queue Q ); +/*end of queue*/ +void fill(GdkDrawable *drawable, GdkGC *gc, int x, int y, int width, int height, int color); diff --git a/fill_src/.svn/text-base/fill.c.svn-base b/fill_src/.svn/text-base/fill.c.svn-base new file mode 100644 index 0000000..39c4e34 --- /dev/null +++ b/fill_src/.svn/text-base/fill.c.svn-base @@ -0,0 +1,79 @@ +/* -- THIS FILE IS GENERATED - DO NOT EDIT *//* -*- Mode: C; c-basic-offset: 4 -*- */ + +#include + + + +#line 3 "fill.override" +#include +#include +#include "pygobject.h" +#include "eggfill.h" +#line 13 "fill.c" + + +/* ---------- types from other modules ---------- */ +static PyTypeObject *_PyGdkDrawable_Type; +#define PyGdkDrawable_Type (*_PyGdkDrawable_Type) +static PyTypeObject *_PyGdkGC_Type; +#define PyGdkGC_Type (*_PyGdkGC_Type) + + +/* ---------- forward type declarations ---------- */ + +#line 25 "fill.c" + + + +/* ----------- functions ----------- */ + +static PyObject * +_wrap_fill(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "drawable", "gc", "x", "y", "width", "height", "color", NULL }; + PyGObject *drawable, *gc; + int x, y, width, height, color; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs,"O!O!iiiii:fill", kwlist, &PyGdkDrawable_Type, &drawable, &PyGdkGC_Type, &gc, &x, &y, &width, &height, &color)) + return NULL; + + fill(GDK_DRAWABLE(drawable->obj), GDK_GC(gc->obj), x, y, width, height, color); + + Py_INCREF(Py_None); + return Py_None; +} + +const PyMethodDef fill_functions[] = { + { "fill", (PyCFunction)_wrap_fill, METH_VARARGS|METH_KEYWORDS, + NULL }, + { NULL, NULL, 0, NULL } +}; + +/* initialise stuff extension classes */ +void +fill_register_classes(PyObject *d) +{ + PyObject *module; + + if ((module = PyImport_ImportModule("gtk.gdk")) != NULL) { + _PyGdkDrawable_Type = (PyTypeObject *)PyObject_GetAttrString(module, "Drawable"); + if (_PyGdkDrawable_Type == NULL) { + PyErr_SetString(PyExc_ImportError, + "cannot import name Drawable from gtk.gdk"); + return ; + } + _PyGdkGC_Type = (PyTypeObject *)PyObject_GetAttrString(module, "GC"); + if (_PyGdkGC_Type == NULL) { + PyErr_SetString(PyExc_ImportError, + "cannot import name GC from gtk.gdk"); + return ; + } + } else { + PyErr_SetString(PyExc_ImportError, + "could not import gtk.gdk"); + return ; + } + + +#line 79 "fill.c" +} diff --git a/fill_src/.svn/text-base/fill.defs.svn-base b/fill_src/.svn/text-base/fill.defs.svn-base new file mode 100644 index 0000000..d2ebadf --- /dev/null +++ b/fill_src/.svn/text-base/fill.defs.svn-base @@ -0,0 +1,22 @@ +;; -*- scheme -*- +; object definitions ... +;; Enumerations and flags ... + + +;; From eggfill.h + +(define-function fill + (c-name "fill") + (return-type "none") + (parameters + '("GdkDrawable*" "drawable") + '("GdkGC*" "gc") + '("int" "x") + '("int" "y") + '("int" "width") + '("int" "height") + '("int" "color") + ) +) + + diff --git a/fill_src/.svn/text-base/fill.override.svn-base b/fill_src/.svn/text-base/fill.override.svn-base new file mode 100644 index 0000000..85a2f70 --- /dev/null +++ b/fill_src/.svn/text-base/fill.override.svn-base @@ -0,0 +1,15 @@ +%% +headers +#include +#include +#include "pygobject.h" +#include "eggfill.h" +%% +modulename fill +%% +import gtk.gdk.Drawable as PyGdkDrawable_Type +import gtk.gdk.GC as PyGdkGC_Type +%% +ignore-glob + *_get_type +%% diff --git a/fill_src/.svn/text-base/fillmodule.c.svn-base b/fill_src/.svn/text-base/fillmodule.c.svn-base new file mode 100644 index 0000000..37f380c --- /dev/null +++ b/fill_src/.svn/text-base/fillmodule.c.svn-base @@ -0,0 +1,65 @@ +/* +Fill wrapper + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) +Bruno Gola (brunogola@gmail.com) + +*/ +#include + +void fill_register_classes (PyObject *d); + +extern PyMethodDef fill_functions[]; + +DL_EXPORT(void) +initfill(void) +{ + PyObject *m, *d; + + init_pygobject (); + + m = Py_InitModule ("fill", fill_functions); + d = PyModule_GetDict (m); + + fill_register_classes (d); + + if (PyErr_Occurred ()) { + Py_FatalError ("can't initialise module fill"); + } + +} diff --git a/fill_src/Makefile b/fill_src/Makefile new file mode 100644 index 0000000..dc1f3ec --- /dev/null +++ b/fill_src/Makefile @@ -0,0 +1,55 @@ +#Copyright 2007, NATE-LSI-EPUSP + +#Oficina is developed in Brazil at Escola Politécnica of +#Universidade de São Paulo. NATE is part of LSI (Integrable +#Systems Laboratory) and stands for Learning, Work and Entertainment +#Research Group. Visit our web page: +#www.nate.lsi.usp.br +#Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +#Oficina is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation version 2 of +#the License. + +#Oficina 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 +#General Public License for more details. + +#You should have received a copy of the GNU General Public +#License along with Oficina; if not, write to the +#Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +#Boston, MA 02110-1301 USA. +#The copy of the GNU General Public License is found in the +#COPYING file included in the source distribution. + + +#Authors: + +#Joyce Alessandra Saul (joycealess@gmail.com) +#Andre Mossinato (andremossinato@gmail.com) +#Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +#Pedro Kayatt (pekayatt@gmail.com) +#Rafael Barbolo Lopes (barbolo@gmail.com) +#Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +CFLAGS = `pkg-config --cflags gtk+-2.0 pygtk-2.0` -I/usr/include/python2.5/ -I. -I/usr/include/pygtk-2.0/ +LDFLAGS = `pkg-config --libs gtk+-2.0 pygtk-2.0` + +fill.so: fill.o eggfill.o fillmodule.o + $(CC) $(LDFLAGS) -shared $^ -o $@ + +DEFS=`pkg-config --variable=defsdir pygtk-2.0` +# Generate the C wrapper +fill.c: fill.defs fill.override + pygtk-codegen-2.0 --prefix fill \ + --register $(DEFS)/gdk-types.defs \ + --register $(DEFS)/gdk-base.defs \ + --register $(DEFS)/gtk-types.defs \ + --override fill.override \ + fill.defs > $@ + +clean: + rm -f fill.so *.o fill.c *~ + diff --git a/fill_src/eggfill.c b/fill_src/eggfill.c new file mode 100644 index 0000000..5f1010a --- /dev/null +++ b/fill_src/eggfill.c @@ -0,0 +1,193 @@ +/* +eggfill.c + +Fill function and queue list + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +*/ +#include +#include "eggfill.h" + +/*for queue*/ +#define front(Q) ( (Q)->Front ) +#define rear(Q) ( (Q)->Rear ) + +struct Node { + ElementType Element; + PtrToNode Next; + }; + +struct QueueL{ + PtrToNode Front; + PtrToNode Rear; + } ; + +/* this queue has a Header that points to the Front and Rear elements */ +/* empty queue: Q->Front = NULL and Q->Rear = NULL */ + +/* check if queue Q is empty */ +int IsEmpty( Queue Q ){ + return ((front(Q)==NULL) && (rear(Q)==NULL)); +} + +Queue CreateQueue( void ){ + Queue Q; + Q = malloc ( sizeof (struct Node)); + + /* check if there is enough space */ + if( Q == NULL ) + printf( "Out of space!!!" ); + + front(Q) = NULL; + rear(Q) = NULL; + + return Q; +} + +void DisposeQueue( Queue Q ){ + MakeEmpty(Q); + free(Q); +} + +void MakeEmpty( Queue Q ){ + if( Q == NULL ) + printf( "Must use CreateQueue first" ); + else + while( !IsEmpty( Q ) ) + Dequeue( Q ); +} + + +void Enqueue( ElementType X, Queue Q ){ + PtrToNode TmpCell; + TmpCell = malloc( sizeof( struct Node ) ); + if( TmpCell == NULL ) + printf( "Out of space!!!" ); + else { + TmpCell->Element = X; + TmpCell->Next = NULL;//rear(Q); + if (IsEmpty(Q)){ + //printf("The Queue is empty\n"); + front(Q)=TmpCell; + } else rear(Q)->Next = TmpCell; + rear(Q) = TmpCell; + } +} + + +//Mostra o Elemento e 1o da Fila +ElementType Front( Queue Q ){ + if (IsEmpty(Q)){ + printf( "Empty queue" ); + return 0; /* Return value used to avoid warning */ + } else { + return front(Q)->Element; + } +} + +void Dequeue( Queue Q ){ + PtrToNode tmpCell; + tmpCell = malloc( sizeof( struct Node ) ); + if( IsEmpty( Q ) ) + printf( "Empty queue" ); + else { + tmpCell=front(Q); + front(Q)=front(Q)->Next; + if (front(Q)==NULL) + rear(Q)=NULL; + free(tmpCell); + } +} /* end of queue*/ + +void fill(GdkDrawable *drawable, GdkGC *gc, int x, int y, int width, int height, int color){ + + int color_start; + + Queue lista_xy; + + lista_xy = CreateQueue(); + + GdkImage *image; + image = gdk_drawable_get_image(drawable,0,0,width,height); + + color_start = gdk_image_get_pixel(image, x, y); + + if (color!=color_start) { + Enqueue(x, lista_xy); + Enqueue(y, lista_xy); + gdk_image_put_pixel(image, x, y, color); + while (!IsEmpty(lista_xy)) { + if (x+1 < width){ + if (gdk_image_get_pixel(image, x+1, y) == color_start){ + gdk_image_put_pixel(image, x+1, y, color); + Enqueue(x+1, lista_xy); + Enqueue(y, lista_xy); + } + } + if (x-1 >= 0){ + if (gdk_image_get_pixel(image, x-1, y) == color_start){ + gdk_image_put_pixel(image, x-1, y, color); + Enqueue(x-1, lista_xy); + Enqueue(y, lista_xy); + } + } + if (y+1 < height){ + if (gdk_image_get_pixel(image, x, y+1) == color_start){ + gdk_image_put_pixel(image, x, y+1, color); + Enqueue(x, lista_xy); + Enqueue(y+1, lista_xy); + } + } + if (y-1 >= 0){ + if (gdk_image_get_pixel(image, x, y-1) == color_start){ + gdk_image_put_pixel(image, x, y-1, color); + Enqueue(x, lista_xy); + Enqueue(y-1, lista_xy); + } + } + x = Front(lista_xy); + Dequeue(lista_xy); + y = Front(lista_xy); + Dequeue(lista_xy); + } + } + + gdk_draw_image(drawable, gc, image, 0,0,0,0,width,height); + +} diff --git a/fill_src/eggfill.h b/fill_src/eggfill.h new file mode 100644 index 0000000..2d1d90a --- /dev/null +++ b/fill_src/eggfill.h @@ -0,0 +1,63 @@ +/* +eggfill.h + +Fill function and queue list + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +*/ +#include +#include +#include + +/*to implement a queue */ +typedef int ElementType; +struct Node; +typedef struct Node *PtrToNode; +typedef PtrToNode List; +typedef PtrToNode Position; +typedef struct QueueL *Queue; +int IsEmpty( Queue Q ); +Queue CreateQueue( void ); +void DisposeQueue( Queue Q ); +void MakeEmpty( Queue Q ); +void Enqueue( ElementType X, Queue Q ); +ElementType Front( Queue Q ); +void Dequeue( Queue Q ); +/*end of queue*/ +void fill(GdkDrawable *drawable, GdkGC *gc, int x, int y, int width, int height, int color); diff --git a/fill_src/fill.c b/fill_src/fill.c new file mode 100644 index 0000000..39c4e34 --- /dev/null +++ b/fill_src/fill.c @@ -0,0 +1,79 @@ +/* -- THIS FILE IS GENERATED - DO NOT EDIT *//* -*- Mode: C; c-basic-offset: 4 -*- */ + +#include + + + +#line 3 "fill.override" +#include +#include +#include "pygobject.h" +#include "eggfill.h" +#line 13 "fill.c" + + +/* ---------- types from other modules ---------- */ +static PyTypeObject *_PyGdkDrawable_Type; +#define PyGdkDrawable_Type (*_PyGdkDrawable_Type) +static PyTypeObject *_PyGdkGC_Type; +#define PyGdkGC_Type (*_PyGdkGC_Type) + + +/* ---------- forward type declarations ---------- */ + +#line 25 "fill.c" + + + +/* ----------- functions ----------- */ + +static PyObject * +_wrap_fill(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "drawable", "gc", "x", "y", "width", "height", "color", NULL }; + PyGObject *drawable, *gc; + int x, y, width, height, color; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs,"O!O!iiiii:fill", kwlist, &PyGdkDrawable_Type, &drawable, &PyGdkGC_Type, &gc, &x, &y, &width, &height, &color)) + return NULL; + + fill(GDK_DRAWABLE(drawable->obj), GDK_GC(gc->obj), x, y, width, height, color); + + Py_INCREF(Py_None); + return Py_None; +} + +const PyMethodDef fill_functions[] = { + { "fill", (PyCFunction)_wrap_fill, METH_VARARGS|METH_KEYWORDS, + NULL }, + { NULL, NULL, 0, NULL } +}; + +/* initialise stuff extension classes */ +void +fill_register_classes(PyObject *d) +{ + PyObject *module; + + if ((module = PyImport_ImportModule("gtk.gdk")) != NULL) { + _PyGdkDrawable_Type = (PyTypeObject *)PyObject_GetAttrString(module, "Drawable"); + if (_PyGdkDrawable_Type == NULL) { + PyErr_SetString(PyExc_ImportError, + "cannot import name Drawable from gtk.gdk"); + return ; + } + _PyGdkGC_Type = (PyTypeObject *)PyObject_GetAttrString(module, "GC"); + if (_PyGdkGC_Type == NULL) { + PyErr_SetString(PyExc_ImportError, + "cannot import name GC from gtk.gdk"); + return ; + } + } else { + PyErr_SetString(PyExc_ImportError, + "could not import gtk.gdk"); + return ; + } + + +#line 79 "fill.c" +} diff --git a/fill_src/fill.defs b/fill_src/fill.defs new file mode 100644 index 0000000..d2ebadf --- /dev/null +++ b/fill_src/fill.defs @@ -0,0 +1,22 @@ +;; -*- scheme -*- +; object definitions ... +;; Enumerations and flags ... + + +;; From eggfill.h + +(define-function fill + (c-name "fill") + (return-type "none") + (parameters + '("GdkDrawable*" "drawable") + '("GdkGC*" "gc") + '("int" "x") + '("int" "y") + '("int" "width") + '("int" "height") + '("int" "color") + ) +) + + diff --git a/fill_src/fill.override b/fill_src/fill.override new file mode 100644 index 0000000..85a2f70 --- /dev/null +++ b/fill_src/fill.override @@ -0,0 +1,15 @@ +%% +headers +#include +#include +#include "pygobject.h" +#include "eggfill.h" +%% +modulename fill +%% +import gtk.gdk.Drawable as PyGdkDrawable_Type +import gtk.gdk.GC as PyGdkGC_Type +%% +ignore-glob + *_get_type +%% diff --git a/fill_src/fillmodule.c b/fill_src/fillmodule.c new file mode 100644 index 0000000..37f380c --- /dev/null +++ b/fill_src/fillmodule.c @@ -0,0 +1,65 @@ +/* +Fill wrapper + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) +Bruno Gola (brunogola@gmail.com) + +*/ +#include + +void fill_register_classes (PyObject *d); + +extern PyMethodDef fill_functions[]; + +DL_EXPORT(void) +initfill(void) +{ + PyObject *m, *d; + + init_pygobject (); + + m = Py_InitModule ("fill", fill_functions); + d = PyModule_GetDict (m); + + fill_register_classes (d); + + if (PyErr_Occurred ()) { + Py_FatalError ("can't initialise module fill"); + } + +} diff --git a/icons/.svn/all-wcprops b/icons/.svn/all-wcprops index 0ecb0b9..3820ada 100644 --- a/icons/.svn/all-wcprops +++ b/icons/.svn/all-wcprops @@ -1,7 +1,7 @@ K 25 svn:wc:ra_dav:version-url V 28 -/svn/!svn/ver/38/trunk/icons +/svn/!svn/ver/59/trunk/icons END object-width.svg K 25 @@ -225,12 +225,6 @@ svn:wc:ra_dav:version-url V 53 /svn/!svn/ver/16/trunk/icons/tool-shape-trapezoid.svg END -bucket_cursor.svg -K 25 -svn:wc:ra_dav:version-url -V 46 -/svn/!svn/ver/34/trunk/icons/bucket_cursor.svg -END format-justify-left.svg K 25 svn:wc:ra_dav:version-url @@ -261,9 +255,3 @@ svn:wc:ra_dav:version-url V 57 /svn/!svn/ver/16/trunk/icons/tool-marquee-rectangular.svg END -brush_cursor.svg -K 25 -svn:wc:ra_dav:version-url -V 45 -/svn/!svn/ver/34/trunk/icons/brush_cursor.svg -END diff --git a/icons/.svn/entries b/icons/.svn/entries index ce8f13d..ec58d65 100644 --- a/icons/.svn/entries +++ b/icons/.svn/entries @@ -1,15 +1,15 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/icons https://oficina.googlecode.com/svn -2007-07-11T22:04:55.816866Z -38 -joycealess +2007-07-18T20:35:24.502757Z +59 +nathalia.sautchuk svn:special svn:externals svn:needs-lock @@ -32,7 +32,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 1b30b4261b33892ddc24a88687236934 2007-07-09T17:30:08.359449Z 16 @@ -44,7 +44,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 3d66b428030358ffb8dcd4671c6a2bd5 2007-07-11T00:53:52.860928Z 25 @@ -56,7 +56,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 5b10db3a9d3174a815b927930d3fab9e 2007-07-09T17:30:08.359449Z 16 @@ -68,7 +68,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 655e740e804bddad854220e22d19ab56 2007-07-11T22:04:55.816866Z 38 @@ -80,7 +80,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z ac201e3c8064d2d68bb08aa3576a46c9 2007-07-09T17:30:08.359449Z 16 @@ -92,7 +92,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 7569c5cbded502384ad4fa275608caca 2007-07-09T17:30:08.359449Z 16 @@ -104,7 +104,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z b7358e0fc6411671d79d17981fc38b19 2007-07-09T17:30:08.359449Z 16 @@ -116,7 +116,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z ea5b569b0607fffcc4ca7dbfff0bb3ca 2007-07-10T00:59:32.307893Z 19 @@ -128,7 +128,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z a2c3d288a7143a3b6d3730ac6514c6f6 2007-07-09T17:30:08.359449Z 16 @@ -140,7 +140,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 6349d68cb94da2538dbd5bf6510ba8b9 2007-07-09T17:30:08.359449Z 16 @@ -152,7 +152,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 53e5cc4e49257abecf42be80e89ae2cb 2007-07-09T17:30:08.359449Z 16 @@ -164,7 +164,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 1c6745cad816b8c06442532d753b4c69 2007-07-11T21:11:51.124065Z 35 @@ -176,7 +176,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 563d404cd9eb5564dc8755d6a9d89229 2007-07-09T17:30:08.359449Z 16 @@ -188,80 +188,68 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z e49e130a054dd297c3dd83a65d725f61 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -object-height.svg -file - - - - -2007-07-16T13:46:28.000000Z -5136d4efa9aa305dfee18e7058e92b96 -2007-07-09T17:30:08.359449Z -16 -alexandremartinazzo - icon-fill.svg file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z e8feaa6e7c01a58d023230c5271a2e68 2007-07-10T00:59:32.307893Z 19 joycealess -object-rotate-right.svg +object-height.svg file -2007-07-16T13:46:28.000000Z -5da560d2dfa6feda4c8607dd69ff6cb3 +2007-07-23T19:49:40.000000Z +5136d4efa9aa305dfee18e7058e92b96 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -tool-shape-rectangle.svg +format-text-italic.svg file -2007-07-16T13:46:28.000000Z -393c1815080f6c32e7b46d768d50bbe3 +2007-07-23T19:49:40.000000Z +a850db558c3ee9e4c48c858b8d6b5882 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -format-text-italic.svg +tool-shape-rectangle.svg file -2007-07-16T13:46:28.000000Z -a850db558c3ee9e4c48c858b8d6b5882 +2007-07-23T19:49:40.000000Z +393c1815080f6c32e7b46d768d50bbe3 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -tool-shape-triangle.svg +object-rotate-right.svg file -2007-07-16T13:46:28.000000Z -63c237a53add3ee92f78dcf19b025b06 +2007-07-23T19:49:40.000000Z +5da560d2dfa6feda4c8607dd69ff6cb3 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo @@ -272,20 +260,20 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z cf0ab1e88a64f839cdd141c7043e7da2 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -tool-shape-star.svg +tool-shape-triangle.svg file -2007-07-16T13:46:28.000000Z -a55eed656b2ae223c85e027195a17ac0 +2007-07-23T19:49:40.000000Z +63c237a53add3ee92f78dcf19b025b06 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo @@ -296,32 +284,32 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 153156a7ef9c178ed1545afe2191af18 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -tool-pencil.svg +tool-shape-star.svg file -2007-07-16T13:46:28.000000Z -2d2d1720c53aed8ad422ad9cb0706665 +2007-07-23T19:49:40.000000Z +a55eed656b2ae223c85e027195a17ac0 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -edit-undo.svg +tool-pencil.svg file -2007-07-16T13:46:28.000000Z -f5469f3e20e7d35f397abbc53d9bb44e +2007-07-23T19:49:40.000000Z +2d2d1720c53aed8ad422ad9cb0706665 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo @@ -332,19 +320,31 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 7dd2a79d716c5e58d2397acf7034846c 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo +edit-undo.svg +file + + + + +2007-07-23T19:49:40.000000Z +f5469f3e20e7d35f397abbc53d9bb44e +2007-07-09T17:30:08.359449Z +16 +alexandremartinazzo + tool-shape-parallelogram.svg file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z a3ba7afdf43083bf211d00a148151171 2007-07-09T17:30:08.359449Z 16 @@ -356,32 +356,32 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 63d491adb8dea6c891054344f6bc200b 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -format-text-underline.svg +edit-copy.svg file -2007-07-16T13:46:28.000000Z -6cf8ba5c06ffa7bc4a13af4ea92791d2 +2007-07-23T19:49:40.000000Z +5ae430fc4a3faaf20ca3f6f3ce233c8e 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -edit-copy.svg +format-text-underline.svg file -2007-07-16T13:46:28.000000Z -5ae430fc4a3faaf20ca3f6f3ce233c8e +2007-07-23T19:49:40.000000Z +6cf8ba5c06ffa7bc4a13af4ea92791d2 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo @@ -392,7 +392,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 623820ab0b2c320651afdf2ccb3aed27 2007-07-09T17:30:08.359449Z 16 @@ -404,7 +404,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 76a7d3f503150836c214e09a12d42658 2007-07-09T17:30:08.359449Z 16 @@ -416,7 +416,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 340267d9bec6af601eabb0b16f616592 2007-07-09T17:30:08.359449Z 16 @@ -428,7 +428,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z f2c12f70fdccb7b5473032c08c497eb4 2007-07-09T17:30:08.359449Z 16 @@ -440,7 +440,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z ce09016ce6f5be5c946273a5c032eff2 2007-07-11T21:11:51.124065Z 35 @@ -452,7 +452,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z adcd21782f71b6b339d4bd37d187d9d3 2007-07-09T17:30:08.359449Z 16 @@ -464,31 +464,19 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z e6d5ba414520fad5ddff0a83a7f4bab8 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -bucket_cursor.svg -file - - - - -2007-07-16T13:46:28.000000Z -a2f66538482fc192d6d6b6dcd8799249 -2007-07-11T20:50:12.464219Z -34 -joycealess - format-justify-left.svg file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z ac45c7bfc3bc00ef03a084259f71be83 2007-07-09T17:30:08.359449Z 16 @@ -500,7 +488,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 539b0034eeddb6fe05c5bab1bc9979ed 2007-07-09T17:30:08.359449Z 16 @@ -512,7 +500,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 489dc74808baf5aa59b310f0ca3f1176 2007-07-09T17:30:08.359449Z 16 @@ -524,7 +512,7 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z 497e724825b35b4f9071839ac7f3e54f 2007-07-09T17:30:08.359449Z 16 @@ -536,21 +524,9 @@ file -2007-07-16T13:46:28.000000Z +2007-07-23T19:49:40.000000Z c3dc83404092717bfa58e586fc901c90 2007-07-09T17:30:08.359449Z 16 alexandremartinazzo -brush_cursor.svg -file - - - - -2007-07-16T13:46:28.000000Z -59598ad92152a64b8105bc7336ebc47e -2007-07-11T20:50:12.464219Z -34 -joycealess - diff --git a/icons/.svn/text-base/brush_cursor.svg.svn-base b/icons/.svn/text-base/brush_cursor.svg.svn-base deleted file mode 100644 index 27d8d46..0000000 --- a/icons/.svn/text-base/brush_cursor.svg.svn-base +++ /dev/null @@ -1,67 +0,0 @@ - - -image/svg+xml - - - - - - - - - \ No newline at end of file diff --git a/icons/.svn/text-base/bucket_cursor.svg.svn-base b/icons/.svn/text-base/bucket_cursor.svg.svn-base deleted file mode 100644 index bf4ea4d..0000000 --- a/icons/.svn/text-base/bucket_cursor.svg.svn-base +++ /dev/null @@ -1,67 +0,0 @@ - - -image/svg+xml - - - - - - - - - \ No newline at end of file diff --git a/icons/brush_cursor.svg b/icons/brush_cursor.svg deleted file mode 100644 index 27d8d46..0000000 --- a/icons/brush_cursor.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -image/svg+xml - - - - - - - - - \ No newline at end of file diff --git a/icons/bucket_cursor.svg b/icons/bucket_cursor.svg deleted file mode 100644 index bf4ea4d..0000000 --- a/icons/bucket_cursor.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -image/svg+xml - - - - - - - - - \ No newline at end of file diff --git a/images/.svn/all-wcprops b/images/.svn/all-wcprops index 033edaf..d27ff6c 100644 --- a/images/.svn/all-wcprops +++ b/images/.svn/all-wcprops @@ -1,203 +1,107 @@ K 25 svn:wc:ra_dav:version-url V 29 -/svn/!svn/ver/49/trunk/images +/svn/!svn/ver/66/trunk/images END -circulo_cursor.png -K 25 -svn:wc:ra_dav:version-url -V 47 -/svn/!svn/ver/2/trunk/images/circulo_cursor.png -END -corlinha.png -K 25 -svn:wc:ra_dav:version-url -V 41 -/svn/!svn/ver/2/trunk/images/corlinha.png -END -quadrado.png -K 25 -svn:wc:ra_dav:version-url -V 41 -/svn/!svn/ver/2/trunk/images/quadrado.png -END -balde.png -K 25 -svn:wc:ra_dav:version-url -V 38 -/svn/!svn/ver/2/trunk/images/balde.png -END -lapis.png -K 25 -svn:wc:ra_dav:version-url -V 38 -/svn/!svn/ver/2/trunk/images/lapis.png -END -laranja.png -K 25 -svn:wc:ra_dav:version-url -V 40 -/svn/!svn/ver/2/trunk/images/laranja.png -END -borracha_cursor.png -K 25 -svn:wc:ra_dav:version-url -V 48 -/svn/!svn/ver/2/trunk/images/borracha_cursor.png -END -borracha.png +ellipse.png K 25 svn:wc:ra_dav:version-url V 41 -/svn/!svn/ver/2/trunk/images/borracha.png +/svn/!svn/ver/66/trunk/images/ellipse.png END -poligono_cursor.png +trapezoid.png K 25 svn:wc:ra_dav:version-url -V 48 -/svn/!svn/ver/7/trunk/images/poligono_cursor.png +V 43 +/svn/!svn/ver/66/trunk/images/trapezoid.png END -linha_cursor.png +heart.png K 25 svn:wc:ra_dav:version-url -V 45 -/svn/!svn/ver/2/trunk/images/linha_cursor.png +V 39 +/svn/!svn/ver/66/trunk/images/heart.png END -preto.png +move_cursor.png K 25 svn:wc:ra_dav:version-url -V 38 -/svn/!svn/ver/2/trunk/images/preto.png +V 44 +/svn/!svn/ver/7/trunk/images/move_cursor.png END -linha.png +marquee-rectangular.png K 25 svn:wc:ra_dav:version-url -V 38 -/svn/!svn/ver/2/trunk/images/linha.png +V 53 +/svn/!svn/ver/66/trunk/images/marquee-rectangular.png END -quadrado_cursor.png +rectangle.png K 25 svn:wc:ra_dav:version-url -V 48 -/svn/!svn/ver/2/trunk/images/quadrado_cursor.png +V 43 +/svn/!svn/ver/66/trunk/images/rectangle.png END -trapezoid_cursor.png +triangle.png K 25 svn:wc:ra_dav:version-url -V 50 -/svn/!svn/ver/49/trunk/images/trapezoid_cursor.png +V 42 +/svn/!svn/ver/66/trunk/images/triangle.png END -abrir.png +star.png K 25 svn:wc:ra_dav:version-url V 38 -/svn/!svn/ver/6/trunk/images/abrir.png +/svn/!svn/ver/66/trunk/images/star.png END -circulo.png +pencil.png K 25 svn:wc:ra_dav:version-url V 40 -/svn/!svn/ver/2/trunk/images/circulo.png -END -triangle_cursor.png -K 25 -svn:wc:ra_dav:version-url -V 49 -/svn/!svn/ver/49/trunk/images/triangle_cursor.png +/svn/!svn/ver/66/trunk/images/pencil.png END -Thumbs.db +bucket.png K 25 svn:wc:ra_dav:version-url -V 38 -/svn/!svn/ver/5/trunk/images/Thumbs.db +V 40 +/svn/!svn/ver/66/trunk/images/bucket.png END -vassoura.png +eraser.png K 25 svn:wc:ra_dav:version-url -V 41 -/svn/!svn/ver/2/trunk/images/vassoura.png +V 40 +/svn/!svn/ver/66/trunk/images/eraser.png END -move_cursor.png +parallelogram.png K 25 svn:wc:ra_dav:version-url -V 44 -/svn/!svn/ver/7/trunk/images/move_cursor.png +V 47 +/svn/!svn/ver/66/trunk/images/parallelogram.png END -branco.png +brush.png K 25 svn:wc:ra_dav:version-url V 39 -/svn/!svn/ver/2/trunk/images/branco.png -END -letra_cursor.png -K 25 -svn:wc:ra_dav:version-url -V 45 -/svn/!svn/ver/2/trunk/images/letra_cursor.png +/svn/!svn/ver/66/trunk/images/brush.png END -verde.png +text.png K 25 svn:wc:ra_dav:version-url V 38 -/svn/!svn/ver/2/trunk/images/verde.png -END -lapis_cursor.png -K 25 -svn:wc:ra_dav:version-url -V 45 -/svn/!svn/ver/2/trunk/images/lapis_cursor.png +/svn/!svn/ver/66/trunk/images/text.png END -letra.png +line.png K 25 svn:wc:ra_dav:version-url V 38 -/svn/!svn/ver/2/trunk/images/letra.png -END -selecao_cursor.png -K 25 -svn:wc:ra_dav:version-url -V 47 -/svn/!svn/ver/5/trunk/images/selecao_cursor.png +/svn/!svn/ver/66/trunk/images/line.png END -selecao.png -K 25 -svn:wc:ra_dav:version-url -V 40 -/svn/!svn/ver/5/trunk/images/selecao.png -END -azul.png -K 25 -svn:wc:ra_dav:version-url -V 37 -/svn/!svn/ver/2/trunk/images/azul.png -END -amarelo.png -K 25 -svn:wc:ra_dav:version-url -V 40 -/svn/!svn/ver/2/trunk/images/amarelo.png -END -vermelho.png +polygon.png K 25 svn:wc:ra_dav:version-url V 41 -/svn/!svn/ver/2/trunk/images/vermelho.png -END -poligono.png -K 25 -svn:wc:ra_dav:version-url -V 41 -/svn/!svn/ver/7/trunk/images/poligono.png -END -roxo.png -K 25 -svn:wc:ra_dav:version-url -V 37 -/svn/!svn/ver/2/trunk/images/roxo.png +/svn/!svn/ver/66/trunk/images/polygon.png END -salvar.png +arrow.png K 25 svn:wc:ra_dav:version-url V 39 -/svn/!svn/ver/2/trunk/images/salvar.png +/svn/!svn/ver/66/trunk/images/arrow.png END diff --git a/images/.svn/entries b/images/.svn/entries index ab77042..51836a0 100644 --- a/images/.svn/entries +++ b/images/.svn/entries @@ -1,15 +1,15 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/images https://oficina.googlecode.com/svn -2007-07-15T20:13:19.082257Z -49 -andremossinato +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk svn:special svn:externals svn:needs-lock @@ -26,225 +26,43 @@ svn:special svn:externals svn:needs-lock e2fb0b9f-bc32-0410-ab74-19e9d00b4e58 -circulo_cursor.png +ellipse.png file -2007-07-16T13:46:26.000000Z +2007-07-23T19:49:38.000000Z 18b86bde4f5514139d6d4fd48cac8abe -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -corlinha.png -file - - - - -2007-07-16T13:46:26.000000Z -7c822d25f3d45a28a3c04d668cd07680 -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -quadrado.png -file - - - - -2007-07-16T13:46:26.000000Z -7d523ce25cb8329aa9bce899a5787ddb -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -balde.png -file - - - - -2007-07-16T13:46:26.000000Z -1b044e719146991527f6d9aecd0e03db -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -lapis.png -file - - - - -2007-07-16T13:46:26.000000Z -19f856922962f428ea9f858a6ec1fc09 -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -laranja.png -file - - - - -2007-07-16T13:46:26.000000Z -7f9dbd8c61602c36156fc45c068f55b9 -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -borracha_cursor.png -file - - - - -2007-07-16T13:46:26.000000Z -7f81bc6307b60f51f0b850f3e83f83ad -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -borracha.png -file - - - - -2007-07-16T13:46:26.000000Z -920aae3ef1be38d542d7525b0a5ed4da -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -poligono_cursor.png -file - - - - -2007-07-16T13:46:26.000000Z -6cd059ced988051c235b277e55ed206d -2007-06-18T18:20:42.711072Z -7 -joycealess -has-props - -linha_cursor.png -file - - - - -2007-07-16T13:46:26.000000Z -21d012ee14fcece687a999b7fbb8b24b -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -preto.png -file - - - - -2007-07-16T13:46:26.000000Z -37ed9cc07e4cdb3c0a3d9d02bec6d792 -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -linha.png -file - - - - -2007-07-16T13:46:26.000000Z -28d26688e09d1b1dbddd802429d62f24 -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -quadrado_cursor.png -file - - - - -2007-07-16T13:46:26.000000Z -86cacdc27b09e5b36355298428f2c417 -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -trapezoid_cursor.png -file - - - - -2007-07-16T13:46:26.000000Z -2de1730e8a5920b78a21ae4383350ae1 -2007-07-15T20:13:19.082257Z -49 -andremossinato -has-props - -abrir.png -file - - - - -2007-07-16T13:46:26.000000Z -2c2865eb138c23c0ff97683c94c6e992 -2007-06-15T16:46:33.642423Z -6 -joycealess +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -circulo.png +trapezoid.png file -2007-07-16T13:46:26.000000Z -f9502c7f984408e5116b97f5aa801e08 -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +61c7f8671c90a798c9f0e951758914f2 +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -triangle_cursor.png +heart.png file -2007-07-16T13:46:26.000000Z -74a4c11380216305ae5cac9c3f7f477f -2007-07-15T20:13:19.082257Z -49 -andremossinato +2007-07-23T19:49:38.000000Z +2e3c7dbcb289680b47c954494d09820b +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props move_cursor.png @@ -253,205 +71,179 @@ file -2007-07-16T13:46:26.000000Z +2007-07-23T19:49:38.000000Z b42a867cb51d5094fadce36c2d31591d 2007-06-18T18:20:42.711072Z 7 joycealess has-props -vassoura.png +marquee-rectangular.png file -2007-07-16T13:46:26.000000Z -af55c62b1573860d601cd584b37e0a3b -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +03e58edf2c431a6995d7a80bb7615ce4 +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -Thumbs.db +rectangle.png file -2007-07-16T13:46:26.000000Z -69cb3c1cb1c065985f8a8f85336a3d28 -2007-06-15T16:46:03.611045Z -5 -joycealess +2007-07-23T19:49:38.000000Z +86cacdc27b09e5b36355298428f2c417 +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -letra_cursor.png +triangle.png file -2007-07-16T13:46:26.000000Z -8b4363cd52feb57b200db0228d2af612 -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +ac69b1dcadb698af2d898698f0079faa +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -branco.png +star.png file -2007-07-16T13:46:26.000000Z -720bd5a28d127b0003e2dda0f38179c0 -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +838a5280fb54697e529c94e3a2f2378d +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -lapis_cursor.png +pencil.png file -2007-07-16T13:46:26.000000Z +2007-07-23T19:49:38.000000Z 4de0e8f1d1f5d05bc2b73e1bbea35e38 -2007-06-12T22:07:17.555544Z -2 -joycealess -has-props - -verde.png -file - - - - -2007-07-16T13:46:26.000000Z -2322a60eb2c3562a36511f7a14238f3c -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -letra.png +bucket.png file -2007-07-16T13:46:26.000000Z -581c5b63d3e43b461fdbaffc5e74ffcc -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +a59bb36b5d18aae78efe4328992a0f74 +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -selecao_cursor.png +eraser.png file -2007-07-16T13:46:26.000000Z -03e58edf2c431a6995d7a80bb7615ce4 -2007-06-15T16:46:03.611045Z -5 -joycealess -has-props - -azul.png -file - - - - -2007-07-16T13:46:26.000000Z -5905a16a0cb083a48d95c1ed797beaf8 -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +7f81bc6307b60f51f0b850f3e83f83ad +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -selecao.png +parallelogram.png file -2007-07-16T13:46:26.000000Z -a71fb6b71b1a6af906f4519956b2c88f -2007-06-15T16:46:03.611045Z -5 -joycealess +2007-07-23T19:49:38.000000Z +54a53e6aaf1ec1dad96e82f73b317b2e +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -amarelo.png +brush.png file -2007-07-16T13:46:26.000000Z -4bc1cac4a2e46557c59e785c43960c70 -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +e045df95b9c4b29e7eac0f518332b5cc +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -vermelho.png +text.png file -2007-07-16T13:46:26.000000Z -95da835747614c5799fab28814ac5a01 -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +8b4363cd52feb57b200db0228d2af612 +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -poligono.png +polygon.png file -2007-07-16T13:46:26.000000Z -ea7ee8abf944b7952f780c5099745adc -2007-06-18T18:20:42.711072Z -7 -joycealess +2007-07-23T19:49:38.000000Z +6cd059ced988051c235b277e55ed206d +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -roxo.png +line.png file -2007-07-16T13:46:26.000000Z -c406b58097cf5e96a287ec6727d9594a -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +21d012ee14fcece687a999b7fbb8b24b +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props -salvar.png +arrow.png file -2007-07-16T13:46:26.000000Z -22def5499bc2c7d469ce898102d59660 -2007-06-12T22:07:17.555544Z -2 -joycealess +2007-07-23T19:49:38.000000Z +99e5f8733e0ebebb31d543a94301aca0 +2007-07-19T21:06:05.822182Z +66 +nathalia.sautchuk has-props diff --git a/images/.svn/prop-base/Thumbs.db.svn-base b/images/.svn/prop-base/arrow.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/Thumbs.db.svn-base +++ b/images/.svn/prop-base/arrow.png.svn-base diff --git a/images/.svn/prop-base/abrir.png.svn-base b/images/.svn/prop-base/brush.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/abrir.png.svn-base +++ b/images/.svn/prop-base/brush.png.svn-base diff --git a/images/.svn/prop-base/amarelo.png.svn-base b/images/.svn/prop-base/bucket.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/amarelo.png.svn-base +++ b/images/.svn/prop-base/bucket.png.svn-base diff --git a/images/.svn/prop-base/azul.png.svn-base b/images/.svn/prop-base/ellipse.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/azul.png.svn-base +++ b/images/.svn/prop-base/ellipse.png.svn-base diff --git a/images/.svn/prop-base/balde.png.svn-base b/images/.svn/prop-base/eraser.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/balde.png.svn-base +++ b/images/.svn/prop-base/eraser.png.svn-base diff --git a/images/.svn/prop-base/borracha.png.svn-base b/images/.svn/prop-base/heart.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/borracha.png.svn-base +++ b/images/.svn/prop-base/heart.png.svn-base diff --git a/images/.svn/prop-base/borracha_cursor.png.svn-base b/images/.svn/prop-base/line.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/borracha_cursor.png.svn-base +++ b/images/.svn/prop-base/line.png.svn-base diff --git a/images/.svn/prop-base/linha.png.svn-base b/images/.svn/prop-base/linha.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/linha.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/linha_cursor.png.svn-base b/images/.svn/prop-base/linha_cursor.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/linha_cursor.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/branco.png.svn-base b/images/.svn/prop-base/marquee-rectangular.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/branco.png.svn-base +++ b/images/.svn/prop-base/marquee-rectangular.png.svn-base diff --git a/images/.svn/prop-base/circulo.png.svn-base b/images/.svn/prop-base/parallelogram.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/circulo.png.svn-base +++ b/images/.svn/prop-base/parallelogram.png.svn-base diff --git a/images/.svn/prop-base/circulo_cursor.png.svn-base b/images/.svn/prop-base/pencil.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/circulo_cursor.png.svn-base +++ b/images/.svn/prop-base/pencil.png.svn-base diff --git a/images/.svn/prop-base/poligono.png.svn-base b/images/.svn/prop-base/poligono.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/poligono.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/poligono_cursor.png.svn-base b/images/.svn/prop-base/poligono_cursor.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/poligono_cursor.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/corlinha.png.svn-base b/images/.svn/prop-base/polygon.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/corlinha.png.svn-base +++ b/images/.svn/prop-base/polygon.png.svn-base diff --git a/images/.svn/prop-base/preto.png.svn-base b/images/.svn/prop-base/preto.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/preto.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/quadrado.png.svn-base b/images/.svn/prop-base/quadrado.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/quadrado.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/quadrado_cursor.png.svn-base b/images/.svn/prop-base/quadrado_cursor.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/quadrado_cursor.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/lapis.png.svn-base b/images/.svn/prop-base/rectangle.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/lapis.png.svn-base +++ b/images/.svn/prop-base/rectangle.png.svn-base diff --git a/images/.svn/prop-base/roxo.png.svn-base b/images/.svn/prop-base/roxo.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/roxo.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/salvar.png.svn-base b/images/.svn/prop-base/salvar.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/salvar.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/selecao.png.svn-base b/images/.svn/prop-base/selecao.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/selecao.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/selecao_cursor.png.svn-base b/images/.svn/prop-base/selecao_cursor.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/selecao_cursor.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/lapis_cursor.png.svn-base b/images/.svn/prop-base/star.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/lapis_cursor.png.svn-base +++ b/images/.svn/prop-base/star.png.svn-base diff --git a/images/.svn/prop-base/laranja.png.svn-base b/images/.svn/prop-base/text.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/laranja.png.svn-base +++ b/images/.svn/prop-base/text.png.svn-base diff --git a/images/.svn/prop-base/letra.png.svn-base b/images/.svn/prop-base/trapezoid.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/letra.png.svn-base +++ b/images/.svn/prop-base/trapezoid.png.svn-base diff --git a/images/.svn/prop-base/trapezoid_cursor.png.svn-base b/images/.svn/prop-base/trapezoid_cursor.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/trapezoid_cursor.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/letra_cursor.png.svn-base b/images/.svn/prop-base/triangle.png.svn-base index 5e9587e..5e9587e 100644 --- a/images/.svn/prop-base/letra_cursor.png.svn-base +++ b/images/.svn/prop-base/triangle.png.svn-base diff --git a/images/.svn/prop-base/triangle_cursor.png.svn-base b/images/.svn/prop-base/triangle_cursor.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/triangle_cursor.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/vassoura.png.svn-base b/images/.svn/prop-base/vassoura.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/vassoura.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/verde.png.svn-base b/images/.svn/prop-base/verde.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/verde.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/prop-base/vermelho.png.svn-base b/images/.svn/prop-base/vermelho.png.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/images/.svn/prop-base/vermelho.png.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/images/.svn/text-base/Thumbs.db.svn-base b/images/.svn/text-base/Thumbs.db.svn-base deleted file mode 100644 index 56a82a2..0000000 --- a/images/.svn/text-base/Thumbs.db.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/abrir.png.svn-base b/images/.svn/text-base/abrir.png.svn-base deleted file mode 100644 index 04e99c3..0000000 --- a/images/.svn/text-base/abrir.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/amarelo.png.svn-base b/images/.svn/text-base/amarelo.png.svn-base deleted file mode 100644 index 6f9cde4..0000000 --- a/images/.svn/text-base/amarelo.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/arrow.png.svn-base b/images/.svn/text-base/arrow.png.svn-base new file mode 100644 index 0000000..7da3ec7 --- /dev/null +++ b/images/.svn/text-base/arrow.png.svn-base Binary files differ diff --git a/images/.svn/text-base/azul.png.svn-base b/images/.svn/text-base/azul.png.svn-base deleted file mode 100644 index 33643b1..0000000 --- a/images/.svn/text-base/azul.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/balde.png.svn-base b/images/.svn/text-base/balde.png.svn-base deleted file mode 100644 index 5edd1a3..0000000 --- a/images/.svn/text-base/balde.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/borracha.png.svn-base b/images/.svn/text-base/borracha.png.svn-base deleted file mode 100644 index 3b0cede..0000000 --- a/images/.svn/text-base/borracha.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/branco.png.svn-base b/images/.svn/text-base/branco.png.svn-base deleted file mode 100644 index d6b92eb..0000000 --- a/images/.svn/text-base/branco.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/brush.png.svn-base b/images/.svn/text-base/brush.png.svn-base new file mode 100644 index 0000000..c47e1ab --- /dev/null +++ b/images/.svn/text-base/brush.png.svn-base Binary files differ diff --git a/images/.svn/text-base/bucket.png.svn-base b/images/.svn/text-base/bucket.png.svn-base new file mode 100644 index 0000000..d3960a8 --- /dev/null +++ b/images/.svn/text-base/bucket.png.svn-base Binary files differ diff --git a/images/.svn/text-base/circulo.png.svn-base b/images/.svn/text-base/circulo.png.svn-base deleted file mode 100644 index 513f0af..0000000 --- a/images/.svn/text-base/circulo.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/corlinha.png.svn-base b/images/.svn/text-base/corlinha.png.svn-base deleted file mode 100644 index 40022ed..0000000 --- a/images/.svn/text-base/corlinha.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/circulo_cursor.png.svn-base b/images/.svn/text-base/ellipse.png.svn-base index 5b60f38..5b60f38 100644 --- a/images/.svn/text-base/circulo_cursor.png.svn-base +++ b/images/.svn/text-base/ellipse.png.svn-base Binary files differ diff --git a/images/.svn/text-base/borracha_cursor.png.svn-base b/images/.svn/text-base/eraser.png.svn-base index 1b75507..1b75507 100644 --- a/images/.svn/text-base/borracha_cursor.png.svn-base +++ b/images/.svn/text-base/eraser.png.svn-base Binary files differ diff --git a/images/.svn/text-base/heart.png.svn-base b/images/.svn/text-base/heart.png.svn-base new file mode 100644 index 0000000..5e5029c --- /dev/null +++ b/images/.svn/text-base/heart.png.svn-base Binary files differ diff --git a/images/.svn/text-base/lapis.png.svn-base b/images/.svn/text-base/lapis.png.svn-base deleted file mode 100644 index 5b697e8..0000000 --- a/images/.svn/text-base/lapis.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/laranja.png.svn-base b/images/.svn/text-base/laranja.png.svn-base deleted file mode 100644 index 4321393..0000000 --- a/images/.svn/text-base/laranja.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/letra.png.svn-base b/images/.svn/text-base/letra.png.svn-base deleted file mode 100644 index cf4eab1..0000000 --- a/images/.svn/text-base/letra.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/linha_cursor.png.svn-base b/images/.svn/text-base/line.png.svn-base index b9ee7eb..b9ee7eb 100644 --- a/images/.svn/text-base/linha_cursor.png.svn-base +++ b/images/.svn/text-base/line.png.svn-base Binary files differ diff --git a/images/.svn/text-base/linha.png.svn-base b/images/.svn/text-base/linha.png.svn-base deleted file mode 100644 index 958332c..0000000 --- a/images/.svn/text-base/linha.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/selecao_cursor.png.svn-base b/images/.svn/text-base/marquee-rectangular.png.svn-base index 5f34d60..5f34d60 100644 --- a/images/.svn/text-base/selecao_cursor.png.svn-base +++ b/images/.svn/text-base/marquee-rectangular.png.svn-base Binary files differ diff --git a/images/.svn/text-base/parallelogram.png.svn-base b/images/.svn/text-base/parallelogram.png.svn-base new file mode 100644 index 0000000..1927a78 --- /dev/null +++ b/images/.svn/text-base/parallelogram.png.svn-base Binary files differ diff --git a/images/.svn/text-base/lapis_cursor.png.svn-base b/images/.svn/text-base/pencil.png.svn-base index 9b12986..9b12986 100644 --- a/images/.svn/text-base/lapis_cursor.png.svn-base +++ b/images/.svn/text-base/pencil.png.svn-base Binary files differ diff --git a/images/.svn/text-base/poligono.png.svn-base b/images/.svn/text-base/poligono.png.svn-base deleted file mode 100644 index 9d74ca6..0000000 --- a/images/.svn/text-base/poligono.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/poligono_cursor.png.svn-base b/images/.svn/text-base/polygon.png.svn-base index 8e2b505..8e2b505 100644 --- a/images/.svn/text-base/poligono_cursor.png.svn-base +++ b/images/.svn/text-base/polygon.png.svn-base Binary files differ diff --git a/images/.svn/text-base/preto.png.svn-base b/images/.svn/text-base/preto.png.svn-base deleted file mode 100644 index 247077c..0000000 --- a/images/.svn/text-base/preto.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/quadrado.png.svn-base b/images/.svn/text-base/quadrado.png.svn-base deleted file mode 100644 index 76aa304..0000000 --- a/images/.svn/text-base/quadrado.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/quadrado_cursor.png.svn-base b/images/.svn/text-base/rectangle.png.svn-base index cdb4923..cdb4923 100644 --- a/images/.svn/text-base/quadrado_cursor.png.svn-base +++ b/images/.svn/text-base/rectangle.png.svn-base Binary files differ diff --git a/images/.svn/text-base/roxo.png.svn-base b/images/.svn/text-base/roxo.png.svn-base deleted file mode 100644 index 517d950..0000000 --- a/images/.svn/text-base/roxo.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/salvar.png.svn-base b/images/.svn/text-base/salvar.png.svn-base deleted file mode 100644 index a71acb1..0000000 --- a/images/.svn/text-base/salvar.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/selecao.png.svn-base b/images/.svn/text-base/selecao.png.svn-base deleted file mode 100644 index af23183..0000000 --- a/images/.svn/text-base/selecao.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/star.png.svn-base b/images/.svn/text-base/star.png.svn-base new file mode 100644 index 0000000..0917569 --- /dev/null +++ b/images/.svn/text-base/star.png.svn-base Binary files differ diff --git a/images/.svn/text-base/letra_cursor.png.svn-base b/images/.svn/text-base/text.png.svn-base index 45c123f..45c123f 100644 --- a/images/.svn/text-base/letra_cursor.png.svn-base +++ b/images/.svn/text-base/text.png.svn-base Binary files differ diff --git a/images/.svn/text-base/trapezoid.png.svn-base b/images/.svn/text-base/trapezoid.png.svn-base new file mode 100644 index 0000000..304be9b --- /dev/null +++ b/images/.svn/text-base/trapezoid.png.svn-base Binary files differ diff --git a/images/.svn/text-base/trapezoid_cursor.png.svn-base b/images/.svn/text-base/trapezoid_cursor.png.svn-base deleted file mode 100644 index 5b82cb3..0000000 --- a/images/.svn/text-base/trapezoid_cursor.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/triangle.png.svn-base b/images/.svn/text-base/triangle.png.svn-base new file mode 100644 index 0000000..f01cf96 --- /dev/null +++ b/images/.svn/text-base/triangle.png.svn-base Binary files differ diff --git a/images/.svn/text-base/triangle_cursor.png.svn-base b/images/.svn/text-base/triangle_cursor.png.svn-base deleted file mode 100644 index 2a5e748..0000000 --- a/images/.svn/text-base/triangle_cursor.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/vassoura.png.svn-base b/images/.svn/text-base/vassoura.png.svn-base deleted file mode 100644 index cdc08f3..0000000 --- a/images/.svn/text-base/vassoura.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/verde.png.svn-base b/images/.svn/text-base/verde.png.svn-base deleted file mode 100644 index dcd55a3..0000000 --- a/images/.svn/text-base/verde.png.svn-base +++ /dev/null Binary files differ diff --git a/images/.svn/text-base/vermelho.png.svn-base b/images/.svn/text-base/vermelho.png.svn-base deleted file mode 100644 index a9a6d2c..0000000 --- a/images/.svn/text-base/vermelho.png.svn-base +++ /dev/null Binary files differ diff --git a/images/Thumbs.db b/images/Thumbs.db deleted file mode 100644 index 56a82a2..0000000 --- a/images/Thumbs.db +++ /dev/null Binary files differ diff --git a/images/abrir.png b/images/abrir.png deleted file mode 100644 index 04e99c3..0000000 --- a/images/abrir.png +++ /dev/null Binary files differ diff --git a/images/amarelo.png b/images/amarelo.png deleted file mode 100644 index 6f9cde4..0000000 --- a/images/amarelo.png +++ /dev/null Binary files differ diff --git a/images/arrow.png b/images/arrow.png new file mode 100644 index 0000000..7da3ec7 --- /dev/null +++ b/images/arrow.png Binary files differ diff --git a/images/azul.png b/images/azul.png deleted file mode 100644 index 33643b1..0000000 --- a/images/azul.png +++ /dev/null Binary files differ diff --git a/images/balde.png b/images/balde.png deleted file mode 100644 index 5edd1a3..0000000 --- a/images/balde.png +++ /dev/null Binary files differ diff --git a/images/borracha.png b/images/borracha.png deleted file mode 100644 index 3b0cede..0000000 --- a/images/borracha.png +++ /dev/null Binary files differ diff --git a/images/branco.png b/images/branco.png deleted file mode 100644 index d6b92eb..0000000 --- a/images/branco.png +++ /dev/null Binary files differ diff --git a/images/brush.png b/images/brush.png new file mode 100644 index 0000000..c47e1ab --- /dev/null +++ b/images/brush.png Binary files differ diff --git a/images/bucket.png b/images/bucket.png new file mode 100644 index 0000000..d3960a8 --- /dev/null +++ b/images/bucket.png Binary files differ diff --git a/images/circulo.png b/images/circulo.png deleted file mode 100644 index 513f0af..0000000 --- a/images/circulo.png +++ /dev/null Binary files differ diff --git a/images/corlinha.png b/images/corlinha.png deleted file mode 100644 index 40022ed..0000000 --- a/images/corlinha.png +++ /dev/null Binary files differ diff --git a/images/circulo_cursor.png b/images/ellipse.png index 5b60f38..5b60f38 100644 --- a/images/circulo_cursor.png +++ b/images/ellipse.png Binary files differ diff --git a/images/borracha_cursor.png b/images/eraser.png index 1b75507..1b75507 100644 --- a/images/borracha_cursor.png +++ b/images/eraser.png Binary files differ diff --git a/images/heart.png b/images/heart.png new file mode 100644 index 0000000..5e5029c --- /dev/null +++ b/images/heart.png Binary files differ diff --git a/images/lapis.png b/images/lapis.png deleted file mode 100644 index 5b697e8..0000000 --- a/images/lapis.png +++ /dev/null Binary files differ diff --git a/images/laranja.png b/images/laranja.png deleted file mode 100644 index 4321393..0000000 --- a/images/laranja.png +++ /dev/null Binary files differ diff --git a/images/letra.png b/images/letra.png deleted file mode 100644 index cf4eab1..0000000 --- a/images/letra.png +++ /dev/null Binary files differ diff --git a/images/linha_cursor.png b/images/line.png index b9ee7eb..b9ee7eb 100644 --- a/images/linha_cursor.png +++ b/images/line.png Binary files differ diff --git a/images/linha.png b/images/linha.png deleted file mode 100644 index 958332c..0000000 --- a/images/linha.png +++ /dev/null Binary files differ diff --git a/images/selecao_cursor.png b/images/marquee-rectangular.png index 5f34d60..5f34d60 100644 --- a/images/selecao_cursor.png +++ b/images/marquee-rectangular.png Binary files differ diff --git a/images/parallelogram.png b/images/parallelogram.png new file mode 100644 index 0000000..1927a78 --- /dev/null +++ b/images/parallelogram.png Binary files differ diff --git a/images/lapis_cursor.png b/images/pencil.png index 9b12986..9b12986 100644 --- a/images/lapis_cursor.png +++ b/images/pencil.png Binary files differ diff --git a/images/poligono.png b/images/poligono.png deleted file mode 100644 index 9d74ca6..0000000 --- a/images/poligono.png +++ /dev/null Binary files differ diff --git a/images/poligono_cursor.png b/images/polygon.png index 8e2b505..8e2b505 100644 --- a/images/poligono_cursor.png +++ b/images/polygon.png Binary files differ diff --git a/images/preto.png b/images/preto.png deleted file mode 100644 index 247077c..0000000 --- a/images/preto.png +++ /dev/null Binary files differ diff --git a/images/quadrado.png b/images/quadrado.png deleted file mode 100644 index 76aa304..0000000 --- a/images/quadrado.png +++ /dev/null Binary files differ diff --git a/images/quadrado_cursor.png b/images/rectangle.png index cdb4923..cdb4923 100644 --- a/images/quadrado_cursor.png +++ b/images/rectangle.png Binary files differ diff --git a/images/roxo.png b/images/roxo.png deleted file mode 100644 index 517d950..0000000 --- a/images/roxo.png +++ /dev/null Binary files differ diff --git a/images/salvar.png b/images/salvar.png deleted file mode 100644 index a71acb1..0000000 --- a/images/salvar.png +++ /dev/null Binary files differ diff --git a/images/selecao.png b/images/selecao.png deleted file mode 100644 index af23183..0000000 --- a/images/selecao.png +++ /dev/null Binary files differ diff --git a/images/star.png b/images/star.png new file mode 100644 index 0000000..0917569 --- /dev/null +++ b/images/star.png Binary files differ diff --git a/images/letra_cursor.png b/images/text.png index 45c123f..45c123f 100644 --- a/images/letra_cursor.png +++ b/images/text.png Binary files differ diff --git a/images/trapezoid.png b/images/trapezoid.png new file mode 100644 index 0000000..304be9b --- /dev/null +++ b/images/trapezoid.png Binary files differ diff --git a/images/trapezoid_cursor.png b/images/trapezoid_cursor.png deleted file mode 100644 index 5b82cb3..0000000 --- a/images/trapezoid_cursor.png +++ /dev/null Binary files differ diff --git a/images/triangle.png b/images/triangle.png new file mode 100644 index 0000000..f01cf96 --- /dev/null +++ b/images/triangle.png Binary files differ diff --git a/images/triangle_cursor.png b/images/triangle_cursor.png deleted file mode 100644 index 2a5e748..0000000 --- a/images/triangle_cursor.png +++ /dev/null Binary files differ diff --git a/images/vassoura.png b/images/vassoura.png deleted file mode 100644 index cdc08f3..0000000 --- a/images/vassoura.png +++ /dev/null Binary files differ diff --git a/images/verde.png b/images/verde.png deleted file mode 100644 index dcd55a3..0000000 --- a/images/verde.png +++ /dev/null Binary files differ diff --git a/images/vermelho.png b/images/vermelho.png deleted file mode 100644 index a9a6d2c..0000000 --- a/images/vermelho.png +++ /dev/null Binary files differ diff --git a/locale/.svn/entries b/locale/.svn/entries index bbf46a5..4004c30 100644 --- a/locale/.svn/entries +++ b/locale/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale https://oficina.googlecode.com/svn diff --git a/locale/de/.svn/entries b/locale/de/.svn/entries index 7bd0004..524d671 100644 --- a/locale/de/.svn/entries +++ b/locale/de/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/de https://oficina.googlecode.com/svn diff --git a/locale/de/LC_MESSAGES/.svn/entries b/locale/de/LC_MESSAGES/.svn/entries index 9efd5da..22de81d 100644 --- a/locale/de/LC_MESSAGES/.svn/entries +++ b/locale/de/LC_MESSAGES/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/de/LC_MESSAGES https://oficina.googlecode.com/svn @@ -32,7 +32,7 @@ file -2007-07-16T13:46:23.000000Z +2007-07-23T19:49:37.000000Z 1a5fae8a713c4f48db248ead156d205a 2007-07-13T22:56:50.473948Z 41 diff --git a/locale/de/LC_MESSAGES/Oficina.activity.mo b/locale/de/LC_MESSAGES/Oficina.activity.mo deleted file mode 100644 index c57437d..0000000 --- a/locale/de/LC_MESSAGES/Oficina.activity.mo +++ /dev/null Binary files differ diff --git a/locale/de/LC_MESSAGES/Oficina.mo b/locale/de/LC_MESSAGES/Oficina.mo deleted file mode 100644 index c57437d..0000000 --- a/locale/de/LC_MESSAGES/Oficina.mo +++ /dev/null Binary files differ diff --git a/locale/es/.svn/entries b/locale/es/.svn/entries index 6b01e58..65bd63d 100644 --- a/locale/es/.svn/entries +++ b/locale/es/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/es https://oficina.googlecode.com/svn diff --git a/locale/es/LC_MESSAGES/.svn/entries b/locale/es/LC_MESSAGES/.svn/entries index 6a400d5..d8b6264 100644 --- a/locale/es/LC_MESSAGES/.svn/entries +++ b/locale/es/LC_MESSAGES/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/es/LC_MESSAGES https://oficina.googlecode.com/svn @@ -32,7 +32,7 @@ file -2007-07-16T13:46:22.000000Z +2007-07-23T19:49:36.000000Z 10d7b66c12a5044cc830af0b5842875e 2007-07-13T22:56:50.473948Z 41 diff --git a/locale/es/LC_MESSAGES/Oficina.activity.mo b/locale/es/LC_MESSAGES/Oficina.activity.mo deleted file mode 100644 index 9c6a1d7..0000000 --- a/locale/es/LC_MESSAGES/Oficina.activity.mo +++ /dev/null Binary files differ diff --git a/locale/es/LC_MESSAGES/Oficina.mo b/locale/es/LC_MESSAGES/Oficina.mo deleted file mode 100644 index 9c6a1d7..0000000 --- a/locale/es/LC_MESSAGES/Oficina.mo +++ /dev/null Binary files differ diff --git a/locale/fr/.svn/entries b/locale/fr/.svn/entries index 87c364e..5e4d293 100644 --- a/locale/fr/.svn/entries +++ b/locale/fr/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/fr https://oficina.googlecode.com/svn diff --git a/locale/fr/LC_MESSAGES/.svn/entries b/locale/fr/LC_MESSAGES/.svn/entries index 755635c..850d4f0 100644 --- a/locale/fr/LC_MESSAGES/.svn/entries +++ b/locale/fr/LC_MESSAGES/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/fr/LC_MESSAGES https://oficina.googlecode.com/svn @@ -32,7 +32,7 @@ file -2007-07-16T13:46:22.000000Z +2007-07-23T19:49:37.000000Z 9e4ab40a3829a759492a4bbca2f000fd 2007-07-13T22:56:50.473948Z 41 diff --git a/locale/fr/LC_MESSAGES/Oficina.activity.mo b/locale/fr/LC_MESSAGES/Oficina.activity.mo deleted file mode 100644 index cb51301..0000000 --- a/locale/fr/LC_MESSAGES/Oficina.activity.mo +++ /dev/null Binary files differ diff --git a/locale/fr/LC_MESSAGES/Oficina.mo b/locale/fr/LC_MESSAGES/Oficina.mo deleted file mode 100644 index cb51301..0000000 --- a/locale/fr/LC_MESSAGES/Oficina.mo +++ /dev/null Binary files differ diff --git a/locale/ko_KO/.svn/entries b/locale/ko_KO/.svn/entries index b9b0e84..44ab2f9 100644 --- a/locale/ko_KO/.svn/entries +++ b/locale/ko_KO/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/ko_KO https://oficina.googlecode.com/svn diff --git a/locale/ko_KO/LC_MESSAGES/.svn/entries b/locale/ko_KO/LC_MESSAGES/.svn/entries index 5622547..356307d 100644 --- a/locale/ko_KO/LC_MESSAGES/.svn/entries +++ b/locale/ko_KO/LC_MESSAGES/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/ko_KO/LC_MESSAGES https://oficina.googlecode.com/svn @@ -32,7 +32,7 @@ file -2007-07-16T13:46:21.000000Z +2007-07-23T19:49:36.000000Z fbd4c5e033eaf250ab184dcfa0b75c56 2007-07-13T22:56:50.473948Z 41 diff --git a/locale/ko_KO/LC_MESSAGES/Oficina.activity.mo b/locale/ko_KO/LC_MESSAGES/Oficina.activity.mo deleted file mode 100644 index 0a433fd..0000000 --- a/locale/ko_KO/LC_MESSAGES/Oficina.activity.mo +++ /dev/null Binary files differ diff --git a/locale/ko_KO/LC_MESSAGES/Oficina.mo b/locale/ko_KO/LC_MESSAGES/Oficina.mo deleted file mode 100644 index 0a433fd..0000000 --- a/locale/ko_KO/LC_MESSAGES/Oficina.mo +++ /dev/null Binary files differ diff --git a/locale/pt_BR/.svn/entries b/locale/pt_BR/.svn/entries index c5c5afa..6999124 100644 --- a/locale/pt_BR/.svn/entries +++ b/locale/pt_BR/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/pt_BR https://oficina.googlecode.com/svn diff --git a/locale/pt_BR/LC_MESSAGES/.svn/entries b/locale/pt_BR/LC_MESSAGES/.svn/entries index cdd442e..ca6eb27 100644 --- a/locale/pt_BR/LC_MESSAGES/.svn/entries +++ b/locale/pt_BR/LC_MESSAGES/.svn/entries @@ -1,7 +1,7 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/locale/pt_BR/LC_MESSAGES https://oficina.googlecode.com/svn @@ -32,7 +32,7 @@ file -2007-07-16T13:46:22.000000Z +2007-07-23T19:49:36.000000Z 563ecd9666f4e0b4663ea56ffcca0542 2007-07-13T22:56:50.473948Z 41 diff --git a/locale/pt_BR/LC_MESSAGES/Oficina.activity.mo b/locale/pt_BR/LC_MESSAGES/Oficina.activity.mo deleted file mode 100644 index 251bcbc..0000000 --- a/locale/pt_BR/LC_MESSAGES/Oficina.activity.mo +++ /dev/null Binary files differ diff --git a/locale/pt_BR/LC_MESSAGES/Oficina.mo b/locale/pt_BR/LC_MESSAGES/Oficina.mo deleted file mode 100644 index 251bcbc..0000000 --- a/locale/pt_BR/LC_MESSAGES/Oficina.mo +++ /dev/null Binary files differ diff --git a/po/.svn/all-wcprops b/po/.svn/all-wcprops index fcf818f..a36d377 100644 --- a/po/.svn/all-wcprops +++ b/po/.svn/all-wcprops @@ -1,37 +1,37 @@ K 25 svn:wc:ra_dav:version-url V 25 -/svn/!svn/ver/41/trunk/po +/svn/!svn/ver/65/trunk/po END ko_KO.po K 25 svn:wc:ra_dav:version-url V 34 -/svn/!svn/ver/41/trunk/po/ko_KO.po +/svn/!svn/ver/65/trunk/po/ko_KO.po END pt_BR.po K 25 svn:wc:ra_dav:version-url V 34 -/svn/!svn/ver/41/trunk/po/pt_BR.po +/svn/!svn/ver/65/trunk/po/pt_BR.po END es.po K 25 svn:wc:ra_dav:version-url V 31 -/svn/!svn/ver/41/trunk/po/es.po +/svn/!svn/ver/65/trunk/po/es.po END fr.po K 25 svn:wc:ra_dav:version-url V 31 -/svn/!svn/ver/41/trunk/po/fr.po +/svn/!svn/ver/65/trunk/po/fr.po END de.po K 25 svn:wc:ra_dav:version-url V 31 -/svn/!svn/ver/41/trunk/po/de.po +/svn/!svn/ver/65/trunk/po/de.po END drawing.pot K 25 diff --git a/po/.svn/entries b/po/.svn/entries index b532295..a3a57c9 100644 --- a/po/.svn/entries +++ b/po/.svn/entries @@ -1,14 +1,14 @@ 8 dir -52 +76 https://oficina.googlecode.com/svn/trunk/po https://oficina.googlecode.com/svn -2007-07-13T22:56:50.473948Z -41 +2007-07-19T17:35:08.902664Z +65 nathalia.sautchuk @@ -32,10 +32,10 @@ file -2007-07-16T13:46:29.000000Z -8c644fadb9660b2fb07a11846c6b7900 -2007-07-13T22:56:50.473948Z -41 +2007-07-23T19:49:41.000000Z +4a3745f24134b94d3c55db2d7026ba22 +2007-07-19T17:35:08.902664Z +65 nathalia.sautchuk pt_BR.po @@ -44,10 +44,10 @@ file -2007-07-16T13:46:29.000000Z -b2e05a0fd5530d3772c28453d1b106a1 -2007-07-13T22:56:50.473948Z -41 +2007-07-23T19:49:41.000000Z +96280528c3e9da1a97d7477b8f75b14a +2007-07-19T17:35:08.902664Z +65 nathalia.sautchuk has-props @@ -57,10 +57,10 @@ file -2007-07-16T13:46:29.000000Z -e88459a19ba80e8b59acbcd8f67834ca -2007-07-13T22:56:50.473948Z -41 +2007-07-23T19:49:41.000000Z +f505bdee1059265202d352259e838aac +2007-07-19T17:35:08.902664Z +65 nathalia.sautchuk fr.po @@ -69,10 +69,10 @@ file -2007-07-16T13:46:29.000000Z -d6972e311ed59507c476e30f4565d360 -2007-07-13T22:56:50.473948Z -41 +2007-07-23T19:49:41.000000Z +f8c40fc8939fe3f15301d5af4200b195 +2007-07-19T17:35:08.902664Z +65 nathalia.sautchuk de.po @@ -81,10 +81,10 @@ file -2007-07-16T13:46:29.000000Z -ae0a63654c59c81748249cb02736b290 -2007-07-13T22:56:50.473948Z -41 +2007-07-23T19:49:41.000000Z +87393b60ac4d564b4019de00f56a5170 +2007-07-19T17:35:08.902664Z +65 nathalia.sautchuk drawing.pot @@ -93,7 +93,7 @@ file -2007-07-16T13:46:29.000000Z +2007-07-23T19:49:41.000000Z e9e60f2af2022cddcf4d58e18a6491b8 2007-07-13T22:56:50.473948Z 41 diff --git a/po/.svn/text-base/de.po.svn-base b/po/.svn/text-base/de.po.svn-base index 20a9afa..60872b8 100644 --- a/po/.svn/text-base/de.po.svn-base +++ b/po/.svn/text-base/de.po.svn-base @@ -1,12 +1,35 @@ -# German translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Nathalia , 2007. -# +""" German translations for Oficina +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:18-0300\n" "Last-Translator: Nathalia \n" diff --git a/po/.svn/text-base/es.po.svn-base b/po/.svn/text-base/es.po.svn-base index 4916f8f..29bd379 100644 --- a/po/.svn/text-base/es.po.svn-base +++ b/po/.svn/text-base/es.po.svn-base @@ -1,12 +1,35 @@ -# Spanish translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Nathalia , 2007. -# +"""Spanish translations for Oficina +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:17-0300\n" "Last-Translator: Nathalia \n" diff --git a/po/.svn/text-base/fr.po.svn-base b/po/.svn/text-base/fr.po.svn-base index 4ff2d09..ebcf522 100644 --- a/po/.svn/text-base/fr.po.svn-base +++ b/po/.svn/text-base/fr.po.svn-base @@ -1,12 +1,35 @@ -# French translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Nathalia , 2007. -# +"""French translations for Oficina +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:15-0300\n" "Last-Translator: Nathalia \n" diff --git a/po/.svn/text-base/ko_KO.po.svn-base b/po/.svn/text-base/ko_KO.po.svn-base index b4929a0..d3c5210 100644 --- a/po/.svn/text-base/ko_KO.po.svn-base +++ b/po/.svn/text-base/ko_KO.po.svn-base @@ -1,15 +1,39 @@ -# Korean translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Do Young-Min , 2007. -# +"""Korean translations for Oficina package. +Description file +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:19-0300\n" -"Last-Translator: Nathalia \n" +"Last-Translator: Do Young-Min \n" "Language-Team: Korean\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" diff --git a/po/.svn/text-base/pt_BR.po.svn-base b/po/.svn/text-base/pt_BR.po.svn-base index 62d63ef..f9abb1d 100644 --- a/po/.svn/text-base/pt_BR.po.svn-base +++ b/po/.svn/text-base/pt_BR.po.svn-base @@ -1,12 +1,35 @@ -# Portuguese translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Nathalia , 2007. -# +"""Portuguese translations for Oficina package. +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:00-0300\n" "Last-Translator: Nathalia \n" diff --git a/po/de.po b/po/de.po index 20a9afa..60872b8 100644 --- a/po/de.po +++ b/po/de.po @@ -1,12 +1,35 @@ -# German translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Nathalia , 2007. -# +""" German translations for Oficina +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:18-0300\n" "Last-Translator: Nathalia \n" diff --git a/po/es.po b/po/es.po index 4916f8f..29bd379 100644 --- a/po/es.po +++ b/po/es.po @@ -1,12 +1,35 @@ -# Spanish translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Nathalia , 2007. -# +"""Spanish translations for Oficina +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:17-0300\n" "Last-Translator: Nathalia \n" diff --git a/po/fr.po b/po/fr.po index 4ff2d09..ebcf522 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1,12 +1,35 @@ -# French translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Nathalia , 2007. -# +"""French translations for Oficina +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:15-0300\n" "Last-Translator: Nathalia \n" diff --git a/po/ko_KO.po b/po/ko_KO.po index b4929a0..d3c5210 100644 --- a/po/ko_KO.po +++ b/po/ko_KO.po @@ -1,15 +1,39 @@ -# Korean translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Do Young-Min , 2007. -# +"""Korean translations for Oficina package. +Description file +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:19-0300\n" -"Last-Translator: Nathalia \n" +"Last-Translator: Do Young-Min \n" "Language-Team: Korean\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" diff --git a/po/pt_BR.po b/po/pt_BR.po index 62d63ef..f9abb1d 100755 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -1,12 +1,35 @@ -# Portuguese translations for Oficina package. -# Copyright (C) 2007 GNU General Public License -# This file is distributed under the same license as the Oficina package. -# Nathalia , 2007. -# +"""Portuguese translations for Oficina package. +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politecnica of +Universidade de Sao Paulo. NATE is part of LSI (Integrated +Systems Laboratory) and stands for Learning, Work and +Entertainment Center. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. +""" + msgid "" msgstr "" "Project-Id-Version: 1.0\n" -"Report-Msgid-Bugs-To: Irene \n" +"Report-Msgid-Bugs-To: Oficina \n" "POT-Creation-Date: 2007-07-13 17:56-0300\n" "PO-Revision-Date: 2007-07-13 18:00-0300\n" "Last-Translator: Nathalia \n" diff --git a/setup.py b/setup.py index ea4fdfa..876cd3f 100755 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -#!/bin/env python +#!/usr/bin/python # Copyright (C) 2006, Red Hat, Inc. # diff --git a/toolbox.py b/toolbox.py index 89e7871..4e84257 100644 --- a/toolbox.py +++ b/toolbox.py @@ -1,3 +1,57 @@ +# -*- coding: utf-8 -*- +""" +toolbox.py + +Create Oficina Toolbar in Sugar + + +Copyright 2007, NATE-LSI-EPUSP + +Oficina is developed in Brazil at Escola Politécnica of +Universidade de São Paulo. NATE is part of LSI (Integrable +Systems Laboratory) and stands for Learning, Work and Entertainment +Research Group. Visit our web page: +www.nate.lsi.usp.br +Suggestions, bugs and doubts, please email oficina@lsi.usp.br + +Oficina is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 of +the License. + +Oficina 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 +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with Oficina; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA. +The copy of the GNU General Public License is found in the +COPYING file included in the source distribution. + + +Authors: + +Joyce Alessandra Saul (joycealess@gmail.com) +Andre Mossinato (andremossinato@gmail.com) +Nathalia Sautchuk Patrício (nathalia.sautchuk@gmail.com) +Pedro Kayatt (pekayatt@gmail.com) +Rafael Barbolo Lopes (barbolo@gmail.com) +Alexandre A. Gonçalves Martinazzo (alexandremartinazzo@gmail.com) + +Colaborators: +Bruno Gola (brunogola@gmail.com) + +Group Manager: +Irene Karaguilla Ficheman (irene@lsi.usp.br) + +Cientific Coordinator: +Roseli de Deus Lopes (roseli@lsi.usp.br) + +""" + from gettext import gettext as _ import gtk @@ -10,8 +64,6 @@ from sugar.graphics.toggletoolbutton import ToggleToolButton from sugar.graphics.combobox import ComboBox from sugar.graphics.palette import Palette -from Cursors import Cursors - class Toolbox(ActivityToolbox): def __init__(self, activity): ActivityToolbox.__init__(self, activity) @@ -50,29 +102,48 @@ class Toolbox(ActivityToolbox): class DrawEditToolbar(EditToolbar): def __init__(self, activity): EditToolbar.__init__(self) + + self._activity = activity - self.undo.connect('clicked', undo, activity) - self.redo.connect('clicked', redo, activity) +# self.undo.connect('clicked', undo, activity) +# self.redo.connect('clicked', redo, activity) + self.undo.connect('clicked', self._undo_cb) + self.redo.connect('clicked', self._redo_cb) - #FIXME: buttons are not connected to the right callback - self.copy.connect('clicked', test_connect, activity, 'copy') - self.paste.connect('clicked', test_connect, activity, 'paste') +# self.copy.connect('clicked', test_connect, activity, 'copy') +# self.paste.connect('clicked', test_connect, activity, 'paste') + self.copy.connect('clicked', self._copy_cb) + self.paste.connect('clicked', self._paste_cb) self.copy.hide() self.paste.hide() + + def _undo_cb(self, widget, data=None): + self._activity._area.undo() + + def _redo_cb(self, widget, data=None): + self._activity._area.redo() + + def _copy_cb(self, widget, data=None): + #FIXME: connect to the correct function + pass + + def _paste_cb(self, widget, data=None): + #FIXME: connect to the correct function + pass class ToolsToolbar(gtk.Toolbar): - _TOOL_PENCIL = 2 - _TOOL_BRUSH = 29 - _TOOL_ERASER = 3 - _TOOL_POLYGON = 27 - _TOOL_BUCKET = 28 - _TOOL_MARQUEE_ELLIPTICAL = 5 - _TOOL_MARQUEE_FREEFORM = 2 - _TOOL_MARQUEE_RECTANGULAR = 26 - _TOOL_MARQUEE_SMART = 2 + _TOOL_PENCIL = 'pencil' + _TOOL_BRUSH = 'brush' + _TOOL_ERASER = 'eraser' + _TOOL_POLYGON = 'polygon' + _TOOL_BUCKET = 'bucket' + _TOOL_MARQUEE_ELLIPTICAL = 'marquee-elliptical' + _TOOL_MARQUEE_FREEFORM = 'marquee-freeform' + _TOOL_MARQUEE_RECTANGULAR = 'marquee-rectangular' + _TOOL_MARQUEE_SMART = 'marquee-smart' def __init__(self, activity): @@ -96,15 +167,16 @@ class ToolsToolbar(gtk.Toolbar): self.insert(self._icon_stroke, -1) self._icon_stroke.show() - tool_item = ComboStrokeColors(activity) - self.insert(tool_item, -1) - tool_item.show() + self._stroke_color = ComboStrokeColors(activity) + self.insert(self._stroke_color, -1) + self._stroke_color.show() - tool_item = ComboStrokeSize(activity) - self.insert(tool_item, -1) - tool_item.show() + self._stroke_size = ComboStrokeSize(activity) + self.insert(self._stroke_size, -1) + self._stroke_size.show() separator = gtk.SeparatorToolItem() + separator.set_draw(True) self.insert(separator, -1) separator.show() @@ -116,14 +188,16 @@ class ToolsToolbar(gtk.Toolbar): self._tool_brush = ToolButton('tool-brush') self.insert(self._tool_brush, -1) self._tool_brush.show() - self._tool_brush.set_tooltip(_('Brush')) + #self._tool_brush.set_tooltip(_('Brush')) self._brush_palette = self.create_palette('Brush') self._tool_brush.set_palette(self._brush_palette) self._tool_eraser = ToolButton('tool-eraser') self.insert(self._tool_eraser, -1) self._tool_eraser.show() - self._tool_eraser.set_tooltip(_('Eraser')) + #self._tool_eraser.set_tooltip(_('Eraser')) + self._eraser_palette = self.create_palette('Eraser') + self._tool_eraser.set_palette(self._eraser_palette) self._tool_polygon = ToolButton('tool-polygon') self.insert(self._tool_polygon, -1) @@ -137,7 +211,6 @@ class ToolsToolbar(gtk.Toolbar): """ - self._tool_marquee_elliptical = ToolButton('tool-marquee-elliptical') self.insert(self._tool_marquee_elliptical, -1) self._tool_marquee_elliptical.show() @@ -152,12 +225,15 @@ class ToolsToolbar(gtk.Toolbar): self.insert(self._tool_marquee_smart, -1) self._tool_marquee_smart.show() self._tool_marquee_smart.set_tooltip(_('Smart Marquee')) + """ + self._tool_marquee_rectangular = ToolButton('tool-marquee-rectangular') self.insert(self._tool_marquee_rectangular, -1) self._tool_marquee_rectangular.show() self._tool_marquee_rectangular.set_tooltip(_('Rectangular Marquee')) - + + ''' self._tool_polygon.connect('clicked', set_tool, activity, 'tool-polygon', self._TOOL_POLYGON) self._tool_pencil.connect('clicked', set_tool, activity, 'tool-pencil', self._TOOL_PENCIL) self._tool_brush.connect('clicked', set_tool, activity, 'tool-brush', self._TOOL_BRUSH) @@ -167,12 +243,26 @@ class ToolsToolbar(gtk.Toolbar): #self._tool_marquee_freeform.connect('clicked', set_tool, activity, 'tool-marquee-freeform', self._TOOL_MARQUEE_FREEFORM) self._tool_marquee_rectangular.connect('clicked', set_tool, activity, 'tool-marquee-rectangular', self._TOOL_MARQUEE_RECTANGULAR) #self._tool_marquee_smart.connect('clicked', set_tool, activity, 'tool-marquee-smart', self._TOOL_MARQUEE_SMART) - - def create_palette(self, data=None): - if data == None: + ''' + + # New connect method + self._tool_polygon.connect('clicked', self.set_tool, self._TOOL_POLYGON) + self._tool_pencil.connect('clicked', self.set_tool, self._TOOL_PENCIL) + self._tool_brush.connect('clicked', self.set_tool, self._TOOL_BRUSH) + self._tool_eraser.connect('clicked', self.set_tool, self._TOOL_ERASER) + self._tool_bucket.connect('clicked', self.set_tool, self._TOOL_BUCKET) + #self._tool_marquee_elliptical.connect('clicked', self.set_tool, self._TOOL_MARQUEE_ELLIPTICAL) + #self._tool_marquee_freeform.connect('clicked', self.set_tool, self._TOOL_MARQUEE_FREEFORM) + self._tool_marquee_rectangular.connect('clicked', self.set_tool, self._TOOL_MARQUEE_RECTANGULAR) + #self._tool_marquee_smart.connect('clicked', self.set_tool, self._TOOL_MARQUEE_SMART) + + def create_palette(self, tool=None): + + #TODO: create palettes for other tools. + if tool == None: return None - elif data == 'Brush': - palette = Palette(_(data)) + elif (tool == 'Brush') or (tool == 'Eraser'): + palette = Palette(_(tool)) item_1 = gtk.MenuItem(_('Square')) item_2 = gtk.MenuItem(_('Circle')) @@ -180,85 +270,184 @@ class ToolsToolbar(gtk.Toolbar): palette.append_menu_item(item_2) item_1.show() item_2.show() - item_1.connect('activate', self.test, 'square') - item_2.connect('activate', self.test, 'circle') + item_1.connect('activate', self.set_shape, tool, 'square') + item_2.connect('activate', self.set_shape, tool,'circle') return palette - def test(self, button, data=None): - print button, data - self._activity._area.brush_shape = data + def set_shape(self, button, tool, shape): + ''' + Set a tool shape according to user choice at Tool Palette + ''' + + if tool == 'Brush': + self._activity._area.brush_shape = shape + elif tool == 'Eraser': + self._activity._area.eraser_shape = shape + + def set_tool(self, widget, tool): + ''' + Set tool to the Area object. Configures tool's color and size. + ''' + + # setting tool + self._activity._area.tool = tool + + # setting size and color + size = self._stroke_size.get_size() + self._stroke_size.set_stroke_size(size) + + color = self._stroke_color.get_color() + self._stroke_color.set_stroke_color(color) + + #setting cursor + try: + pixbuf = gtk.gdk.pixbuf_new_from_file('./images/' + tool + '.png') + cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pixbuf, 6, 21) + except: + cursor = None + + self._activity._area.window.set_cursor(cursor) class ComboFillColors(ToolComboBox): - - _ACTION_BLACK = 0 - _ACTION_PURPLE = 1 - _ACTION_YELLOW = 2 - _ACTION_BLUE = 3 - _ACTION_GREEN = 4 - _ACTION_RED = 5 - _ACTION_ORANGE = 6 - _ACTION_WHITE = 7 - + """Class to manage Fill colors """ + def __init__(self, activity): + """Initialize the object + + Keyword arguments: + activity -- the OficinaActivity object + """ + ToolComboBox.__init__(self) self._activity = activity self._fill_color = self.combo - self._fill_color.append_item(self._ACTION_BLACK, _('Black')) - self._fill_color.append_item(self._ACTION_PURPLE, _('Purple')) - self._fill_color.append_item(self._ACTION_YELLOW, _('Yellow')) - self._fill_color.append_item(self._ACTION_BLUE, _('Blue')) - self._fill_color.append_item(self._ACTION_GREEN, _('Green')) - self._fill_color.append_item(self._ACTION_RED, _('Red')) - self._fill_color.append_item(self._ACTION_ORANGE, _('Orange')) - self._fill_color.append_item(self._ACTION_WHITE, _('White')) + self._fill_color.append_item(self.alloc_color('#000000'), _('Black')) + self._fill_color.append_item(self.alloc_color('#ffffff'), _('White')) + self._fill_color.append_item(self.alloc_color('#800000'), _('Maroon')) + self._fill_color.append_item(self.alloc_color('#ff0000'), _('Red')) + self._fill_color.append_item(self.alloc_color('#808000'), _('Olive')) + self._fill_color.append_item(self.alloc_color('#ffff00'), _('Yellow')) + self._fill_color.append_item(self.alloc_color('#008000'), _('Green')) + self._fill_color.append_item(self.alloc_color('#00ff00'), _('Lime')) + self._fill_color.append_item(self.alloc_color('#008080'), _('Teal')) + self._fill_color.append_item(self.alloc_color('#00ffff'), _('Aqua')) + self._fill_color.append_item(self.alloc_color('#000080'), _('Navy')) + self._fill_color.append_item(self.alloc_color('#0000ff'), _('Blue')) + self._fill_color.append_item(self.alloc_color('#800080'), _('Purple')) + self._fill_color.append_item(self.alloc_color('#ff00ff'), _('Fuchsia')) self._fill_color.set_active(0) - self._fill_color.connect('changed', self.set_fill_color) + self._fill_color.connect('changed', self._combo_changed_cb) + def alloc_color(self, color): + """Alloc new color. - def set_fill_color(self, combo): - color = combo.get_active() - self._activity._area._set_fill_color(color) + Keyword arguments: + color -- hexadecimal number + + Return: + a gdk.Color object + """ + colormap = self.get_colormap() + _COLOR_ = colormap.alloc_color(color, True, True) + return _COLOR_ + def _combo_changed_cb(self, combo): + color = self.get_color() + self.set_fill_color(color) -class ComboStrokeColors(ToolComboBox): + def set_fill_color(self, color): + """Set the fill color in Area + + Keyword arguments: + color -- a gdk.Color object - _ACTION_BLACK = 0 - _ACTION_PURPLE = 1 - _ACTION_YELLOW = 2 - _ACTION_BLUE = 3 - _ACTION_GREEN = 4 - _ACTION_RED = 5 - _ACTION_ORANGE = 6 - _ACTION_WHITE = 7 + """ + self._activity._area._set_fill_color(color) + + def get_color(self): + """Get the fill color from combobox + Return: + a gdk.Color object + + """ + model = self.combo.get_model() + active = self.combo.get_active() + return model[active][0] + + +class ComboStrokeColors(ToolComboBox): + """Class to manage Stroke colors """ + def __init__(self, activity): + """Initialize the object + + Keyword arguments: + activity -- the OficinaActivity object + """ + ToolComboBox.__init__(self) - self._stroke_color = self.combo self._activity = activity - self._stroke_color.append_item(self._ACTION_BLACK, _('Black')) - self._stroke_color.append_item(self._ACTION_PURPLE, _('Purple')) - self._stroke_color.append_item(self._ACTION_YELLOW, _('Yellow')) - self._stroke_color.append_item(self._ACTION_BLUE, _('Blue')) - self._stroke_color.append_item(self._ACTION_GREEN, _('Green')) - self._stroke_color.append_item(self._ACTION_RED, _('Red')) - self._stroke_color.append_item(self._ACTION_ORANGE, _('Orange')) - self._stroke_color.append_item(self._ACTION_WHITE, _('White')) + self._stroke_color = self.combo + self._stroke_color.append_item(self.alloc_color('#000000'), _('Black')) + self._stroke_color.append_item(self.alloc_color('#ffffff'), _('White')) + self._stroke_color.append_item(self.alloc_color('#800000'), _('Maroon')) + self._stroke_color.append_item(self.alloc_color('#ff0000'), _('Red')) + self._stroke_color.append_item(self.alloc_color('#808000'), _('Olive')) + self._stroke_color.append_item(self.alloc_color('#ffff00'), _('Yellow')) + self._stroke_color.append_item(self.alloc_color('#008000'), _('Green')) + self._stroke_color.append_item(self.alloc_color('#00ff00'), _('Lime')) + self._stroke_color.append_item(self.alloc_color('#008080'), _('Teal')) + self._stroke_color.append_item(self.alloc_color('#00ffff'), _('Aqua')) + self._stroke_color.append_item(self.alloc_color('#000080'), _('Navy')) + self._stroke_color.append_item(self.alloc_color('#0000ff'), _('Blue')) + self._stroke_color.append_item(self.alloc_color('#800080'), _('Purple')) + self._stroke_color.append_item(self.alloc_color('#ff00ff'), _('Fuchsia')) self._stroke_color.set_active(0) - #self._stroke_color.connect('changed', self._combo_changed_cb) - self._stroke_color.connect('changed', self.set_stroke_color) - self.connect("focus", self.event_focus) - - def event_focus(self, combo): - print 'combostroke gained focus' - - def set_stroke_color(self, combo): - color = combo.get_active() + self._stroke_color.connect('changed', self._combo_changed_cb) + + def alloc_color(self, color): + """Alloc new color. + + Keyword arguments: + color -- hexadecimal number + + Return: + a gdk.Color object + + """ + colormap = self.get_colormap() + _COLOR_ = colormap.alloc_color(color, True, True) + return _COLOR_ + + def _combo_changed_cb(self, combo): + color = self.get_color() + self.set_stroke_color(color) + + def get_color(self): + """Get the fill color from combobox + + Return: + a gdk.Color object + + """ + model = self.combo.get_model() + active = self.combo.get_active() + return model[active][0] + + def set_stroke_color(self, color): + """Set the fill color in Area + + Keyword arguments: + color -- a gdk.Color object + + """ self._activity._area._set_stroke_color(color) @@ -272,11 +461,13 @@ class ComboStrokeSize(ToolComboBox): _ACTION_20 = 20 _ACTION_50 = 50 _ACTION_100 = 100 + """ _ACTION_500 = 500 _ACTION_1000 = 1000 _ACTION_5000 = 5000 _ACTION_10000 = 10000 _ACTION_100000 = 100000 + """ def __init__(self, activity): ToolComboBox.__init__(self) @@ -284,65 +475,78 @@ class ComboStrokeSize(ToolComboBox): self._stroke_size = self.combo self._stroke_size.append_item(self._ACTION_1, _('1')) - self._stroke_size.append_item(self._ACTION_2, _('2')) + self._stroke_size.append_item(self._ACTION_2, _('2')) self._stroke_size.append_item(self._ACTION_3, _('3')) self._stroke_size.append_item(self._ACTION_5, _('5')) self._stroke_size.append_item(self._ACTION_10, _('10')) self._stroke_size.append_item(self._ACTION_20, _('20')) self._stroke_size.append_item(self._ACTION_50, _('50')) self._stroke_size.append_item(self._ACTION_100, _('100')) + """ self._stroke_size.append_item(self._ACTION_500, _('500')) self._stroke_size.append_item(self._ACTION_1000, _('1000')) self._stroke_size.append_item(self._ACTION_5000, _('5000')) self._stroke_size.append_item(self._ACTION_10000, _('10000')) self._stroke_size.append_item(self._ACTION_100000, _('100000')) + """ - self._stroke_size.set_active(0) + self._stroke_size.set_active(1) self._stroke_size.connect('changed', self._combo_changed_cb) def _combo_changed_cb(self, combo): - set_stroke_size(self._activity, combo.get_active()) - +# model = combo.get_model() +# active = combo.get_active() +# self.set_stroke_size(model[active][0]) + size = self.get_size() + self.set_stroke_size(size) + + def set_stroke_size(self, size): + self._activity._area.configure_line(size) + + def get_size(self): + model = self.combo.get_model() + active = self.combo.get_active() + return model[active][0] class ShapesToolbar(gtk.Toolbar): - _TOOL_SHAPE_ARROW = 0 - _TOOL_SHAPE_CURVE = 0 - _TOOL_SHAPE_ELLIPSE = 5 - _TOOL_SHAPE_FREEFORM = 0 - _TOOL_SHAPE_HEART = 0 - _TOOL_SHAPE_LINE = 1 - _TOOL_SHAPE_PARALLELOGRAM = 0 - _TOOL_SHAPE_POLYGON = 27 - _TOOL_SHAPE_RECTANGLE = 6 - _TOOL_SHAPE_STAR = 0 - _TOOL_SHAPE_TRAPEZOID = 31 - _TOOL_SHAPE_TRIANGLE = 30 + _TOOL_SHAPE_ARROW = 'arrow' + _TOOL_SHAPE_CURVE = 'curve' + _TOOL_SHAPE_ELLIPSE = 'ellipse' + _TOOL_SHAPE_FREEFORM = 'freeform' + _TOOL_SHAPE_HEART = 'heart' + _TOOL_SHAPE_LINE = 'line' + _TOOL_SHAPE_PARALLELOGRAM = 'parallelogram' + _TOOL_SHAPE_POLYGON = 'polygon' + _TOOL_SHAPE_RECTANGLE = 'rectangle' + _TOOL_SHAPE_STAR = 'star' + _TOOL_SHAPE_TRAPEZOID = 'trapezoid' + _TOOL_SHAPE_TRIANGLE = 'triangle' def __init__(self, activity): gtk.Toolbar.__init__(self) + self._activity = activity + self._icon_fill = ToolButton('icon-fill') self.insert(self._icon_fill, -1) self._icon_fill.show() - - # FIXME: This should be a file picker instead of a combobox - - tool_item = ComboFillColors(activity) - self.insert(tool_item, -1) - tool_item.show() + + self._fill_color = ComboFillColors(activity) + self.insert(self._fill_color, -1) + self._fill_color.show() self._icon_stroke = ToolButton('icon-stroke') self.insert(self._icon_stroke, -1) self._icon_stroke.show() - tool_item = ComboStrokeColors(activity) - self.insert(tool_item, -1) - tool_item.show() + self._stroke_color = ComboStrokeColors(activity) + self.insert(self._stroke_color, -1) + self._stroke_color.show() - tool_item = ComboStrokeSize(activity) - self.insert(tool_item, -1) - tool_item.show() + self._stroke_size = ComboStrokeSize(activity) + self.insert(self._stroke_size, -1) + self._stroke_size.show() separator = gtk.SeparatorToolItem() self.insert(separator, -1) @@ -378,6 +582,8 @@ class ShapesToolbar(gtk.Toolbar): self._tool_shape_heart.show() self._tool_shape_heart.set_tooltip(_('Heart')) + """ + self._tool_shape_parallelogram = ToolButton('tool-shape-parallelogram') self.insert(self._tool_shape_parallelogram, -1) self._tool_shape_parallelogram.show() @@ -393,8 +599,6 @@ class ShapesToolbar(gtk.Toolbar): self._tool_shape_star.show() self._tool_shape_star.set_tooltip(_('Star')) - """ - self._tool_shape_trapezoid = ToolButton('tool-shape-trapezoid') self.insert(self._tool_shape_trapezoid, -1) self._tool_shape_trapezoid.show() @@ -405,32 +609,72 @@ class ShapesToolbar(gtk.Toolbar): self._tool_shape_triangle.show() self._tool_shape_triangle.set_tooltip(_('Triangle')) - #self._tool_shape_arrow.connect('clicked', set_tool, activity, 'tool-shape-arrow', self._TOOL_SHAPE_ARROW) + ''' + self._tool_shape_arrow.connect('clicked', set_tool, activity, 'tool-shape-arrow', self._TOOL_SHAPE_ARROW) self._tool_shape_ellipse.connect('clicked', set_tool, activity, 'tool-shape-ellipse', self._TOOL_SHAPE_ELLIPSE) #self._tool_shape_freeform.connect('clicked', set_tool, activity, 'tool-shape-freeform', self._TOOL_SHAPE_FREEFORM) #self._tool_shape_heart.connect('clicked', set_tool, activity, 'tool-shape-heart', self._TOOL_SHAPE_HEART) self._tool_shape_line.connect('clicked', set_tool, activity, 'tool-shape-line', self._TOOL_SHAPE_LINE) - #self._tool_shape_parallelogram.connect('clicked', set_tool, activity, 'tool-shape-parallelogram', self._TOOL_SHAPE_PARALLELOGRAM) + self._tool_shape_parallelogram.connect('clicked', set_tool, activity, 'tool-shape-parallelogram', self._TOOL_SHAPE_PARALLELOGRAM) #self._tool_shape_polygon.connect('clicked', set_tool, activity, 'tool-shape-polygon', self._TOOL_SHAPE_POLYGON) self._tool_shape_rectangle.connect('clicked', set_tool, activity, 'tool-shape-rectangle', self._TOOL_SHAPE_RECTANGLE) - #self._tool_shape_star.connect('clicked', set_tool, activity, 'tool-shape-star', self._TOOL_SHAPE_STAR) + self._tool_shape_star.connect('clicked', set_tool, activity, 'tool-shape-star', self._TOOL_SHAPE_STAR) self._tool_shape_trapezoid.connect('clicked', set_tool, activity, 'tool-shape-trapezoid', self._TOOL_SHAPE_TRAPEZOID) self._tool_shape_triangle.connect('clicked', set_tool, activity, 'tool-shape-triangle', self._TOOL_SHAPE_TRIANGLE) - + ''' + + self._tool_shape_arrow.connect('clicked', self.set_tool, self._TOOL_SHAPE_ARROW) + self._tool_shape_ellipse.connect('clicked', self.set_tool, self._TOOL_SHAPE_ELLIPSE) + #self._tool_shape_freeform.connect('clicked', self.set_tool, self._TOOL_SHAPE_FREEFORM) + #self._tool_shape_heart.connect('clicked', self.set_tool, self._TOOL_SHAPE_HEART) + self._tool_shape_line.connect('clicked', self.set_tool, self._TOOL_SHAPE_LINE) + self._tool_shape_parallelogram.connect('clicked', self.set_tool, self._TOOL_SHAPE_PARALLELOGRAM) + #self._tool_shape_polygon.connect('clicked', self.set_tool, self._TOOL_SHAPE_POLYGON) + self._tool_shape_rectangle.connect('clicked', self.set_tool, self._TOOL_SHAPE_RECTANGLE) + self._tool_shape_star.connect('clicked', self.set_tool, self._TOOL_SHAPE_STAR) + self._tool_shape_trapezoid.connect('clicked', self.set_tool, self._TOOL_SHAPE_TRAPEZOID) + self._tool_shape_triangle.connect('clicked', self.set_tool, self._TOOL_SHAPE_TRIANGLE) + + def set_tool(self, widget, tool): + + # setting tool + self._activity._area.tool = tool + + # setting size and color + size = self._stroke_size.get_size() + self._stroke_size.set_stroke_size(size) + + stroke_color = self._stroke_color.get_color() + self._stroke_color.set_stroke_color(stroke_color) + + fill_color = self._fill_color.get_color() + self._fill_color.set_fill_color(fill_color) + + #setting cursor + try: + pixbuf = gtk.gdk.pixbuf_new_from_file('./images/' + tool + '.png') + cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pixbuf, 6, 21) + except: + cursor = None + + self._activity._area.window.set_cursor(cursor) + class TextToolbar(gtk.Toolbar): - _ACTION_TEXT = 4 + _ACTION_TEXT = 'text' def __init__(self, activity): gtk.Toolbar.__init__(self) + self._activity = activity + self._text = ToggleToolButton('text') self.insert(self._text, -1) self._text.show() self._text.set_tooltip(_('Type')) - self._text.connect('clicked', set_tool, activity, 'text', self._ACTION_TEXT) - + self._text.connect('clicked', self.set_tool, self._ACTION_TEXT) + """ #FIXME: this button is not connected to the right callback self._bold = ToggleToolButton('format-text-bold') @@ -462,18 +706,24 @@ class TextToolbar(gtk.Toolbar): #self.insert(self._text_color, -1) self._text_color.show() """ + def type_text(self, activity): set_tool(self._ACTION_TEXT, activity, 'text') activity._textview.show() + + def set_tool(self, widget, tool): + #FIXME: this callback must change as others buttons get enabled + self._activity._area.tool = tool + class ImageToolbar(gtk.Toolbar): - _OBJECT_HEIGHT = 30 - _OBJECT_INSERT = 31 - _OBJECT_ROTATE_LEFT = 32 - _OBJECT_ROTATE_RIGHT = 33 - _OBJECT_WIDTH = 34 + _OBJECT_HEIGHT = 'height' + _OBJECT_INSERT = 'insert' + _OBJECT_ROTATE_LEFT = 'rotate-left' + _OBJECT_ROTATE_RIGHT = 'rotate-right' + _OBJECT_WIDTH = 'width' def __init__(self, activity): gtk.Toolbar.__init__(self) @@ -481,7 +731,7 @@ class ImageToolbar(gtk.Toolbar): self._object_insert = ToolButton('object-insert') self.insert(self._object_insert, -1) self._object_insert.show() - self._object_insert.set_tooltip(_('object-insert')) + self._object_insert.set_tooltip(_('Insert Image')) separator = gtk.SeparatorToolItem() separator.set_draw(True) @@ -520,32 +770,32 @@ class ImageToolbar(gtk.Toolbar): def rotate_left(self, widget, activity): #activity._area._rotate_left() - pass + pass def insertImage(self, widget, activity): - dialog = gtk.FileChooserDialog(title=(_('Open File...')), - action=gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OK, gtk.RESPONSE_OK)) - dialog.show_all() - response = dialog.run() - if response == gtk.RESPONSE_OK: - print dialog.get_filename(), 'selected' - #gtk28 = False - file_path = dialog.get_filename() + dialog = gtk.FileChooserDialog(title=(_('Open File...')), + action=gtk.FILE_CHOOSER_ACTION_OPEN, + buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OK, gtk.RESPONSE_OK)) + dialog.show_all() + response = dialog.run() + if response == gtk.RESPONSE_OK: + print dialog.get_filename(), 'selected' + #gtk28 = False + file_path = dialog.get_filename() #file_path = decode_path((file_path,))[0] #open(activity, file_path) - activity._area.d.loadImage(file_path) - elif response == gtk.RESPONSE_CANCEL: - print 'Closed, no files selected' + activity._area.d.loadImage(file_path,widget) + elif response == gtk.RESPONSE_CANCEL: + print 'Closed, no files selected' dialog.destroy() class EffectsToolbar(gtk.Toolbar): - _ACTION_GRAYSCALE = 0 + _ACTION_GRAYSCALE = 'grayscale' def __init__(self, activity): gtk.Toolbar.__init__(self) @@ -633,82 +883,98 @@ class ViewToolbar(gtk.Toolbar): print 'treeeter' -def set_tool(widget, activity, data=None, tool=None): - activity._area.tool = tool - #setting cursor - print data - if data == 'tool-pencil': - pix = gtk.gdk.pixbuf_new_from_file("./images/lapis_cursor.png") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-eraser': - pix = gtk.gdk.pixbuf_new_from_file("./images/borracha_cursor.png") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-shape-ellipse': - pix = gtk.gdk.pixbuf_new_from_file("./images/circulo_cursor.png") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-shape-rectangle': - pix = gtk.gdk.pixbuf_new_from_file("./images/quadrado_cursor.png") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-marquee-rectangular': - cursor = gtk.gdk.Cursor(gtk.gdk.CROSSHAIR) - activity._area.move = False - - elif data == 'text': - pix = gtk.gdk.pixbuf_new_from_file("./images/letra_cursor.png") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-shape-line': - pix = gtk.gdk.pixbuf_new_from_file("./images/linha_cursor.png") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-brush': - pix = gtk.gdk.pixbuf_new_from_file("./icons/brush_cursor.svg") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-bucket': - pix = gtk.gdk.pixbuf_new_from_file("./icons/bucket_cursor.svg") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-polygon': - pix = gtk.gdk.pixbuf_new_from_file("./images/poligono_cursor.png") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-shape-triangle': - pix = gtk.gdk.pixbuf_new_from_file("./images/triangle_cursor.png") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - elif data == 'tool-shape-trapezoid': - pix = gtk.gdk.pixbuf_new_from_file("./images/trapezoid_cursor.png") - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - - else: - # Uses toolbar icon as cursor - #FIXME: invert cursor color. Toolbar icons are white - try: - archive = './icons/' + data + '.svg' - pix = gtk.gdk.pixbuf_new_from_file(archive) - print archive, pix - cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) - except: - cursor = None - - - activity._area.window.set_cursor(cursor) - #print cursor +# def set_tool(widget, activity, data=None, tool=None): +# activity._area.tool = tool +# #setting cursor +# print data +# if data == 'tool-pencil': +# pix = gtk.gdk.pixbuf_new_from_file("./images/lapis_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# +# elif data == 'tool-eraser': +# pix = gtk.gdk.pixbuf_new_from_file("./images/borracha_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# +# elif data == 'tool-shape-ellipse': +# pix = gtk.gdk.pixbuf_new_from_file("./images/circulo_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# +# elif data == 'tool-shape-rectangle': +# pix = gtk.gdk.pixbuf_new_from_file("./images/quadrado_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# +# elif data == 'tool-marquee-rectangular': +# cursor = gtk.gdk.Cursor(gtk.gdk.CROSSHAIR) +# activity._area.move = False + +# elif data == 'text': +# pix = gtk.gdk.pixbuf_new_from_file("./images/letra_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# +# elif data == 'tool-shape-line': +# pix = gtk.gdk.pixbuf_new_from_file("./images/linha_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) + +# elif data == 'tool-brush': +# pix = gtk.gdk.pixbuf_new_from_file("./images/brush_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) + +# elif data == 'tool-bucket': +# pix = gtk.gdk.pixbuf_new_from_file("./images/bucket_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) + +# elif data == 'tool-polygon': +# pix = gtk.gdk.pixbuf_new_from_file("./images/poligono_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) + +# elif data == 'tool-shape-triangle': +# pix = gtk.gdk.pixbuf_new_from_file("./images/triangle_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) + +# elif data == 'tool-shape-trapezoid': +# pix = gtk.gdk.pixbuf_new_from_file("./images/trapezoid_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# +# elif data == 'tool-shape-star': +# pix = gtk.gdk.pixbuf_new_from_file("./images/star_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# +# elif data == 'tool-shape-heart': +# pix = gtk.gdk.pixbuf_new_from_file("./images/heart_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# +# elif data == 'tool-shape-parallelogram': +# pix = gtk.gdk.pixbuf_new_from_file("./images/parallelogram_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# +# elif data == 'tool-shape-arrow': +# pix = gtk.gdk.pixbuf_new_from_file("./images/arrow_cursor.png") +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) + +# else: +# # Uses toolbar icon as cursor +# #FIXME: invert cursor color. Toolbar icons are white +# try: +# archive = './icons/' + data + '.svg' +# pix = gtk.gdk.pixbuf_new_from_file(archive) +# print archive, pix +# cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default() , pix, 6, 21) +# except: +# cursor = None + +# +# activity._area.window.set_cursor(cursor) +# #print cursor - -def set_stroke_size(activity, size): - activity._area.configure_line(size) +#move to class ComboStrokeSize +#def set_stroke_size(activity, size): + #activity._area.configure_line(size) -def undo(widget, activity): +def undo(widget, activity): activity._area.undo() -def redo(widget, activity): +def redo(widget, activity): activity._area.redo() def test_connect(widget, activity, data=None): @@ -718,21 +984,21 @@ def test_connect(widget, activity, data=None): def insertImage(widget, activity): - dialog = gtk.FileChooserDialog(title=(_('Open File...')), - action=gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OK, gtk.RESPONSE_OK)) - dialog.show_all() - response = dialog.run() - if response == gtk.RESPONSE_OK: - print dialog.get_filename(), 'selected' - #gtk28 = False - file_path = dialog.get_filename() + dialog = gtk.FileChooserDialog(title=(_('Open File...')), + action=gtk.FILE_CHOOSER_ACTION_OPEN, + buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OK, gtk.RESPONSE_OK)) + dialog.show_all() + response = dialog.run() + if response == gtk.RESPONSE_OK: + print dialog.get_filename(), 'selected' + #gtk28 = False + file_path = dialog.get_filename() #file_path = decode_path((file_path,))[0] #open(activity, file_path) - activity._area.d.loadImage(file_path) - elif response == gtk.RESPONSE_CANCEL: - print 'Closed, no files selected' + activity._area.d.loadImage(file_path) + elif response == gtk.RESPONSE_CANCEL: + print 'Closed, no files selected' dialog.destroy() -- cgit v0.9.1