[pitivi] Viewer: implement dock/undock methods
- From: Edward Hervey <edwardrv src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] Viewer: implement dock/undock methods
- Date: Fri, 26 Nov 2010 10:12:23 +0000 (UTC)
commit 70c1322598fc0bf504d440afd3b5c58347b55cc3
Author: Brandon Lewis <brandon_lewis alum berkeley edu>
Date: Thu Nov 25 15:27:01 2010 +0000
Viewer: implement dock/undock methods
pitivi/ui/viewer.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 67 insertions(+), 4 deletions(-)
---
diff --git a/pitivi/ui/viewer.py b/pitivi/ui/viewer.py
index 6bd1865..4b49041 100644
--- a/pitivi/ui/viewer.py
+++ b/pitivi/ui/viewer.py
@@ -73,6 +73,8 @@ class PitiviViewer(gtk.VBox, Loggable):
self.seeker.connect('seek', self._seekerSeekCb)
self.action = action
self.pipeline = pipeline
+ self.sink = None
+ self.docked = True
self.current_time = long(0)
self._initial_seek = None
@@ -82,6 +84,7 @@ class PitiviViewer(gtk.VBox, Loggable):
self._haveUI = False
self._createUi()
+ self.target = self.internal
self.setAction(action)
self.setPipeline(pipeline)
@@ -178,7 +181,7 @@ class PitiviViewer(gtk.VBox, Loggable):
# not sure what we need to do ...
self.action = action
# FIXME: fix this properly?
- self.drawingarea.action = action
+ self.internal.action = action
dar = float(4/3)
try:
producer = action.producers[0]
@@ -212,14 +215,28 @@ class PitiviViewer(gtk.VBox, Loggable):
def _getDefaultAction(self):
return ViewAction()
+ def _externalWindowDeleteCb(self, window, event):
+ self.dock()
+ return True
+
def _createUi(self):
""" Creates the Viewer GUI """
# drawing area
self.aframe = gtk.AspectFrame(xalign=0.5, yalign=0.5, ratio=4.0/3.0,
obey_child=False)
self.pack_start(self.aframe, expand=True)
- self.drawingarea = ViewerWidget(self.action)
- self.aframe.add(self.drawingarea)
+ self.internal = ViewerWidget(self.action)
+ self.aframe.add(self.internal)
+
+ self.external_window = gtk.Window()
+ vbox = gtk.VBox()
+ vbox.set_spacing(6)
+ self.external_window.add(vbox)
+ self.external = ViewerWidget(self.action)
+ vbox.pack_start(self.external)
+ self.external_window.connect("delete-event",
+ self._externalWindowDeleteCb)
+ self.external_vbox = vbox
# Slider
self.posadjust = gtk.Adjustment()
@@ -285,6 +302,7 @@ class PitiviViewer(gtk.VBox, Loggable):
height = int(width / self.aframe.props.ratio)
self.aframe.set_size_request(width , height)
self.show_all()
+ self.buttons = boxalign
_showingSlider = True
@@ -442,6 +460,42 @@ class PitiviViewer(gtk.VBox, Loggable):
return
self.pipeline.togglePlayback()
+ def undock(self):
+ if not self.docked:
+ return
+
+ self.docked = False
+ self.undock_action.set_label(_("Dock Viewer"))
+
+ self.remove(self.buttons)
+ self.remove(self.slider)
+ self.external_vbox.pack_end(self.slider, False, False)
+ self.external_vbox.pack_end(self.buttons, False, False)
+ self.external_window.show_all()
+ self.target = self.external
+ # if we are playing, switch output immediately
+ if self.sink:
+ self._switch_output_window()
+ self.hide()
+
+ def dock(self):
+ if self.docked:
+ return
+ self.docked = True
+ self.undock_action.set_label(_("Undock Viewer"))
+
+ self.target = self.internal
+ self.external_vbox.remove(self.slider)
+ self.external_vbox.remove(self.buttons)
+ self.pack_end(self.slider, False, False)
+ self.pack_end(self.buttons, False, False)
+ self.show()
+ # if we are playing, switch output immediately
+ if self.sink:
+ self._switch_output_window()
+ self.external_window.hide()
+
+
def seekRelative(self, time):
try:
self.pipeline.seekRelative(time)
@@ -457,6 +511,8 @@ class PitiviViewer(gtk.VBox, Loggable):
self.playpause_button.setPause()
elif state == int(gst.STATE_PAUSED):
self.playpause_button.setPlay()
+ else:
+ self.sink = None
self.currentState = state
def _eosCb(self, unused_pipeline):
@@ -467,7 +523,14 @@ class PitiviViewer(gtk.VBox, Loggable):
self.log('message:%s / %s', message, name)
if name == 'prepare-xwindow-id':
sink = message.src
- sink.set_xwindow_id(self.drawingarea.window_xid)
+ self.sink = sink
+ self._switch_output_window()
+
+ def _switch_output_window(self):
+ gtk.gdk.threads_enter()
+ self.sink.set_xwindow_id(self.target.window_xid)
+ self.sink.expose()
+ gtk.gdk.threads_leave()
class ViewerWidget(gtk.DrawingArea, Loggable):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]