bulk commit
authorAsbjørn Sloth Tønnesen <asbjorn@ahead.com>
Fri, 11 Jun 2010 18:01:05 +0000 (18:01 +0000)
committerAsbjørn Sloth Tønnesen <asbjorn@ahead.com>
Fri, 11 Jun 2010 18:01:05 +0000 (18:01 +0000)
src/audioplayer.py
src/cellrenderer.py [new file with mode: 0644]
src/main.glade
src/mediaplayer.py
src/talkcutter.py
src/videoplayer.py

index d0ba582..5d30603 100644 (file)
@@ -16,8 +16,11 @@ class audioplayer(mediaplayer):
         self.label = self.wTree.get_widget('audio_label')
         self.bbox = self.wTree.get_widget('audio_buttons')
         self.status = self.wTree.get_widget('audio_status')
+        self.markers = self.wTree.get_widget('audio_markers')
 
         super(audioplayer, self).__init__()
 
+        videosink = gst.element_factory_make('fakesink')
+        self.playbin.set_property('video-sink', videosink)
 
 
diff --git a/src/cellrenderer.py b/src/cellrenderer.py
new file mode 100644 (file)
index 0000000..3c9a1f6
--- /dev/null
@@ -0,0 +1,107 @@
+#!/usr/bin/env python
+# vim: ts=4:sw=4:tw=78:nowrap
+""" Demonstration using editable and activatable CellRenderers """
+import pygtk
+pygtk.require("2.0")
+import gtk, gobject
+
+tasks =  {
+    "Buy groceries": "Go to Asda after work",
+    "Do some programming": "Remember to update your software",
+    "Power up systems": "Turn on the client but leave the server",
+    "Watch some tv": "Remember to catch ER"
+    } 
+
+class GUI_Controller:
+    """ The GUI class is the controller for our application """
+    def __init__(self):
+        # setup the main window
+        self.root = gtk.Window(type=gtk.WINDOW_TOPLEVEL)
+        self.root.set_title("CellRenderer Example")
+        self.root.connect("destroy", self.destroy_cb)
+        # Get the model and attach it to the view
+        self.mdl = Store.get_model()
+        self.view = Display.make_view( self.mdl )
+        # Add our view into the main window
+        self.root.add(self.view)
+        self.root.show_all()
+        return
+    def destroy_cb(self, *kw):
+        """ Destroy callback to shutdown the app """
+        gtk.main_quit()
+        return
+    def run(self):
+        """ run is called to set off the GTK mainloop """
+        gtk.main()
+       return  
+
+class InfoModel:
+    """ The model class holds the information we want to display """
+    def __init__(self):
+        """ Sets up and populates our gtk.TreeStore """
+        self.tree_store = gtk.TreeStore( gobject.TYPE_STRING,
+                                         gobject.TYPE_BOOLEAN )
+        # places the global people data into the list
+        # we form a simple tree.
+        for item in tasks.keys():
+            parent = self.tree_store.append( None, (item, None) )
+            self.tree_store.append( parent, (tasks[item],None) )
+        return
+    def get_model(self):
+        """ Returns the model """
+        if self.tree_store:
+            return self.tree_store 
+        else:
+            return None
+
+class DisplayModel:
+    """ Displays the Info_Model model in a view """
+    def make_view( self, model ):
+        """ Form a view for the Tree Model """
+        self.view = gtk.TreeView( model )
+        # setup the text cell renderer and allows these
+        # cells to be edited.
+        self.renderer = gtk.CellRendererText()
+        self.renderer.set_property( 'editable', True )
+        self.renderer.connect( 'edited', self.col0_edited_cb, model )
+
+        # The toggle cellrenderer is setup and we allow it to be
+        # changed (toggled) by the user.
+        self.renderer1 = gtk.CellRendererToggle()
+        self.renderer1.set_property('activatable', True)
+        self.renderer1.connect( 'toggled', self.col1_toggled_cb, model )
+               
+        # Connect column0 of the display with column 0 in our list model
+        # The renderer will then display whatever is in column 0 of
+        # our model .
+        self.column0 = gtk.TreeViewColumn("Name", self.renderer, text=0)
+               
+        # The columns active state is attached to the second column
+        # in the model.  So when the model says True then the button
+        # will show as active e.g on.
+        self.column1 = gtk.TreeViewColumn("Complete", self.renderer1 )
+        self.column1.add_attribute( self.renderer1, "active", 1)
+        self.view.append_column( self.column0 )
+        self.view.append_column( self.column1 )
+        return self.view
+    def col0_edited_cb( self, cell, path, new_text, model ):
+        """
+        Called when a text cell is edited.  It puts the new text
+        in the model so that it is displayed properly.
+        """
+        print "Change '%s' to '%s'" % (model[path][0], new_text)
+        model[path][0] = new_text
+        return
+    def col1_toggled_cb( self, cell, path, model ):
+        """
+        Sets the toggled state on the toggle button to true or false.
+        """
+        model[path][1] = not model[path][1]
+        print "Toggle '%s' to: %s" % (model[path][0], model[path][1],)
+        return
+
+if __name__ == '__main__':
+    Store = InfoModel()        
+    Display = DisplayModel()
+    myGUI = GUI_Controller()
+    myGUI.run()
index e46fd4d..9e1a901 100644 (file)
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <child>
-              <widget class="GtkVBox" id="vbox2">
-                <property name="visible">True</property>
-                <property name="orientation">vertical</property>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-              </widget>
-              <packing>
-                <property name="resize">False</property>
-                <property name="shrink">True</property>
-              </packing>
+              <placeholder/>
             </child>
             <child>
               <widget class="GtkVBox" id="av_boxes">
                           <widget class="GtkHScale" id="video_seeker">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
