def set_adjustment(self): maxx = 0 maxy = 0 # max value of the scrolls should be the block more distant + 50 in x and y for block in self.get_children(): if block.get_x()+block.get_width() > maxx: maxx = block.get_x()+block.get_width() if block.get_y()+block.get_height() > maxy: maxy = block.get_y()+block.get_height() self.get_hadjustment().set_all(self.get_hadjustment().value, 0, maxx+50, 1) self.get_vadjustment().set_all(self.get_vadjustment().value, 0, maxy+50, 1) # resize canvas self.set_size(maxx+10, maxy+10)
def paste(self): block = None cpblocks = [] cpblocks = self.copy_group( self.buffer ) for block in cpblocks: block.set_position( block.get_position() + Vector(20, 20) ) block.put_aux( self, block.get_x(), block.get_y() ) self.buffer = cpblocks self.unselect( self.get_children() ) self.select( self.buffer ) self.set_group( block ) self.sort_blocks()
def on_expose(self, widget, event): if self.first_expose == False and event and widget: self.drawable = event.window self.gc = self.drawable.new_gc() self.cm = self.gc.get_colormap() self.bg = self.cm.alloc_color("#ffffff") if self.find_startblock() == None: self.startblock = start_block() self.startblock.put(self, 10, 10) self.set_clicked( self.startblock ) self.change_done() self.first_expose = True self.set_adjustment() for block in self.get_children()[:]: if block.was_put == False: block.put(self, block.get_x(), block.get_y() ) #blocos no fim da lista são desenhados na frente block.draw(self.drawable, self.gc) if self.clicked: #seta ao lado do bloco self.drawable.draw_pixbuf( self.gc, self.arrow, 0, 0, self.clicked.get_x()-self.arrow.get_width(), self.clicked.get_y()+self.clicked.get_height()/2-self.arrow.get_height()/2 ) if not self.create_block is None: if self.mousex != -1 and self.mousey != -1: #uma imagem flutuando com uma previsão do novo bloco a ser criado self.drawable.draw_pixbuf( self.gc, self.create_block.get_image()[0], 0, 0, self.mousex, self.mousey ) # retângulo de selecão if self.selectrect_on == True: self.gc.set_line_attributes(1, gtk.gdk.LINE_DOUBLE_DASH, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_ROUND) self.drawable.draw_rectangle( self.gc, False, self.selectrect.x, self.selectrect.y, self.selectrect.w-1, self.selectrect.h-1 ) return True
def on_button_release(self, widget, event): if self.clicked: self.arrow_mark_dirty() self.clicked.brelease( Vector(event.x, event.y) ) self.arrow_mark_dirty() if self.selectrect_on == True: if self.selectrect.w > 0 and self.selectrect.h > 0: self.selectrect_mark_dirty() collide_pix = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, self.selectrect.w, self.selectrect.h ) collide_pix.fill( 0x00000000 ) collide_pix = collide_pix.add_alpha(False, chr(255), chr(255), chr(255) ) group = set() for block in self.get_children(): if self.selectrect.pos_inside( block.get_position() ) or collide_pixbuf(block.get_x(), block.get_y(), block.get_image()[0], self.selectrect.x, self.selectrect.y, collide_pix): group.add( block ) self.unselect( self.get_children() ) self.select( group ) self.set_group( self.clicked ) self.selectrect_on = False self.get_toplevel().window.set_cursor(None) self.set_adjustment()