Changeset 2491

Show
Ignore:
Timestamp:
2006-09-14 00:13:37 (2 years ago)
Author:
scott
Message:

Improved forward/back, added highlighting and plays only clip.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • scripts/trunk/annotool.py

    r2451 r2491  
    8989      
    9090  def open_file(self, accel_group, window, keyval, modifier): 
     91    print "Ctrl - O" 
    9192    dialog = gtk.FileChooserDialog("Open",self.window,gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) 
    9293    dialog.set_default_response(gtk.RESPONSE_OK) 
     
    113114     
    114115  def import_file(self, accel_group, window, keyval, modifier): 
     116    print "Ctrl - I" 
    115117    dialog = gtk.FileChooserDialog("Import",self.window,gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) 
    116118    dialog.set_default_response(gtk.RESPONSE_OK) 
     
    145147     
    146148  def save_file(self, accel_group, window, keyval, modifier): 
     149    print "Ctrl - S" 
    147150    dialog = gtk.FileChooserDialog("Save",self.window,gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK)) 
    148151    dialog.set_default_response(gtk.RESPONSE_OK) 
     
    181184  # Text overlay functions. 
    182185  def toggle_track(self, accel_group, window, keyval, modifier): 
     186    print "Ctrl - T" 
    183187    keys = self.times.keys() 
    184188    new_track = keys.index(self.current_track)+1 
     
    188192  # Navigation functions. 
    189193  def restart_clip(self, accel_group, window, keyval, modifier): 
    190     self.pipeline.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, gst.MSECOND*to_ms(self.start_time.get_text()), gst.SEEK_TYPE_NONE, 0) 
     194    print "Ctrl - R" 
     195    self.seek(self.start_time.get_text()) 
     196     
     197  def current_clip(self,current_time): 
     198      x = 0 
     199      while (x)<len(self.times[self.current_track]['start']) and current_time>=to_ms(self.times[self.current_track]['start'][x]): 
     200        x += 1 
     201      return x-1 
    191202      
    192203  def previous_clip(self, accel_group, window, keyval, modifier): 
    193     if len(self.times[self.current_track]['start'])>1 and self.pipeline.query_position(gst.FORMAT_TIME)[0]/gst.MSECOND>to_ms(self.times[self.current_track]['start'][1]): 
    194       x = 2 
    195       while x<len(self.times[self.current_track]['start']) and self.pipeline.query_position(gst.FORMAT_TIME)[0]/gst.MSECOND>to_ms(self.times[self.current_track]['start'][x]): 
    196         x += 1 
    197       self.pipeline.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, gst.MSECOND*to_ms(self.times[self.current_track]['start'][x-2]), gst.SEEK_TYPE_NONE, 0) 
    198       self.start_time.set_text(self.times[self.current_track]['start'][x-2]) 
     204    print "Ctrl - B" 
     205    clip_now = self.current_clip(self.pipeline.query_position(gst.FORMAT_TIME)[0]/gst.MSECOND) 
     206    if clip_now > 0: 
     207      self.seek(self.times[self.current_track]['start'][clip_now-1],self.times[self.current_track]['start'][clip_now]) 
     208       
     209      #Highlight chapter entry. 
     210      self.text.remove_tag(self.tag_current, self.text.get_start_iter(),self.text.get_end_iter()) 
     211      mark = self.text.get_mark(self.times[self.current_track]['start'][clip_now-1]) 
     212      start_iter = self.text.get_iter_at_mark(mark) 
     213      if not start_iter.begins_tag(self.tag_clip): 
     214        start_iter.forward_to_tag_toggle(self.tag_clip) 
     215      end_iter = start_iter.copy() 
     216      end_iter.forward_to_tag_toggle(self.tag_clip) 
     217      self.text.apply_tag(self.tag_current, start_iter, end_iter) 
     218       
     219      #Scroll to mark 
     220      self.textView.scroll_to_mark(mark,0.1) 
     221       
     222      self.mode = 'review' 
     223       
     224      self.start_time.set_text(self.times[self.current_track]['start'][clip_now-1]) 
     225      self.end_time.set_text(self.times[self.current_track]['start'][clip_now]) 
    199226      if self.pipeline_duration==10: 
    200227        self.pipeline_duration = self.pipeline.query_duration(gst.FORMAT_TIME)[0]/gst.MSECOND 
    201       self.progress.props.fraction = float(to_ms(self.times[self.current_track]['start'][x-2]))/self.pipeline_duration 
     228      self.progress.props.fraction = float(to_ms(self.times[self.current_track]['start'][clip_now-1]))/self.pipeline_duration 
    202229    else: 
    203       self.pipeline.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, gst.MSECOND*0, gst.SEEK_TYPE_NONE, 0) 
    204       self.start_time.set_text('00:00:00.000') 
    205       self.progress.props.fraction = 0 
     230      print self.current_track + " has no previous clips." 
    206231     
    207232  def next_clip(self, accel_group, window, keyval, modifier): 
     233    print "Ctrl - N" 
    208234    #Only seek forward clips if more clips exist. 
    209     if self.pipeline.query_position(gst.FORMAT_TIME)[0]/gst.MSECOND<to_ms(self.times[self.current_track]['start'][-1]): 
     235    if len(self.times[self.current_track]['start'])>1 and self.pipeline.query_position(gst.FORMAT_TIME)[0]/gst.MSECOND<to_ms(self.times[self.current_track]['start'][-1]): 
    210236      x = 2 
    211237      while x<len(self.times[self.current_track]['start']) and self.pipeline.query_position(gst.FORMAT_TIME)[0]/gst.MSECOND<to_ms(self.times[self.current_track]['start'][-x]): 
    212238        x += 1 
    213       self.pipeline.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, gst.MSECOND*to_ms(self.times[self.current_track]['start'][-(x-1)]), gst.SEEK_TYPE_NONE, 0) 
     239      if x > 3: 
     240        self.seek(self.times[self.current_track]['start'][-(x-1)], self.times[self.current_track]['start'][-(x-2)]) 
     241      else: 
     242        self.seek(self.times[self.current_track]['start'][-(x-1)]) 
     243        self.mode = 'transcribe' 
     244       
     245      #Highlight chapter entry. 
     246      self.text.remove_tag(self.tag_current, self.text.get_start_iter(),self.text.get_end_iter()) 
     247      mark = self.text.get_mark(self.times[self.current_track]['start'][-(x-1)]) 
     248      start_iter = self.text.get_iter_at_mark(mark) 
     249      if not start_iter.begins_tag(self.tag_clip): 
     250        start_iter.forward_to_tag_toggle(self.tag_clip) 
     251      end_iter = start_iter.copy() 
     252      end_iter.forward_to_tag_toggle(self.tag_clip) 
     253      self.text.apply_tag(self.tag_current, start_iter, end_iter) 
     254       
     255      #Scroll to mark 
     256      self.textView.scroll_to_mark(mark,0.1) 
     257       
     258      self.mode = 'review' 
     259       
    214260      self.start_time.set_text(self.times[self.current_track]['start'][-(x-1)]) 
     261      self.end_time.set_text(self.times[self.current_track]['start'][-(x-2)]) 
    215262      if self.pipeline_duration==10: 
    216263        self.pipeline_duration = self.pipeline.query_duration(gst.FORMAT_TIME)[0]/gst.MSECOND 
    217264      self.progress.props.fraction = float(to_ms(self.times[self.current_track]['start'][-(x-1)]))/self.pipeline_duration 
     265    else: 
     266      print self.current_track + " has no more clips." 
    218267   
    219268  def just_play(self, accel_group, window, keyval, modifier): 
     269    print "Ctrl - P" 
    220270    if (self.pipeline.get_state()[1] != gst.STATE_PLAYING): 
    221271      self.pipeline.set_state(gst.STATE_PLAYING); 
    222272       
     273  def seek(self,start,end=None): 
     274    if end==None: 
     275      return self.pipeline.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, gst.MSECOND*to_ms(start), gst.SEEK_TYPE_NONE, 0) 
     276    else: 
     277      return self.pipeline.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, gst.MSECOND*to_ms(start), gst.SEEK_TYPE_SET, gst.MSECOND*to_ms(end)) 
     278       
    223279  def enter_activated(self, widget, data=None): 
    224280    #Handles clip to text buffer, formatting and pipeline control. 
     281    print "Enter" 
    225282    if (self.pipeline.get_state()[1] == gst.STATE_PLAYING): 
    226283      self.pipeline.set_state(gst.STATE_PAUSED); 
     
    232289        self.pipeline_duration = self.pipeline.query_duration(gst.FORMAT_TIME)[0]/gst.MSECOND 
    233290      self.progress.props.fraction = float(current_time)/self.pipeline_duration 
    234     elif (self.pipeline.get_state()[1] == gst.STATE_PAUSED)
     291    elif self.pipeline.get_state()[1] == gst.STATE_PAUSED and not self.mode=='review'
    235292      text = self.clip_text.get_text() 
    236       if text[:1] == ")" or (text.find(":")==-1 and self.last_type_def==")")
     293      if text[:1] == ")" or (text.find(":")==-1 and self.last_type_def==")") and self.start_time.get_text() != 'xx:xx:xx.xxx'
    237294        #Chapter deocration. 
    238295        self.text.insert(self.text.get_end_iter(),"\n\nChapter " + str(len(self.times["chapter"])+1) + ": ") 
    239296        #Mark handling. 
    240297        self.times["chapter"]['start'].append(self.start_time.get_text()) 
    241         self.times["chapter"]['all'].append(self.start_time.get_text()) 
    242298        mark = self.text.create_mark(self.start_time.get_text(),self.text.get_end_iter(),True) 
    243299        mark.set_visible(self.visible_marks) 
     
    245301        self.text.insert(self.text.get_end_iter(),text.strip().strip(")")) 
    246302        self.last_type_def = ")" 
    247       elif text.find(":")!=-1 or self.last_type_def.endswith(":")
     303      elif text.find(":")!=-1 or self.last_type_def.endswith(":") and self.start_time.get_text() != 'xx:xx:xx.xxx'
    248304        # If using the last type def make sure doesn't have ';' instead of intended ':' 
    249305        if text.find(":")==-1 and text.find(";")!=-1: 
     
    261317          self.last_type_def = text[:text.find(":")+1].lower() 
    262318        elif text!='': 
    263           #Handles spaces between clips. FIXME 
     319          #Handles spaces between clips. 
    264320          self.text.insert(self.text.get_end_iter()," ") 
    265321        #Mark handling. 
    266322        self.times["subtitle"]['start'].append(self.start_time.get_text()) 
    267         self.times["subtitle"]['all'].append(self.start_time.get_text()) 
    268323        mark = self.text.create_mark(self.start_time.get_text(),self.text.get_end_iter(),True) 
    269324        mark.set_visible(self.visible_marks) 
     
    272327        #Insert text. 
    273328        self.text.insert(self.text.get_end_iter(),text[text.find(":")+1:].strip()) 
    274       if text != ""
     329      if text != "" and self.start_time.get_text() != 'xx:xx:xx.xxx'
    275330        try: 
    276           #Change mark gravity. 
    277           ##Cannot change mark gravity?  Whats with that? FIXME 
    278331          #Underline contents. 
    279332          clip_iter = self.text.get_iter_at_mark(mark) 
     
    288341      self.end_time.set_text("xx:xx:xx.xxx") 
    289342      self.textView.props.can_focus = False 
     343      self.scroll_to_bottom() 
     344      self.pipeline.set_state(gst.STATE_PLAYING); 
     345      self.progress.props.text = self.current_file + ": Playing." 
     346    elif self.pipeline.get_state()[1] == gst.STATE_PAUSED: 
     347      self.start_time.set_text(format_time(self.pipeline.query_position(gst.FORMAT_TIME)[0]/gst.MSECOND)) 
     348      self.end_time.set_text("xx:xx:xx.xxx") 
     349      self.textView.props.can_focus = False 
    290350      self.pipeline.set_state(gst.STATE_PLAYING); 
    291351      self.progress.props.text = self.current_file + ": Playing." 
    292352    return 
    293353     
    294   def scroll_to_bottom(self, widget): 
    295     self.textView.scroll_to_mark(self.text.get_mark("insert"),0.1) 
     354  def scroll_to_bottom(self): 
     355    if self.mode=='transcribe': 
     356      self.textView.scroll_to_iter(self.text.get_end_iter(),0.1) 
    296357     
    297358  def export_buffer(self): 
     
    478539          last_speaker = title 
    479540        elif track.startswith('subtitle'): 
    480           #Handles spaces between clips. FIXME 
     541          #Handles spaces between clips. 
    481542          self.text.insert(self.text.get_end_iter()," ") 
    482543        else: 
    483           self.text.insert(self.text.get_end_iter(),"\n\nChapter " + str(len(self.times["chapter"])+1) + ": ") 
     544          self.text.insert(self.text.get_end_iter(),"\n\nChapter " + str(len(self.times["chapter"]["start"])+1) + ": ") 
    484545           
    485546        #Create start mark. 
     
    508569      x += 1 
    509570      self.progress.props.fraction = x/total_clips 
    510     self.pipeline.get_state() # Hack but stalls script until state change. FIXME 
     571    self.pipeline.get_state() # Let pipeline catch up to script. 
    511572    if end_time!="": 
    512       self.pipeline.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, gst.MSECOND*to_ms(end_time), gst.SEEK_TYPE_NONE, 0
     573      self.seek(end_time
    513574      self.start_time.set_text(end_time) 
    514575    else: 
    515       self.pipeline.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, gst.MSECOND*to_ms(start_time), gst.SEEK_TYPE_NONE, 0
     576      self.seek(start_time
    516577      self.start_time.set_text(start_time) 
    517578    f.close() 
     
    590651    self.tag_clip = self.text.create_tag("clip",underline=pango.UNDERLINE_SINGLE) 
    591652    self.tag_speaker = self.text.create_tag("speaker",invisible=True) 
    592     self.text.connect("changed", self.scroll_to_bottom
     653    self.tag_current = self.text.create_tag("current",foreground="red"
    593654    self.textView = gtk.TextView(self.text) 
    594655    self.textView.set_editable(True) 
     
    651712      self.playbin.props.video_sink = self.video_process 
    652713    else: 
    653       self.playbin.props.video_sink = gst.element_factory_make ("xvimagesink") 
     714      self.playbin.props.video_sink = gst.element_factory_make ("ximagesink") 
    654715    self.playbin.props.vis_plugin = gst.element_factory_make ("libvisual_corona") 
    655716 
     
    662723    self.last_type_def = "$" 
    663724    self.current_track = "subtitle" 
    664     self.visible_marks = Tru
     725    self.visible_marks = Fals
    665726    self.pipeline_duration = 1000 #Something non-zero to avoid non-zero errors. 
     727    self.mode = 'transcribe' 
    666728     
    667729    self.window.show_all()