Example #1
0
    def __init__( self, subControllerConfig = SubControllerConfig() ):

        self.subController = SubController( subControllerConfig )
        self.curFramePixBuf = None
        self.processedFramePixBuf = None
        
        # Create a new window
        self.window = gtk.Window( gtk.WINDOW_TOPLEVEL)
    
        self.window.connect( "destroy", self.destroy )
    
        # Sets the border width of the window.
        self.window.set_border_width(10)

        # Layout box names have the format layoutBox_Level_Number
        layoutBox_A_0 = gtk.HBox()
        
        # Setup an drawing area to show the current frame
        self.dwgCurFrame = gtk.DrawingArea()
        self.dwgCurFrame.connect( "expose_event", self.onDwgCurFrameExpose )
        #self.dwgCurFrame.set_size_request( 0, 0 )
        layoutBox_A_0.pack_start( self.dwgCurFrame )
        self.dwgCurFrame.show()
        
        # Setup an drawing area to show the processed frame
        self.dwgProcessedFrame = gtk.DrawingArea()
        self.dwgProcessedFrame.connect( "expose_event", self.onProcessedCurFrameExpose )
        #self.dwgProcessedFrame.set_size_request( 0, 0 )
        layoutBox_A_0.pack_start( self.dwgProcessedFrame )
        self.dwgProcessedFrame.show()
        
        # Add the root layout box to the main window
        self.window.add( layoutBox_A_0 )
        layoutBox_A_0.show()
        
        updateLoop = self.update()
        gobject.idle_add( updateLoop.next )

        # Finished so show the window
        self.window.show()
