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()