Package elisa :: Package plugins :: Package bad :: Package gtk_frontend :: Module gtk_player_view
[hide private]
[frames] | no frames]

Source Code for Module elisa.plugins.bad.gtk_frontend.gtk_player_view

  1  # -*- coding: utf-8 -*- 
  2  # Elisa - Home multimedia server 
  3  # Copyright (C) 2006-2008 Fluendo Embedded S.L. (www.fluendo.com). 
  4  # All rights reserved. 
  5  # 
  6  # This file is available under one of two license agreements. 
  7  # 
  8  # This file is licensed under the GPL version 3. 
  9  # See "LICENSE.GPL" in the root of this distribution including a special 
 10  # exception to use Elisa with Fluendo's plugins. 
 11  # 
 12  # The GPL part of Elisa is also available under a commercial licensing 
 13  # agreement from Fluendo. 
 14  # See "LICENSE.Elisa" in the root directory of this distribution package 
 15  # for details on that license. 
 16   
 17   
 18  __maintainer__ = 'Lionel Martin <lionel@fluendo.com>' 
 19  __maintainer2__ = 'Philippe Normand <philippe@fluendo.com>' 
 20   
 21   
 22  from elisa.base_components.view import View 
 23  from elisa.core import player, common, plugin_registry 
 24   
 25  from elisa.extern.translation import gettexter, N_, Translatable 
 26  T_ = gettexter('elisa-gtk-frontend') 
 27   
 28  import pygtk 
 29  pygtk.require('2.0') 
 30  import gtk 
 31   
 32  import pygst 
 33  pygst.require('0.10') 
 34  import gst 
 35  import gst.interfaces 
 36  import platform 
 37   
 38   
39 -class ViewerWidget(gtk.DrawingArea):
40 """ 41 Code generously donated by Edward Hervey 42 GTK Widget properly displaying GStreamer video sink 43 """ 44 45 __gsignals__ = {} 46
47 - def __init__(self):
48 gtk.DrawingArea.__init__(self) 49 self.videosink = None 50 self.have_set_xid = False 51 self.can_set_xid = False 52 self.unset_flags(gtk.DOUBLE_BUFFERED) 53 self.unset_flags(gtk.SENSITIVE)
54 55
56 - def do_expose_event(self, unused_event):
57 """ 'expose-event' override """ 58 if self.videosink: 59 if not self.have_set_xid and self.can_set_xid: 60 self.set_xwindow_id() 61 elif self.have_set_xid: 62 self.videosink.expose() 63 return False
64 65
66 - def set_xwindow_id(self):
67 """ set the widget's XID on the configured videosink. """ 68 if not self.videosink: 69 return 70 if self.have_set_xid: 71 return 72 73 if self.window: 74 if platform.system() == 'Windows': 75 xid = self.window.handle 76 else: 77 xid = self.window.xid 78 79 self.videosink.set_xwindow_id(xid) 80 self.have_set_xid = True 81 self.videosink.expose()
82 83 84 PlayerViewClass = plugin_registry.get_component_class('base:player_view') 85
86 -class GtkPlayerView(PlayerViewClass):
87 """ 88 This class implements gtk list view support 89 """ 90 supported_controllers = ('base:player_controller',) 91
92 - def __init__(self):
93 PlayerViewClass.__init__(self) 94 self.context_path = 'gtk:gtk_context' 95 96 self.vbox = gtk.VBox() 97 self.videopanel = ViewerWidget() 98 self.videopanel.set_size_request(200, 200) 99 self.hbox = gtk.HBox() 100 self.vbox.pack_start(self.videopanel, expand=False) 101 self.vbox.pack_end(self.hbox, expand=False) 102 103 translator = common.application.translator 104 label = translator.translateTranslatable(T_(N_("no media"))) 105 self.uri_widget = gtk.Label(label) 106 107 self.state_widget = gtk.combo_box_new_text() 108 for state in player.STATES[1:4]: 109 self.state_widget.append_text(str(state)) 110 self.state_widget.connect("changed", self._gtk_state_changed) 111 112 self.hbox.pack_start(self.uri_widget) 113 114 if platform.system() == 'Windows': 115 vsink = 'directdrawsink' 116 else: 117 vsink = 'ximagesink' 118 119 self._video_sink = gst.element_factory_make(vsink) 120 self.player.video_sink = self._video_sink 121 self.videopanel.videosink = self._video_sink 122 123 self.context_handle = self.vbox
124 125
126 - def _init_xwindow_id(self):
127 self.videopanel.have_set_xid = False 128 self.videopanel.can_set_xid = True 129 self.videopanel.set_xwindow_id()
130
131 - def _gtk_state_changed(self, widget):
132 # FIXME: may be redirected to the controller instead 133 new_state = widget.get_active_text() 134 next_state = None 135 136 if new_state == str(player.STATES.PLAYING): 137 next_state = player.STATES.PLAYING 138 elif new_state == str(player.STATES.PAUSED): 139 next_state = player.STATES.PAUSED 140 elif new_state == str(player.STATES.STOPPED): 141 next_state = player.STATES.STOPPED 142 143 if not next_state: 144 return 145 146 old_state = self.player.state 147 if old_state != next_state: 148 self.controller.model.state = next_state
149 150
151 - def attribute_set(self, origin, key, old_value, new_value):
152 PlayerViewClass.attribute_set(self, origin, key, old_value, new_value) 153 if key == 'state': 154 if new_value == player.STATES.PLAYING: 155 self._play() 156 elif new_value == player.STATES.PAUSED: 157 self._pause() 158 elif new_value == player.STATES.STOPPED: 159 self._stop() 160 if key == 'uri': 161 self.player.uri = new_value 162 label = new_value.label 163 if isinstance(label, Translatable): 164 translator = common.application.translator 165 label = translator.translateTranslatable(label, 166 self.frontend.languages) 167 self.uri_widget.set_text(label) 168 169 self._update_combo()
170
171 - def controller_changed(self, old_controller, new_controller):
172 PlayerViewClass.controller_changed(self, old_controller, new_controller) 173 174 if self.controller.uri != None: 175 label = self.controller.uri.label 176 if isinstance(label, Translatable): 177 translator = common.application.translator 178 label = translator.translateTranslatable(label, 179 self.frontend.languages) 180 self.uri_widget.set_text(label) 181 182 state = self.controller.state 183 if state == player.STATES.PLAYING: 184 self._play() 185 elif state == player.STATES.PAUSED: 186 self._pause() 187 elif state == player.STATES.STOPPED: 188 self._stop() 189 190 self._update_combo()
191
192 - def focused_changed(self, new_value):
193 pass
194 195
196 - def _update_combo(self):
197 if self.state_widget not in self.hbox.get_children(): 198 self.state_widget.size = (100,10) 199 self.hbox.pack_end(self.state_widget) 200 self.state_widget.show()
201
202 - def _pause(self):
203 self._update_combo() 204 self._init_xwindow_id() 205 self.state_widget.set_active(player.STATES.index(player.STATES.PAUSED)-1)
206
207 - def _stop(self):
208 self._update_combo() 209 self.state_widget.set_active(player.STATES.index(player.STATES.STOPPED)-1)
210
211 - def _play(self):
212 self._update_combo() 213 self._init_xwindow_id() 214 self.state_widget.set_active(player.STATES.index(player.STATES.PLAYING)-1)
215