[cairo] drawing shapes from events

Mr SZ sk8in_zombi at yahoo.com.au
Tue Jul 15 12:13:10 PDT 2008


Hi,

I'm trying to create a rectangle when the user presses or releases the mouse over a cairo object.I'm using the eventBox to capture the mouse events.
Now the problem is the shapes is beng drawn when I call it from the expose_event event handler and nothing happens when I call the same from the mouse release event handler.

Here is my code :

#!/usr/bin/env python

import sys
import cairo
import gtk


start = None #Starting co-ords
stop = None #Ending co-ords
box = None  #Tuple of co-ords for drawing rect
ctx = None #Cairo Widget
def button_press(widget, event, surface):
    global start
    start = (int(event.x),int(event.y))
def motion_notify(widget, event, surface):
    pass
def button_release(widget, event, surface):
    global stop,ctx
    ctx = None
    ctx = widget.window.cairo_create()
    ctx.set_source_surface(surface, 0,0)
    ctx.paint()
    print ctx
    stop =  (int(event.x),int(event.y))
    box = (start[0],start[1])
    draw_dotrect(ctx,box)
    print "Released" + str(box)

def draw_dotrect(ctx,box):
    ctx.set_source_rgba(0, 0, 0,0.5)
    ctx.save()
    ctx.new_path()
    ctx.translate(3*20, 0)
    square(ctx,box)
    ctx.fill()
    ctx.restore()
    ctx.set_line_width(20 / 16)
    ctx.set_tolerance(0.1)
    ctx.set_line_join(cairo.LINE_JOIN_MITER)
    ctx.set_dash([20/2.0, 20/2.0], 8)
    ctx.save()
    ctx.new_path()
    ctx.set_source_rgb(0,0 ,0 )
    ctx.translate(3*20, 0)
    square(ctx,box)
    ctx.stroke_preserve()
    ctx.restore()
    
def expose_event(widget, event, surface):
    global ctx
    ctx = widget.window.cairo_create()
    ctx.set_source_surface(surface, 0,0)
    ctx.paint()
    
    #draw_dotrect(ctx,(20,20)) # If called from here,it works
    
    
def square(ctx,box):
    ctx.move_to(0, 0)
    ctx.rel_line_to(2*50, 0)
    ctx.rel_line_to(0, 2*50)
    ctx.rel_line_to(-2*50, 0)
    ctx.close_path()
    
    if len(sys.argv) != 2:
        raise SystemExit('usage: png_view.py png_file')

filename = sys.argv[1]

surface = cairo.ImageSurface.create_from_png(filename)
Width  = surface.get_width()
Height = surface.get_height()

win = gtk.Window()
win.connect('destroy', gtk.main_quit)

event_box = gtk.EventBox()
win.add(event_box)

drawingarea = gtk.DrawingArea()
event_box.add(drawingarea)

drawingarea.connect('expose_event', expose_event, surface)
event_box.connect('button_press_event',button_press,surface)
event_box.connect('button_release_event',button_release,surface)
event_box.connect('motion_notify_event',motion_notify,surface)

drawingarea.set_size_request(Width,Height)

win.show_all()
gtk.main()

It doesn't throw me any error.I hardcoded the box to simplify things .    I also create a new ctx in the release event handler else it throws an error:CAIRO_STATUS_SURFACE_FINISHED


Any ideas why ?

" life isn't heavy enough,it flies away and floats far above action"


      Start at the new Yahoo!7 for a better online experience. www.yahoo7.com.au
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.cairographics.org/archives/cairo/attachments/20080715/3dd8533e/attachment.html 


More information about the cairo mailing list