Here's a version that will let you drag the RedBox around.
(I don't have Cairo installed, so I changed it to use the
normal gtk drawing methods.)

--
Greg

import gtk
import math

class Thing(gtk.DrawingArea):

        def __init__(self):
                super(Thing, self).__init__()
                self.add_events(gtk.gdk.BUTTON_PRESS_MASK | 
gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.POINTER_MOTION_MASK)
                self.connect("expose_event", self.expose)
                self.connect("button_press_event", self.click)
                self.connect("motion_notify_event", self.drag)
                self.connect("button_release_event", self.release)
                self.click_point = None
                print "Thing __init__ called"

        def expose(self, widget, event):
                print "Thing expose called"
                context = None
                ###context = widget.window.cairo_create()
                # set a clip region for the expose event
                ###context.rectangle(event.area.x, event.area.y,
                ###                                               
event.area.width, event.area.height)
                ###context.clip()
                self.draw(context)
                return False
        
        def click(self, widget, event):
                self.click_point = event.get_coords()
                print "Thing.click at", self.click_point
        
        def drag(self, widget, event):
                if self.click_point:
                        x0, y0 = self.click_point
                        x1, y1 = event.get_coords()
                        print "Thing.drag:", (x1, y1)
                        dx = x1 - x0
                        dy = y1 - y0
                        x, y = self.parent.child_get(self, 'x', 'y')
                        self.parent.move(self, x + dx, y + dy)
        
        def release(self, widget, event):
                print "Thing.release"
                self.click_point = None

        def draw(self, context):
                pass
        
        def rect(self):
                return self.get_allocation()

class RedBox(Thing):

        def draw(self,context):
                print "RedBox.draw" ###
                x, y, w, h = self.rect()
                win = self.window
                colormap = self.get_colormap()
                red = colormap.alloc_color("red")
                gc = win.new_gc(foreground = red)
                win.draw_rectangle(gc, True, 0, 0, w, h)
                ###context.set_source_rgb(1, 0, 0)
                ###context.rectangle(20, 20, 50, 50)
                ###context.fill()

def main():
        window = gtk.Window()
        window.set_size_request(400, 400)
        window.connect('delete-event', gtk.main_quit)

        sw = gtk.Layout()
        window.add(sw)
        sw.set_size(400, 400)
        #sw.set_size_request(300, 300)

        rb = RedBox()
        rb.set_size_request(100, 100)

        sw.add(rb)
        sw.move(rb, 50, 60)
        
        rb.show()
        sw.show()
        
        window.show_all()
        gtk.main()
        
if __name__ == "__main__":
        main()
_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to