+                            <property name="draw_value">False</property>
                           </widget>
                           <packing>
                             <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
-                      <widget class="GtkLabel" id="ideo_status">
+                      <widget class="GtkHBox" id="video_markers">
                         <property name="visible">True</property>
-                        <property name="label" translatable="yes">label</property>
+                        <child>
+                          <placeholder/>
+                        </child>
+                        <child>
+                          <placeholder/>
+                        </child>
+                        <child>
+                          <placeholder/>
+                        </child>
+                        <child>
+                          <placeholder/>
+                        </child>
                       </widget>
                       <packing>
                         <property name="expand">False</property>
                         <property name="position">3</property>
                       </packing>
                     </child>
+                    <child>
+                      <widget class="GtkLabel" id="video_status">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">label</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">4</property>
+                      </packing>
+                    </child>
                   </widget>
                   <packing>
                     <property name="position">0</property>
                           <widget class="GtkHScale" id="audio_seeker">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
+                            <property name="draw_value">False</property>
                           </widget>
                           <packing>
                             <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
+                      <widget class="GtkHBox" id="audio_markers">
+                        <property name="visible">True</property>
+                        <child>
+                          <placeholder/>
+                        </child>
+                        <child>
+                          <placeholder/>
+                        </child>
+                        <child>
+                          <placeholder/>
+                        </child>
+                        <child>
+                          <placeholder/>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                    <child>
                       <widget class="GtkLabel" id="audio_status">
                         <property name="visible">True</property>
                         <property name="label" translatable="yes">label</property>
                       </widget>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="position">2</property>
+                        <property name="position">3</property>
                       </packing>
                     </child>
                   </widget>
index 4b4df99..352aa84 100644 (file)
@@ -4,6 +4,7 @@ import sys
 import pygtk
 import gtk
 import gtk.glade
+import time
 
 class mediaplayer(object):
     PLAY_IMAGE = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)
@@ -19,6 +20,7 @@ class mediaplayer(object):
         self.spinner.set_range(0, 100)
         self.spinner.set_increments(1, 10)
         self.spinner.connect('value-changed', self.on_spinner_change)
+        self.spinner.connect('output', self.on_spinner_output)
 
         self.seeker.set_range(0, 100)
         self.seeker.set_increments(1, 10)
@@ -26,18 +28,46 @@ class mediaplayer(object):
         self.seeker.connect('button-press-event', self.on_button_press)
         self.seeker.connect('button-release-event', self.on_button_release)
 