Example #2
0
class MainWindow:

    #---------------------------------------------------------------------------
    def __init__( self, subControllerConfig = SubControllerConfig() ):

        self.subController = SubController( subControllerConfig )
        self.curFramePixBuf = None
        self.processedFramePixBuf = None
        
        # Create a new window
        self.window = gtk.Window( gtk.WINDOW_TOPLEVEL)
    
        self.window.connect( "destroy", self.destroy )
    
        # Sets the border width of the window.
        self.window.set_border_width(10)

        # Layout box names have the format layoutBox_Level_Number
        layoutBox_A_0 = gtk.HBox()
        
        # Setup an drawing area to show the current frame
        self.dwgCurFrame = gtk.DrawingArea()
        self.dwgCurFrame.connect( "expose_event", self.onDwgCurFrameExpose )
        #self.dwgCurFrame.set_size_request( 0, 0 )
        layoutBox_A_0.pack_start( self.dwgCurFrame )
        self.dwgCurFrame.show()
        
        # Setup an drawing area to show the processed frame
        self.dwgProcessedFrame = gtk.DrawingArea()
        self.dwgProcessedFrame.connect( "expose_event", self.onProcessedCurFrameExpose )
        #self.dwgProcessedFrame.set_size_request( 0, 0 )
        layoutBox_A_0.pack_start( self.dwgProcessedFrame )
        self.dwgProcessedFrame.show()
        
        # Add the root layout box to the main window
        self.window.add( layoutBox_A_0 )
        layoutBox_A_0.show()
        
        updateLoop = self.update()
        gobject.idle_add( updateLoop.next )

        # Finished so show the window
        self.window.show()
    
    #---------------------------------------------------------------------------
    def destroy( self, widget, data = None ):
        
        # Clean up
        self.subController.shutdown()
        
        gtk.main_quit()
        
    #---------------------------------------------------------------------------   
    def main( self ):
        # All PyGTK applications must have a gtk.main(). Control ends here
        # and waits for an event to occur (like a key press or mouse event).
        gtk.main()
        
    #---------------------------------------------------------------------------
    def onDwgCurFrameExpose( self, widget, event ):
    
        if self.curFramePixBuf != None:
            
            imgRect = self.getImageRectangleInWidget( widget )
                
            imgOffsetX = imgRect.x
            imgOffsetY = imgRect.y
                
            # Get the total area that needs to be redrawn
            imgRect = imgRect.intersect( event.area )
        
            srcX = imgRect.x - imgOffsetX
            srcY = imgRect.y - imgOffsetY
           
            widget.window.draw_pixbuf( widget.get_style().fg_gc[ gtk.STATE_NORMAL ],
                self.curFramePixBuf, srcX, srcY, 
                imgRect.x, imgRect.y, imgRect.width, imgRect.height )
                    
    #---------------------------------------------------------------------------
    def onProcessedCurFrameExpose( self, widget, event ):
    
        if self.processedFramePixBuf != None:
            
            imgRect = self.getImageRectangleInWidget( widget )
                
            imgOffsetX = imgRect.x
            imgOffsetY = imgRect.y
                
            # Get the total area that needs to be redrawn
            imgRect = imgRect.intersect( event.area )
        
            srcX = imgRect.x - imgOffsetX
            srcY = imgRect.y - imgOffsetY
           
            widget.window.draw_pixbuf( widget.get_style().fg_gc[ gtk.STATE_NORMAL ],
                self.processedFramePixBuf, srcX, srcY, 
                imgRect.x, imgRect.y, imgRect.width, imgRect.height )
                
            # Now draw the circle for the buoy on top
            blobData = self.subController.tracker.getBlobData()
            if blobData.visible:
            
                arcX = int( imgOffsetX + blobData.centreX - blobData.radius )
                arcY = int( imgOffsetY + blobData.centreY - blobData.radius )
                arcWidth = arcHeight = int( blobData.radius * 2 )
            
                drawFilledArc = False
                graphicsContext = widget.window.new_gc()
                graphicsContext.set_rgb_fg_color( gtk.gdk.Color( 0, 65535, 0 ) )
            
                widget.window.draw_arc( graphicsContext, 
                    drawFilledArc, arcX, arcY, arcWidth, arcHeight, 0, 360 * 64 )
                
                widget.window.draw_points( graphicsContext,
                    [ ( int( imgOffsetX + blobData.centreX ), int( imgOffsetY + blobData.centreY ) ) ] )
    
    #---------------------------------------------------------------------------
    def getImageRectangleInWidget( self, widget ):
        
        # Centre the image inside the widget
        widgetX, widgetY, widgetWidth, widgetHeight = widget.get_allocation()
        
        imgRect = gtk.gdk.Rectangle( 0, 0, widgetWidth, widgetHeight )
        (requestedWidth, requestedHeight) = widget.get_size_request()
        
        if widgetWidth > requestedWidth:
            imgRect.x = (widgetWidth - requestedWidth) / 2
            imgRect.width = requestedWidth
            
        if widgetHeight > requestedHeight:
            imgRect.y = (widgetHeight - requestedHeight) / 2
            imgRect.height = requestedHeight
        
        return imgRect
      
    #---------------------------------------------------------------------------
    def update( self ):
    
        while 1:
            newFrameAvailable = self.subController.update()
            if newFrameAvailable:
                
                frame = self.subController.frame
                processedFrameData = self.subController.processedFrameData
                
                self.curFramePixBuf = gtk.gdk.pixbuf_new_from_data( 
                    frame.tostring(), 
                    gtk.gdk.COLORSPACE_RGB,
                    False,
                    frame.depth,
                    frame.width,
                    frame.height,
                    frame.width*frame.nChannels )

                if processedFrameData != None:
                    self.processedFramePixBuf = gtk.gdk.pixbuf_new_from_data( 
                        processedFrameData, 
                        gtk.gdk.COLORSPACE_RGB,
                        False,
                        frame.depth,
                        frame.width,
                        frame.height,
                        frame.width*frame.nChannels )

                # Resize the frames if necessary
                if self.dwgCurFrame.get_size_request() != ( frame.width, frame.height ):
                    self.dwgCurFrame.set_size_request( frame.width, frame.height )

                if self.dwgProcessedFrame.get_size_request() != ( frame.width, frame.height ):
                    self.dwgProcessedFrame.set_size_request( frame.width, frame.height )

                # Redraw the frames
                self.dwgCurFrame.queue_draw()
                self.dwgProcessedFrame.queue_draw()
                
            yield True
            
        yield False