def _move_mode_move(frame, x, y): """ Updates edit data needed for doing edit and drawing overlay based on mouse movement. """ global edit_data # Get frame that is the one where insert is attempted press_frame = edit_data["press_frame"] first_clip_start = edit_data["first_clip_start"] attempt_insert_frame = first_clip_start + (frame - press_frame) edit_data["attempt_insert_frame"] = attempt_insert_frame # Get track where insert is attempted. Track selection forced into range of editable tracks. to_track = tlinewidgets.get_track(y) if to_track == None: if y > tlinewidgets.REF_LINE_Y: to_track = get_track(1) else: to_track = get_track(len(current_sequence().tracks) - 2) if to_track.id < 1: to_track = get_track(1) if to_track.id > len(current_sequence().tracks) - 2: to_track = get_track(len(current_sequence().tracks) - 2) edit_data["to_track_object"] = to_track # Get index for insert in target track insert_index = to_track.get_clip_index_at(attempt_insert_frame) edit_data["insert_index"] = insert_index edit_data["insert_frame"] = to_track.clip_start(insert_index) _set_current_move_frame_and_check_move_start(frame, x, y)
def splice_out_button_pressed(): """ Removes 1 - n long continuous clip range from track and closes the created gap. """ if movemodes.selected_track == -1: return # Edit consumes selection, so clear selected from clips movemodes.set_range_selection(movemodes.selected_track, movemodes.selected_range_in, movemodes.selected_range_out, False) track = get_track(movemodes.selected_track) if editevent.track_lock_check_and_user_info(track, splice_out_button_pressed, "splice out"): movemodes.clear_selection_values() return data = {"track":track, "from_index":movemodes.selected_range_in, "to_index":movemodes.selected_range_out} edit_action = edit.remove_multiple_action(data) edit_action.do_edit() # Nothing is selected after edit movemodes.clear_selection_values() updater.repaint_tline()
def open_selection_in_effects(): if movemodes.selected_range_in == -1: return track = get_track(movemodes.selected_track) clip = track.clips[movemodes.selected_range_in] clipeffectseditor.set_clip(clip, track, movemodes.selected_range_in)
def set_range_selection(track_index, range_in, range_out, is_selected): """ Sets range of clips in track to selection value. """ track = get_track(track_index) for i in range(range_in, range_out + 1): #+1, range_out is inclusive track.clips[i].selected = is_selected
def set_track_normal_height(track_index, is_retry=False): track = get_track(track_index) track.height = appconsts.TRACK_HEIGHT_NORMAL # Check that new height tracks can be displayed and cancel if not. new_h = current_sequence().get_tracks_height() allocation = gui.tline_canvas.widget.get_allocation() x, y, w, h = allocation.x, allocation.y, allocation.width, allocation.height if new_h > h and is_retry == False: current_paned_pos = gui.editor_window.app_v_paned.get_position() new_paned_pos = current_paned_pos - (new_h - h) - 5 gui.editor_window.app_v_paned.set_position(new_paned_pos) GObject.timeout_add(200, lambda: set_track_normal_height(track_index, True)) return False allocation = gui.tline_canvas.widget.get_allocation() x, y, w, h = allocation.x, allocation.y, allocation.width, allocation.height if new_h > h: track.height = appconsts.TRACK_HEIGHT_SMALL dialogutils.warning_message(_("Not enough vertical space on Timeline to expand track"), _("Maximize or resize application window to get more\nspace for tracks if possible."), gui.editor_window.window, True) return False tlinewidgets.set_ref_line_y(gui.tline_canvas.widget.get_allocation()) gui.tline_column.init_listeners() updater.repaint_tline() return False
def add_transition_pressed(retry_from_render_folder_select=False): if movemodes.selected_track == -1: print "so selection track" # INFOWINDOW return track = get_track(movemodes.selected_track) clip_count = movemodes.selected_range_out - movemodes.selected_range_in + 1 # +1 out incl. if not ((clip_count == 2) or (clip_count == 1)): # INFOWINDOW print "clip count" return if track.id < current_sequence().first_video_index and clip_count == 1: _no_audio_tracks_mixing_info() return if editorpersistance.prefs.render_folder == None: if retry_from_render_folder_select == True: return dialogs.select_rendred_clips_dir( _add_transition_render_folder_select_callback, gui.editor_window.window, editorpersistance.prefs.render_folder) return if clip_count == 2: _do_rendered_transition(track) else: _do_rendered_fade(track)
def lift_button_pressed(): """ Removes 1 - n long continuous clip range from track and fills the created gap with a black clip """ if movemodes.selected_track == -1: return # Edit consumes selection, set clips seletion attr to false movemodes.set_range_selection(movemodes.selected_track, movemodes.selected_range_in, movemodes.selected_range_out, False) track = get_track(movemodes.selected_track) if editevent.track_lock_check_and_user_info(track, lift_button_pressed, "lift"): movemodes.clear_selection_values() return data = { "track": track, "from_index": movemodes.selected_range_in, "to_index": movemodes.selected_range_out } edit_action = edit.lift_multiple_action(data) edit_action.do_edit() # Nothing is left selected after edit movemodes.clear_selection_values() updater.repaint_tline()
def set_track_normal_height(track_index, is_retry=False): track = get_track(track_index) track.height = appconsts.TRACK_HEIGHT_NORMAL # Check that new height tracks can be displayed and cancel if not. new_h = current_sequence().get_tracks_height() allocation = gui.tline_canvas.widget.get_allocation() x, y, w, h = allocation.x, allocation.y, allocation.width, allocation.height if new_h > h and is_retry == False: current_paned_pos = gui.editor_window.app_v_paned.get_position() new_paned_pos = current_paned_pos - (new_h - h) - 5 gui.editor_window.app_v_paned.set_position(new_paned_pos) GObject.timeout_add(200, lambda: set_track_normal_height(track_index, True)) return False allocation = gui.tline_canvas.widget.get_allocation() x, y, w, h = allocation.x, allocation.y, allocation.width, allocation.height if new_h > h: track.height = appconsts.TRACK_HEIGHT_SMALL dialogutils.warning_message( _("Not enough vertical space on Timeline to expand track"), _("Maximize or resize application window to get more\nspace for tracks if possible." ), gui.editor_window.window, True) return False tlinewidgets.set_ref_line_y(gui.tline_canvas.widget.get_allocation()) gui.tline_column.init_listeners() updater.repaint_tline() return False
def add_transition_pressed(retry_from_render_folder_select=False): if movemodes.selected_track == -1: print "so selection track" # INFOWINDOW return track = get_track(movemodes.selected_track) clip_count = movemodes.selected_range_out - movemodes.selected_range_in + 1 # +1 out incl. if not ((clip_count == 2) or (clip_count == 1)): # INFOWINDOW print "clip count" return if track.id < current_sequence().first_video_index and clip_count == 1: _no_audio_tracks_mixing_info() return if editorpersistance.prefs.render_folder == None: if retry_from_render_folder_select == True: return dialogs.select_rendred_clips_dir(_add_transition_render_folder_select_callback, gui.editor_window.window, editorpersistance.prefs.render_folder) return if clip_count == 2: _do_rendered_transition(track) else: _do_rendered_fade(track)
def lift_button_pressed(): """ Removes 1 - n long continuous clip range from track and fills the created gap with a black clip """ if movemodes.selected_track == -1: return # Edit consumes selection, set clips seletion attr to false movemodes.set_range_selection(movemodes.selected_track, movemodes.selected_range_in, movemodes.selected_range_out, False) track = get_track(movemodes.selected_track) if editevent.track_lock_check_and_user_info(track, lift_button_pressed, "lift"): movemodes.clear_selection_values() return data = {"track":track, "from_index":movemodes.selected_range_in, "to_index":movemodes.selected_range_out} edit_action = edit.lift_multiple_action(data) edit_action.do_edit() # Nothing is left selected after edit movemodes.clear_selection_values() updater.repaint_tline()
def splice_out_button_pressed(): """ Removes 1 - n long continuous clip range from track and closes the created gap. """ if movemodes.selected_track == -1: return # Edit consumes selection, so clear selected from clips movemodes.set_range_selection(movemodes.selected_track, movemodes.selected_range_in, movemodes.selected_range_out, False) track = get_track(movemodes.selected_track) if editevent.track_lock_check_and_user_info(track, splice_out_button_pressed, "splice out"): movemodes.clear_selection_values() return data = { "track": track, "from_index": movemodes.selected_range_in, "to_index": movemodes.selected_range_out } edit_action = edit.remove_multiple_action(data) edit_action.do_edit() # Nothing is selected after edit movemodes.clear_selection_values() updater.repaint_tline()
def track_double_click(track_id): track = get_track(track_id) # data.track is index, not object if track.height == appconsts.TRACK_HEIGHT_HIGH: set_track_small_height(track_id) elif track.height == appconsts.TRACK_HEIGHT_NORMAL: set_track_high_height(track_id) elif track.height == appconsts.TRACK_HEIGHT_SMALL: set_track_normal_height(track_id)
def three_point_overwrite_pressed(): # Check that state is good for edit if movemodes.selected_track == -1: primary_txt = _("No Clips are selected!") secondary_txt = _( "You need to select clips to overwrite to perform this edit.") dialogutils.info_message(primary_txt, secondary_txt, gui.editor_window.window) return # Get data track = get_track(movemodes.selected_track) if editevent.track_lock_check_and_user_info(track, three_point_overwrite_pressed, "3 point overwrite"): return range_start_frame = track.clip_start(movemodes.selected_range_in) out_clip = track.clips[movemodes.selected_range_out] out_start = track.clip_start(movemodes.selected_range_out) range_end_frame = out_start + out_clip.clip_out - out_clip.clip_in range_length = range_end_frame - range_start_frame + 1 # calculated end is incl. over_clip = _get_new_clip_from_clip_monitor() if over_clip == None: no_monitor_clip_info(gui.editor_window.window) return over_length = over_clip.mark_out - over_clip.mark_in + 1 # + 1 out incl ?????????? what if over_clip.mark_out == -1 ?????????? if over_length < range_length: monitor_clip_too_short(gui.editor_window.window) return over_clip_out = over_clip.mark_in + range_length - 1 # -1 out incl range_in = movemodes.selected_range_in range_out = movemodes.selected_range_out movemodes.clear_selected_clips() # edit consumes selection updater.save_monitor_frame = False # hack to not get wrong value saved in MediaFile.current_frame data = { "track": track, "clip": over_clip, "clip_in": over_clip.mark_in, "clip_out": over_clip_out, "in_index": range_in, "out_index": range_out } action = edit.three_point_overwrite_action(data) action.do_edit() if not editorstate.timeline_visible(): updater.display_sequence_in_monitor() updater.display_tline_cut_frame(track, range_in)
def set_track_small_height(track_index): track = get_track(track_index) track.height = appconsts.TRACK_HEIGHT_SMALL if editorstate.SCREEN_HEIGHT < 863: track.height = appconsts.TRACK_HEIGHT_SMALLEST tlinewidgets.set_ref_line_y(gui.tline_canvas.widget.get_allocation()) gui.tline_column.init_listeners() updater.repaint_tline()
def cut_pressed(): if not timeline_visible(): updater.display_sequence_in_monitor() if EDIT_MODE() == editorstate.ONE_ROLL_TRIM: editevent.oneroll_trim_no_edit_init() return if EDIT_MODE() == editorstate.TWO_ROLL_TRIM: editevent.tworoll_trim_no_edit_init() return tline_frame = PLAYER().current_frame() movemodes.clear_selected_clips() # Iterate tracks and do cut on all active that have non-blanck # clips and frame is not on previous edits for i in range(1, len(current_sequence().tracks)): track = get_track(i) if track.active == False: continue if editevent.track_lock_check_and_user_info( track, cut_pressed, "cut"): # so the other tracks get cut... continue # Get index and clip index = track.get_clip_index_at(int(tline_frame)) try: clip = track.clips[index] # don't cut blanck clip if clip.is_blanck_clip: continue except Exception: continue # Frame after last clip in track # Get cut frame in clip frames clip_start_in_tline = track.clip_start(index) clip_frame = tline_frame - clip_start_in_tline + clip.clip_in # Dont edit if frame on cut. if clip_frame == clip.clip_in: continue # Do edit data = { "track": track, "index": index, "clip": clip, "clip_cut_frame": clip_frame } action = edit.cut_action(data) action.do_edit() updater.repaint_tline()
def track_active_switch_pressed(data): track = get_track(data.track) # data.track is index, not object # Flip active state if data.event.button == 1: track.active = track.active == False if current_sequence().all_tracks_off() == True: track.active = True gui.tline_column.widget.queue_draw() elif data.event.button == 3: guicomponents.display_tracks_popup_menu(data.event, data.track, _track_menu_item_activated)
def cut_pressed(): if not timeline_visible(): updater.display_sequence_in_monitor() if EDIT_MODE() == editorstate.ONE_ROLL_TRIM: editevent.oneroll_trim_no_edit_init() return if EDIT_MODE() == editorstate.TWO_ROLL_TRIM: editevent.tworoll_trim_no_edit_init() return tline_frame = PLAYER().current_frame() movemodes.clear_selected_clips() # Iterate tracks and do cut on all active that have non-blanck # clips and frame is not on previous edits for i in range(1, len(current_sequence().tracks)): track = get_track(i) if track.active == False: continue if editevent.track_lock_check_and_user_info(track, cut_pressed, "cut"): # so the other tracks get cut... continue # Get index and clip index = track.get_clip_index_at(int(tline_frame)) try: clip = track.clips[index] # don't cut blanck clip if clip.is_blanck_clip: continue except Exception: continue # Frame after last clip in track # Get cut frame in clip frames clip_start_in_tline = track.clip_start(index) clip_frame = tline_frame - clip_start_in_tline + clip.clip_in # Dont edit if frame on cut. if clip_frame == clip.clip_in: continue # Do edit data = {"track":track, "index":index, "clip":clip, "clip_cut_frame":clip_frame} action = edit.cut_action(data) action.do_edit() updater.repaint_tline()
def track_active_switch_pressed(data): track = get_track(data.track) # data.track is index, not object # Flip active state if data.event.button == 1: track.active = (track.active == False) if current_sequence().all_tracks_off() == True: track.active = True gui.tline_column.widget.queue_draw() elif data.event.button == 3: guicomponents.display_tracks_popup_menu(data.event, data.track, \ _track_menu_item_activated)
def splice_out_button_pressed(): """ Removes 1 - n long continuous clip range from track and closes the created gap. """ if movemodes.selected_track == -1: return # Edit consumes selection, so clear selected from clips movemodes.set_range_selection(movemodes.selected_track, movemodes.selected_range_in, movemodes.selected_range_out, False) track = get_track(movemodes.selected_track) if editevent.track_lock_check_and_user_info(track, splice_out_button_pressed, "splice out"): movemodes.clear_selection_values() return # A single clip delete can trigger a special clip cover delete # See if such delete should be attempted. # Exit if done succesfully, do normal splice out and report if failed cover_delete_failed = False if editorpersistance.prefs.trans_cover_delete == True: if movemodes.selected_range_out == movemodes.selected_range_in: clip = track.clips[movemodes.selected_range_in] if hasattr(clip, "rendered_type") and ( track.id >= current_sequence().first_video_index): cover_delete_success = _attempt_clip_cover_delete( clip, track, movemodes.selected_range_in) if cover_delete_success: return # A successful cover delete happened else: cover_delete_failed = True # A successful cover delete failed, do normal delete and gove info # Do delete data = { "track": track, "from_index": movemodes.selected_range_in, "to_index": movemodes.selected_range_out } edit_action = edit.remove_multiple_action(data) edit_action.do_edit() _splice_out_done_update() if cover_delete_failed == True: dialogutils.info_message( _("Fade/Transition cover delete failed!"), _("There wasn't enough material available in adjacent clips.\nA normal Splice Out was done instead." ), gui.editor_window.window)
def resync_selected(): if movemodes.selected_track == -1: return track = get_track(movemodes.selected_track) clip_list = [] for index in range(movemodes.selected_range_in, movemodes.selected_range_out + 1): clip_list.append((track.clips[index], track)) # Selection not valid after resync action movemodes.clear_selected_clips() # Chack if synced clips have same or consecutive parent clips all_same_or_consecutive = True master_id = -1 current_master_clip = -1 current_master_index = -1 master_track = current_sequence().first_video_track() for t in clip_list: clip, track = t try: if master_id == -1: master_id = clip.sync_data.master_clip.id current_master_clip = clip.sync_data.master_clip current_master_index = master_track.clips.index( current_master_clip) else: if clip.sync_data.master_clip.id != master_id: next_master_index = master_track.clips.index( clip.sync_data.master_clip) if current_master_index + 1 == next_master_index: # Masters are consecutive, save data to test next master_id = clip.sync_data.master_clip.id current_master_index = master_track.clips.index( current_master_clip) else: all_same_or_consecutive = False except: all_same_or_consecutive = False # If clips are all for same or consecutive sync parent clips, sync them as a unit. if len(clip_list) > 1 and all_same_or_consecutive == True: data = {"clips": clip_list} action = edit.resync_clips_sequence_action(data) action.do_edit() else: # Single or non-consecutive clips are synched separately data = {"clips": clip_list} action = edit.resync_some_clips_action(data) action.do_edit() updater.repaint_tline()
def clear_filters(): if movemodes.selected_track == -1: return track = get_track(movemodes.selected_track) clips = [] for i in range(movemodes.selected_range_in, movemodes.selected_range_out + 1): clips.append(track.clips[i]) data = {"clips":clips} action = edit.remove_multiple_filters_action(data) action.do_edit() movemodes.clear_selected_clips() updater.repaint_tline()
def resync_selected(): if movemodes.selected_track == -1: return track = get_track(movemodes.selected_track) clip_list = [] for index in range(movemodes.selected_range_in, movemodes.selected_range_out + 1): clip_list.append((track.clips[index], track)) # Selection not valid after resync action movemodes.clear_selected_clips() # Chack if synced clips have same or consecutive parent clips all_same_or_consecutive = True master_id = -1 current_master_clip = -1 current_master_index = -1 master_track = current_sequence().first_video_track() for t in clip_list: clip, track = t try: if master_id == -1: master_id = clip.sync_data.master_clip.id current_master_clip = clip.sync_data.master_clip current_master_index = master_track.clips.index(current_master_clip) else: if clip.sync_data.master_clip.id != master_id: next_master_index = master_track.clips.index(clip.sync_data.master_clip) if current_master_index + 1 == next_master_index: # Masters are consecutive, save data to test next master_id = clip.sync_data.master_clip.id current_master_index = master_track.clips.index(current_master_clip) else: all_same_or_consecutive = False except: all_same_or_consecutive = False # If clips are all for same or consecutive sync parent clips, sync them as a unit. if len(clip_list) > 1 and all_same_or_consecutive == True: data = {"clips":clip_list} action = edit.resync_clips_sequence_action(data) action.do_edit() else: # Single or non-consecutive clips are synched separately data = {"clips":clip_list} action = edit.resync_some_clips_action(data) action.do_edit() updater.repaint_tline()
def three_point_overwrite_pressed(): # Check that state is good for edit if movemodes.selected_track == -1: primary_txt = _("No Clips are selected!") secondary_txt = _("You need to select clips to overwrite to perform this edit.") dialogutils.info_message(primary_txt, secondary_txt, gui.editor_window.window) return # Get data track = get_track(movemodes.selected_track) if editevent.track_lock_check_and_user_info(track, three_point_overwrite_pressed, "3 point overwrite"): return range_start_frame = track.clip_start(movemodes.selected_range_in) out_clip = track.clips[movemodes.selected_range_out] out_start = track.clip_start(movemodes.selected_range_out) range_end_frame = out_start + out_clip.clip_out - out_clip.clip_in range_length = range_end_frame - range_start_frame + 1 # calculated end is incl. over_clip = _get_new_clip_from_clip_monitor() if over_clip == None: no_monitor_clip_info(gui.editor_window.window) return over_length = over_clip.mark_out - over_clip.mark_in + 1 # + 1 out incl ?????????? what if over_clip.mark_out == -1 ?????????? if over_length < range_length: monitor_clip_too_short(gui.editor_window.window) return over_clip_out = over_clip.mark_in + range_length - 1 # -1 out incl range_in = movemodes.selected_range_in range_out = movemodes.selected_range_out movemodes.clear_selected_clips() # edit consumes selection updater.save_monitor_frame = False # hack to not get wrong value saved in MediaFile.current_frame data = {"track":track, "clip":over_clip, "clip_in":over_clip.mark_in, "clip_out":over_clip_out, "in_index":range_in, "out_index":range_out} action = edit.three_point_overwrite_action(data) action.do_edit() updater.display_tline_cut_frame(track, range_in)
def splice_out_button_pressed(): """ Removes 1 - n long continuous clip range from track and closes the created gap. """ if movemodes.selected_track == -1: return # Edit consumes selection, so clear selected from clips movemodes.set_range_selection(movemodes.selected_track, movemodes.selected_range_in, movemodes.selected_range_out, False) track = get_track(movemodes.selected_track) if editevent.track_lock_check_and_user_info(track, splice_out_button_pressed, "splice out"): movemodes.clear_selection_values() return # A single clip delete can trigger a special clip cover delete # See if such delete should be attempted. # Exit if done succesfully, do normal splice out and report if failed cover_delete_failed = False if editorpersistance.prefs.trans_cover_delete == True: if movemodes.selected_range_out == movemodes.selected_range_in: clip = track.clips[movemodes.selected_range_in] if hasattr(clip, "rendered_type") and (track.id >= current_sequence().first_video_index): cover_delete_success = _attempt_clip_cover_delete(clip, track, movemodes.selected_range_in) if cover_delete_success: return # A successful cover delete happened else: cover_delete_failed = True # A successful cover delete failed, do normal delete and gove info # Do delete data = {"track":track, "from_index":movemodes.selected_range_in, "to_index":movemodes.selected_range_out} edit_action = edit.remove_multiple_action(data) edit_action.do_edit() _splice_out_done_update() if cover_delete_failed == True: dialogutils.info_message(_("Fade/Transition cover delete failed!"), _("There wasn't enough material available in adjacent clips.\nA normal Splice Out was done instead."), gui.editor_window.window)
def set_track_normal_height(track_index): track = get_track(track_index) track.height = appconsts.TRACK_HEIGHT_NORMAL # Check that new height tracks can be displayed and cancel if not. new_h = current_sequence().get_tracks_height() x, y, w, h = gui.tline_canvas.widget.allocation if new_h > h: track.height = appconsts.TRACK_HEIGHT_SMALL dialogutils.warning_message( _("Not enough vertical space on Timeline to expand track"), _("Maximize or resize application window to get more\nspace for tracks if possible." ), gui.editor_window.window, True) return tlinewidgets.set_ref_line_y(gui.tline_canvas.widget.allocation) gui.tline_column.init_listeners() updater.repaint_tline()
def set_track_normal_height(track_index): track = get_track(track_index) track.height = appconsts.TRACK_HEIGHT_NORMAL # Check that new height tracks can be displayed and cancel if not. new_h = current_sequence().get_tracks_height() x, y, w, h = gui.tline_canvas.widget.allocation if new_h > h: track.height = appconsts.TRACK_HEIGHT_SMALL dialogutils.warning_message( _("Not enough vertical space on Timeline to expand track"), _("Maximize or resize application window to get more\nspace for tracks if possible."), gui.editor_window.window, True, ) return tlinewidgets.set_ref_line_y(gui.tline_canvas.widget.allocation) gui.tline_column.init_listeners() updater.repaint_tline()
def track_double_click(track_id): track = get_track(track_id) # data.track is index, not object if track.height == appconsts.TRACK_HEIGHT_NORMAL: set_track_small_height(track_id) else: set_track_normal_height(track_id)
def lock_track(track_index): track = get_track(track_index) track.edit_freedom = appconsts.LOCKED updater.repaint_tline()
def unlock_track(track_index): track = get_track(track_index) track.edit_freedom = appconsts.FREE updater.repaint_tline()
def set_track_small_height(track_index): track = get_track(track_index) track.height = appconsts.TRACK_HEIGHT_SMALL if editorstate.SCREEN_HEIGHT < 863: track.height = appconsts.TRACK_HEIGHT_SMALLEST