+        label = gtk.Label()
+        label.set_text('Begin:')
+        self.markers.pack_start(label, True)
+
+        self.begin = gtk.SpinButton()
+        self.begin.connect('output', self.on_spinner_output)
+        self.markers.pack_start(self.begin, True)
+
+        label = gtk.Label()
+        label.set_text('End:')
+        self.markers.pack_start(label, True)
+
+        self.end = gtk.SpinButton()
+        self.end.connect('output', self.on_spinner_output)
+        self.markers.pack_start(self.end, True)
+
+        label = gtk.Label()
+        label.set_text('Length:')
+        self.markers.pack_start(label, True)
+
+        self.length = gtk.SpinButton()
+        self.length.connect('output', self.on_spinner_output)
+        self.markers.pack_start(self.length, True)
+
+        self.markers.show_all()
+
         self.play_button = gtk.Button()
+        self.image_play = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)
+        self.image_pause = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON)
         self.play_button.set_image(self.PLAY_IMAGE)
         self.play_button.connect('clicked', self.on_play_clicked)
         self.bbox.pack_start(self.play_button, False)
 
         self.begin_button = gtk.Button()
-        self.begin_button.set_image(self.PLAY_IMAGE)
+        self.begin_button.set_image(gtk.image_new_from_stock(gtk.STOCK_GOTO_FIRST, gtk.ICON_SIZE_BUTTON))
         self.begin_button.connect('clicked', self.on_begin_clicked)
         self.bbox.pack_start(self.begin_button, False)
 
         self.end_button = gtk.Button()
-        self.end_button.set_image(self.PLAY_IMAGE)
+        self.end_button.set_image(gtk.image_new_from_stock(gtk.STOCK_GOTO_LAST, gtk.ICON_SIZE_BUTTON))
         self.end_button.connect('clicked', self.on_end_clicked)
         self.bbox.pack_start(self.end_button, False)
 
@@ -46,12 +76,13 @@ class mediaplayer(object):
         self.is_loaded = False
         self.is_playing = False
         self.known_range = False
+        self.lock_slider = 0
 
     def play(self, uri):
         self.playbin.set_property('uri', uri)
         self.playbin.set_state(gst.STATE_PLAYING)
         self.label.label = 'f';
-        gobject.timeout_add(500, self.update_slider)
+        gobject.timeout_add(50, self.update_slider)
         self.is_playing = True
         self.is_loaded = True
         self.known_range = False
@@ -65,9 +96,15 @@ class mediaplayer(object):
     def on_video_realized(self, sender):
         self.sink.set_xwindow_id(self.drawingarea.window.xid)
 
+    def get_pos(self):
+        nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME)
+        return float(nanosecs) / gst.SECOND;
+
     def update_slider(self):
         if not self.is_playing:
             return True
+        if self.lock_slider > time.time():
+            return True
 
         try:
             if not self.known_range:
@@ -77,48 +114,68 @@ class mediaplayer(object):
                   print duration_secs
                   self.seeker.set_range(0, duration_secs)
                   self.spinner.set_range(0, duration_secs)
+                  self.begin.set_range(0, duration_secs)
+                  self.end.set_range(0, duration_secs)
+                  self.length.set_range(0, duration_secs)
                   self.known_range = True
                   print "Duration: %f" % (duration_secs) 
 
-            nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME)
+            value = self.get_pos()
+            self.set_value(value)
 
-            # block seek handler so we don't seek when we set_value()
-            self.seeker.handler_block_by_func(self.on_seeker_change)
-            self.spinner.handler_block_by_func(self.on_spinner_change)
+        except gst.QueryError:
+            # pipeline must not be ready and does not know position
+            pass
 
-            value = float(nanosecs) / gst.SECOND;
+        return True # continue calling every 30 milliseconds
 
-            #print "Trigger: %f" % (value) 
+    def set_value(self, value):
+        # block seek handler so we don't seek when we set_value()
+        self.seeker.handler_block_by_func(self.on_seeker_change)
+        self.spinner.handler_block_by_func(self.on_spinner_change)
 
