FeedBurnerTirasCategories*
Recent Comments On Blog*
|
Thursday* 13 September* 2007 4:23pm
Categories
generalSoftware_Development stuff Python gtk FLOSS Uno de los widgets menos usados en GTK es el gtk.Fixed, Este contenedor nos permite poner widgets de manera estatica en nuestra aplicacion. Es decir, si la ventana cambia de tamanio los widgets no se redimencionaran y tampoco cambiaran de posicion. Pocos lo utilizan por esto, pero a veces es necesario. Pues resulta que en una de las aplicaciones lo tengo asi, simplemente porque los widgets NO se tienen que mover ni cambiar de tamanio si la ventana se redimenciona, aqui yo lo veo como algo bueno. En fin, El problema del GtkFixed es que nomas no me cacha los eventos, y meterlo en un gtk.EventBox me parece no tan optimo, puesto que yo quiero que los eventos los cache el Widget, no un EventBox. Mi primer intento de solucion: Crear una clase que herede de gtk.Fixed y cachar los eventos para que cuando el cursor este dentro de un punto determinado se pueda redimencionar al muy puro estilo de click-arrastra-suelta. Problema, gtk.Fixed no me cacha los eventos, incluso si se los agrego a manita con gtk.Fixed.add_events. Segundo intento: Hereda primero de un gtk.EventBox y luego de un Fixed: Si cacha los eventos, No te muestra ni madres. Inviertelo, Si te dibuja, pero no te cacha los eventos... (ya me estoy desesperando) La solucion?, Bueno, nunca le habia echado el ojo al gtk.Layout, entonces heredo de un gtk.Layout primero, este no me cacha los eventos, pero, me permite dibujar como si fuera un gtk.DrawingArea aunque tienes que dibujar sobre el bin_window de tu layout (gtk.Layout.bin_window) en lugar del window como tipicamente se hace en gtk.DrawingArea. Bien, tu segunda herencia es de un EventBox para poder cachar las seniales, y listo Es importante que Primero se herede de gtk.Layout y luego de algun otro widget (gtk.DrawingArea tambien funciona) para que Gtk no reniegue al tratar de agregar widgets a tu gtk.Layout. El codigo seria mas o menos asi (Estoy seguro que de alguna manera se puede mejorar): class groupWidget(gtk.Layout,gtk.EventBox): ''' Una version modificada del gtk.Fixed ''' def __init__(self): gtk.Layout.__init__(self) gtk.EventBox.__init__(self) self.__buttonPressed = False self.set_name('groupWidget') self.set_size_request(50,50) self.set_property('events', gtk.gdk.EXPOSURE_MASK | gtk.gdk.ENTER_NOTIFY_MASK| gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.BUTTON_PRESS_MASK) self.add_events( gtk.gdk.EXPOSURE_MASK | gtk.gdk.ENTER_NOTIFY_MASK| gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.BUTTON_PRESS_MASK) self.connect('expose-event',self.__exposeEvent) self.connect('motion-notify-event', self.__motionNotify) self.connect('button-press-event', self.__buttonPressEvent) self.connect('button-release-event', self.__buttonReleaseEvent) def __motionNotify(self,widget,event): if self.__buttonPressed: x,y = self.get_pointer() if(x,y ) > (0,0): self.set_size_request(x,y) self.__lastWH= [x,y] def __buttonPressEvent(self,widget,event): w,h = self.__lastWH px,py = self.get_pointer() if event.button == 1: if w > px > w-5 and h > py > h-6: self.__buttonPressed = True def __buttonReleaseEvent(self,widget,event): if event.button == 1: self.__buttonPressed = False def __exposeEvent(self,widget,event): ''' Encargada de dibujar el widget ''' context = self.bin_window.cairo_create() x,y,w,h = self.allocation self.__lastWH = [w,h] context.set_line_width(1) context.set_antialias(cairo.ANTIALIAS_NONE) #Dibujamos el relleno y el borde context.move_to(0,0) context.rectangle(1,0,w-1,h-1) context.rectangle(1,0,w-1,h-1) context.set_source_rgba(1,1,1,0.5) context.fill_preserve() context.set_source_rgb(0,0,0) context.stroke() #Dibujamos un pequenio rectangulito # en la parte inferior derecha. context.rectangle(w-5,h-6,5,5) context.set_source_rgb(0.5,0.5,0.5) context.stroke() Y se deberia ver asi: En el video se puede apreciar que el boton esta dentro del contenedor, por eso de corta cuando el tamanio del contenedor es menor (se pueden usar Scrollbars gracias a la capacidad de gtk.Layout.
Trackback URI: http://www.islascruz.org/html/index.php?Blog/Trackback/id/459
Leave a Comment*
Comment XML feeds*: RSS | Atom
Visitors Statistics*Technorati |