Source code for Player
# CellTracking.py
# By MW, Jun 2013
# GPLv3+
#
# Class representing a graphical player. It uses GTK so these functions can
#+hardly be used automatically in a script
import gtk, sys, gobject, imp
sys.path.append('./bin/Players/')
import State_player
import Menu, Viewer, Zoom, Controls
import Contrast
Cells_gtk = imp.load_source("Cells_gtk", './bin/Movies/Cells/Cells_gtk.py')
[docs]class Player :
    def __init__(self, state) :
        """Receives a state instance"""
        
        # State management
        self.state = state
        if not self.state.has_subclass("player") :
            p_state = State_player.Player_state(self.state)
            self.state.add_subclass("player", p_state)
        self.state_player = p_state
        # Channel
        ch = self.state.movie.Channels.get_channels_dict().keys()[0]
        self.state_player.set_current_channel(ch)
        # Instanciate classes (after the player_state)
        self.cells = Cells_gtk.CellsPanel(state)
        self.contrast = Contrast.Contrast(state)
        
        # Create window
        self.window = gtk.Window()
        self.window.set_title("CellTracking player")
        #self.window.set_default_size(500, 600)
        self.window.connect("delete_event", self.quit_cross)
        self.window.show()
        # Create organization of the window
        self.box = gtk.VBox()
        self.window.add(self.box)
        # Load subparts of the player
        #- Menu
        self.menu = Menu.Menu(self)   # Takes a player instance in parameter
        self.menu_w = self.menu.get_menu()
        self.menu_w.show()
        self.box.pack_start(self.menu_w, expand=False, fill=False)
        self.menu.add_button(self.contrast)
        #- Viewer
        self.viewer = Viewer.Viewer(self)
        self.viewer_w = self.viewer.get_viewer()
        self.viewer_w.show_all()
        self.box.pack_start(self.viewer_w, expand=True, fill=True)
        # Bottom box
        self.bottom_box = gtk.HBox()
        self.box.pack_start(self.bottom_box, expand=False, fill=False)
        self.bottom_box.show() 
        #- Zoom (w/ view?)
        self.zoom = Zoom.Zoom(self)
        self.zoom_w = self.zoom.get_zoom()
        self.zoom_w.show_all()
        self.bottom_box.pack_start(self.zoom_w, expand=False, fill=False)
        #- Controls
        self.controls = Controls.Controls(self)
        self.controls_w = self.controls.get_controls()
        self.controls_w.show_all()
        self.bottom_box.pack_start(self.controls_w, expand=True, fill=True)
        
        # Timer
        #gobject.timeout_add(50, self.update_player)
        gobject.timeout_add(200, self.update_player)
        # Show window
        # Detect resizing (requires Zoom to be instanciated)
        self.window.connect('check-resize', self.size_changed)
        self.window.show()
        self.box.show()
[docs]    def update_player(self) :
        """Function calling everything needed to update the player"""
        # update the state
        newframe = False # if we have to read a frame from the file
        i = self.state_player.get_current_index()
        s = self.state_player.current_speed
        if self.state_player.play and not self.state_player.current_manual_mode :
            if s >= 1 :
                #n = self.state.get_frame_nb()
                #self.state_player.set_current_frame_index(max(0,min(n,i+s)))
                self.state_player.set_current_frame_index(i+s)
                newframe = True
            
            else :
                period = int(1./s)
                
                if self.state_player.slow_play_index >= period-1 :
                    self.state_player.set_current_frame_index(i+1)
                    self.state_player.slow_play_index = 0
                    newframe = True
                else :
                    self.state_player.slow_play_index += 1
        # Update the image
        if newframe :
            f = self.state_player.read_raw_frame()
        else :
            f = self.state_player.get_raw_frame()
        self.state_player.set_current_frame(f)
        # Update controls
        f = self.state_player.process_frame() # To call only once !
        self.state_player.set_current_frame(self.cells.draw(f))
        self.zoom.update_zoom()    # Update the zoom display
        self.viewer.update_viewer()# Update the viewer panel
        self.controls.update_controls()
        # Manage clicks
        if self.state_player.current_click != None :
            self.cells.click(self.state_player.current_click) # Forward click to cells
            self.state_player.set_image_click(None)
        return True
         
[docs]    def size_changed(self, w) :
        """Event called when the window is resized"""
        self.viewer.update_coord()
 
[docs]    def quit_cross(self, q, qq) :
        self.quit(q) 
[docs]    def quit(self, q) :
        gtk.main_quit(q) 
[docs]    def start(self) :
        gtk.main()