-            self.seeker.set_value(value)
-            self.spinner.set_text("%f" %(value))
+        #print "Trigger: %f" % (value) 
 
-            self.seeker.handler_unblock_by_func(self.on_seeker_change)
-            self.spinner.handler_unblock_by_func(self.on_spinner_change)
+        self.seeker.set_value(value)
+        self.spinner.set_value(value)
 
-        except gst.QueryError:
-            # pipeline must not be ready and does not know position
-            pass
+        self.seeker.handler_unblock_by_func(self.on_seeker_change)
+        self.spinner.handler_unblock_by_func(self.on_spinner_change)
 
-        return True # continue calling every 30 milliseconds
+    def formatSecondsToMencoder(self, s):
+        ds = s % 1
+        ws = s - ds
+        ds *= 1000
+        s = ws % 60
+        ws -= s
+        m = ws % 3600 / 60
+        ws -= ws % 3600
+        h = ws / 3600
+        return "%02d:%02d:%02d.%03d" % (h, m, s, ds)
 
+    def on_spinner_change(self, element):
+        seek_time_secs = element.get_value()
+        self.mseek(seek_time_secs)
 
     def on_seeker_change(self, element, a, b):
         seek_time_secs = element.get_value()
         self.mseek(seek_time_secs)
 
-    def on_spinner_change(self, element):
-        seek_time_secs = float(element.get_value())
-        self.mseek(seek_time_secs)
+    def on_spinner_output(self, element):
+        element.set_text(self.formatSecondsToMencoder(element.get_value()))
+        return True
 
     def mplay(self):
         self.playbin.set_state(gst.STATE_PLAYING)
+        self.mseek(self.get_pos())
 
     def mpause(self):
         self.playbin.set_state(gst.STATE_PAUSED)
 
     def mseek(self, seek_time_secs):
-        print 'seek: %f' % (seek_time_secs)
+        #print 'seek: %f' % (seek_time_secs)
+        self.set_value(seek_time_secs)
+        self.lock_slider = time.time() + 0.1;
         self.playbin.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT, seek_time_secs * gst.SECOND)
 
     def on_button_press(self, element, a):
@@ -140,6 +197,17 @@ class mediaplayer(object):
           self.is_playing = True;
           
     def on_begin_clicked(self, element):
+        pos = self.get_pos()
+        print 'Begin clicked: %f' % (pos)
+        self.begin.set_value(pos)
+        self.update_length()
         
     def on_end_clicked(self, element):
+        pos = self.get_pos()
+        print 'End clicked: %f' % (pos)
+        self.end.set_value(pos)
+        self.update_length()
+    
+    def update_length(self):
+        self.length.set_value(self.end.get_value() - self.begin.get_value())
 
index 15e5b94..276fd68 100755 (executable)
@@ -4,6 +4,8 @@ import gst, gtk, gobject
 import sys
 from videoplayer import videoplayer
 from audioplayer import audioplayer
+from tree import tree
+
 try:
     import pygtk
     pygtk.require("2.0")
@@ -41,7 +43,11 @@ class TalkCutter:
         self.video = videoplayer(self)
         self.video.play('file:///mnt/dl/dkuug/video/osd10/dan/dan.dv')
 
+        self.tree = tree()
+        self.wTree.get_widget('hpaned6').add(self.tree.get_tree())
+
         print self.wTree.get_widget('dMain').show()
+
         self.wTree.visible = True
         gtk.main()
 
@@ -58,5 +64,10 @@ class TalkCutter:
         sys.exit(0)
 
 if __name__ == "__main__":
+    try:
         TalkCutter()
+    except KeyboardInterrupt:
+        print ''
+    except SystemExit:
+        pass
 
index 73e22f2..f4abcd0 100644 (file)
@@ -18,6 +18,7 @@ class videoplayer(mediaplayer):
         self.bbox = self.wTree.get_widget('video_buttons')
         self.status = self.wTree.get_widget('video_status')
         self.drawingarea = self.wTree.get_widget('video')
+        self.markers = self.wTree.get_widget('video_markers')
 
         super(videoplayer, self).__init__()