From: Asbjørn Sloth Tønnesen Date: Fri, 11 Jun 2010 18:01:05 +0000 (+0000) Subject: bulk commit X-Git-Url: http://git.asbjorn.biz/?p=talkcutter.git;a=commitdiff_plain;h=597554e7fc942aad08c403756f3a26480124c381 bulk commit --- diff --git a/src/audioplayer.py b/src/audioplayer.py index d0ba582..5d30603 100644 --- a/src/audioplayer.py +++ b/src/audioplayer.py @@ -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 index 0000000..3c9a1f6 --- /dev/null +++ b/src/cellrenderer.py @@ -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() diff --git a/src/main.glade b/src/main.glade index e46fd4d..9e1a901 100644 --- a/src/main.glade +++ b/src/main.glade @@ -150,23 +150,7 @@ True True - - True - vertical - - - - - - - - - - - - False - True - + @@ -207,6 +191,7 @@ True True + False 0 @@ -243,15 +228,36 @@ - + True - label + + + + + + + + + + + + False 3 + + + True + label + + + False + 4 + + 0 @@ -287,6 +293,7 @@ True True + False 0 @@ -323,13 +330,34 @@ + + True + + + + + + + + + + + + + + + False + 2 + + + True label False - 2 + 3 diff --git a/src/mediaplayer.py b/src/mediaplayer.py index 4b4df99..352aa84 100644 --- a/src/mediaplayer.py +++ b/src/mediaplayer.py @@ -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()) diff --git a/src/talkcutter.py b/src/talkcutter.py index 15e5b94..276fd68 100755 --- a/src/talkcutter.py +++ b/src/talkcutter.py @@ -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 diff --git a/src/videoplayer.py b/src/videoplayer.py index 73e22f2..f4abcd0 100644 --- a/src/videoplayer.py +++ b/src/videoplayer.py @@ -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__()