def mouse_release(x, y, frame): global box_selection_data, edit_data if edit_data == None: return if box_selection_data == None: # mouse action to select box_selection_data = BoxMoveData(edit_data["press_point"], (x, y)) if box_selection_data.is_empty() == False: edit_data = {"action_on":True, "press_frame":frame, "delta":0, "box_selection_data":box_selection_data} else: box_selection_data = None edit_data = {"action_on":False, "press_frame":-1, "delta":0, "box_selection_data":box_selection_data} else: # mouse action to move delta = frame - edit_data["press_frame"] edit_data["delta"] = delta # Do edit data = {"box_selection_data":box_selection_data, "delta":delta} action = edit.box_overwrite_move_action(data) action.do_edit() # Back to start state edit_data = None box_selection_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def init_tool_for_clip(clip, track): clip_index = track.clips.index(clip) # Save data needed to do the keyframe edits. global edit_data #, pressed_on_selected, drag_disabled edit_data = { "draw_function": _tline_overlay, "clip_index": clip_index, "clip_start_in_timeline": track.clip_start(clip_index), "clip": clip, "track": track, "initializing": True } # Init for volume editing if volume filter available for i in range(0, len(clip.filters)): filter_object = clip.filters[i] if filter_object.info.mlt_service_id == "volume": editable_properties = propertyedit.get_filter_editable_properties( clip, filter_object, i, track, clip_index) for ep in editable_properties: # Volume is one of these MLT multipart filters, so we chose this way to find the editable property in filter. try: if ep.args["exptype"] == "multipart_keyframe": edit_data["editable_property"] = ep global _kf_editor _kf_editor = TLineKeyFrameEditor(ep, True) except: pass tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def mouse_press(event, frame): x = event.x y = event.y # If we have clip being edited and its edit area is hit, we do not need to init data. if _clip_is_being_edited() and _clip_edit_area_hit(x, y): return # Get pressed track track = tlinewidgets.get_track(y) # Selecting empty clears selection if track == None: #clear_selected_clips() #pressed_on_selected = False _set_no_clip_edit_data() updater.repaint_tline() return # Get pressed clip index clip_index = current_sequence().get_clip_index(track, frame) # Selecting empty clears selection if clip_index == -1: #clear_selected_clips() #pressed_on_selected = False _set_no_clip_edit_data() updater.repaint_tline() return clip = track.clips[clip_index] # Save data needed to do the keyframe edits. global edit_data #, pressed_on_selected, drag_disabled edit_data = {"draw_function":_tline_overlay, "clip_index":clip_index, "clip":clip, "track":track, "mouse_start_x":x, "mouse_start_y":y} # Init for volume editing if volume filter available for i in range(0, len(clip.filters)): filter_object = clip.filters[i] if filter_object.info.mlt_service_id == "volume": editable_properties = propertyedit.get_filter_editable_properties( clip, filter_object, i, track, clip_index) for ep in editable_properties: if ep.name == "gain": _init_for_editable_property(ep) tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def _exit_to_overwrite(): # If we entered box mode from overwite mode empty click, this is used to enter back into overwrite mode. global entered_from_overwrite entered_from_overwrite = False editorstate.overwrite_mode_box = False tlinewidgets.set_edit_mode_data(None) gui.editor_window.set_cursor_to_mode() # This gets set wrong in editevent.tline_canvas_mouse_released() and were putting it back here, # this could be investigated for better solution, this could cause a cursor flash, but on dev system we're not getting it. updater.repaint_tline()
def _set_no_clip_edit_data(): # set edit data to reflect that no clip is being edited currently. global edit_data edit_data = {"draw_function":_tline_overlay, "clip_index":-1, "track":None, "mouse_start_x":-1, "mouse_start_y":-1} tlinewidgets.set_edit_mode_data(edit_data)
def init_tool_for_clip(clip, track, edit_type=VOLUME_KF_EDIT): clip_index = track.clips.index(clip) # Save data needed to do the keyframe edits. global edit_data #, pressed_on_selected, drag_disabled edit_data = {"draw_function":_tline_overlay, "clip_index":clip_index, "clip_start_in_timeline":track.clip_start(clip_index), "clip":clip, "track":track, "initializing":True} # Always brightness keyframes for media types that contain no audio. if edit_data["clip"].media_type != appconsts.VIDEO and edit_data["clip"].media_type != appconsts.AUDIO: edit_type = BRIGHTNESS_KF_EDIT # Volume keyframes on audio track for video and audio if track.type == appconsts.AUDIO and not(edit_data["clip"].media_type != appconsts.VIDEO and edit_data["clip"].media_type != appconsts.AUDIO): edit_type = VOLUME_KF_EDIT # Init for edit type if edit_type == VOLUME_KF_EDIT: ep = _get_volume_editable_property(clip, track, clip_index) if ep == None: filter_info = mltfilters.get_volume_filters_info() data = {"clip":clip, "filter_info":filter_info, "filter_edit_done_func":_filter_create_dummy_func} action = edit.add_multipart_filter_action(data) action.do_edit() ep = _get_volume_editable_property(clip, track, clip_index) edit_data["editable_property"] = ep global _kf_editor _kf_editor = TLineKeyFrameEditor(ep, True, VOLUME_KF_EDIT) elif edit_type == BRIGHTNESS_KF_EDIT: ep = _get_brightness_editable_property(clip, track, clip_index) if ep == None: filter_info = mltfilters.get_brightness_filter_info() data = {"clip":clip, "filter_info":filter_info, "filter_edit_done_func":_filter_create_dummy_func} action = edit.add_filter_action(data) action.do_edit() ep = _get_brightness_editable_property(clip, track, clip_index) edit_data["editable_property"] = ep global _kf_editor _kf_editor = TLineKeyFrameEditor(ep, True, BRIGHTNESS_KF_EDIT) tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def set_no_clip_edit_data(): # set edit data to reflect that no clip is being edited currently. global edit_data, _kf_editor edit_data = {"draw_function":_tline_overlay, "clip_index":-1, "track":None, "mouse_start_x":-1, "mouse_start_y":-1} _kf_editor = None tlinewidgets.set_edit_mode_data(edit_data)
def mouse_press(event, frame): x = event.x y = event.y global edit_data, mouse_disabled # Clear edit data in gui module edit_data = None mouse_disabled = False tlinewidgets.set_edit_mode_data(edit_data) # Get pressed track track = tlinewidgets.get_track(y) if track == None: mouse_disabled = True return if dialogutils.track_lock_check_and_user_info(track): mouse_disabled = True return # Get pressed clip index clip_index = current_sequence().get_clip_index(track, frame) # Selecting empty or blank clip does not define edit if clip_index == -1: mouse_disabled = True return pressed_clip = track.clips[clip_index] if pressed_clip.is_blanck_clip: mouse_disabled = True return if (event.get_state() & Gdk.ModifierType.CONTROL_MASK): move_all = False else: move_all = True first_moved_frame = track.clip_start(clip_index) multi_data = MultimoveData(track, first_moved_frame, move_all) edit_data = { "track_id": track.id, "press_frame": frame, "current_frame": frame, "first_moved_frame": first_moved_frame, "mouse_start_x": x, "mouse_start_y": y, "multi_data": multi_data } tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def mouse_move(x, y, frame): global edit_data if edit_data == None: return if box_selection_data == None: # mouse action is to select edit_data["mouse_point"] = (x, y) else: # mouse action is to move delta = frame - edit_data["press_frame"] edit_data["delta"] = delta tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def mouse_press(event, frame): x = event.x y = event.y global edit_data, mouse_disabled # Clear edit data in gui module edit_data = None mouse_disabled = False tlinewidgets.set_edit_mode_data(edit_data) # Get pressed track track = tlinewidgets.get_track(y) if track == None: mouse_disabled = True return if dialogutils.track_lock_check_and_user_info(track): mouse_disabled = True return # Get pressed clip index clip_index = current_sequence().get_clip_index(track, frame) # Selecting empty or blank clip does not define edit if clip_index == -1: mouse_disabled = True return pressed_clip = track.clips[clip_index] if pressed_clip.is_blanck_clip: mouse_disabled = True return if (event.get_state() & Gdk.ModifierType.CONTROL_MASK): move_all = False else: move_all = True first_moved_frame = track.clip_start(clip_index) multi_data = MultimoveData(track, first_moved_frame, move_all) edit_data = {"track_id":track.id, "press_frame":frame, "current_frame":frame, "first_moved_frame":first_moved_frame, "mouse_start_x":x, "mouse_start_y":y, "multi_data":multi_data} tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def init_tool_for_clip(clip, track, edit_type=VOLUME_KF_EDIT): clip_index = track.clips.index(clip) # Save data needed to do the keyframe edits. global edit_data #, pressed_on_selected, drag_disabled edit_data = {"draw_function":_tline_overlay, "clip_index":clip_index, "clip_start_in_timeline":track.clip_start(clip_index), "clip":clip, "track":track, "initializing":True} # Always brightness keyframes for media types that contain no audio. if not(edit_data["clip"].media_type == appconsts.VIDEO or edit_data["clip"].media_type != appconsts.AUDIO): edit_type = BRIGHTNESS_KF_EDIT # Init for edit type if edit_type == VOLUME_KF_EDIT: ep = _get_volume_editable_property(clip, track, clip_index) if ep == None: filter_info = mltfilters.get_volume_filters_info() data = {"clip":clip, "filter_info":filter_info, "filter_edit_done_func":_filter_create_dummy_func} action = edit.add_multipart_filter_action(data) action.do_edit() ep = _get_volume_editable_property(clip, track, clip_index) edit_data["editable_property"] = ep global _kf_editor _kf_editor = TLineKeyFrameEditor(ep, True, VOLUME_KF_EDIT) elif edit_type == BRIGHTNESS_KF_EDIT: ep = _get_brightness_editable_property(clip, track, clip_index) if ep == None: filter_info = mltfilters.get_brightness_filter_info() data = {"clip":clip, "filter_info":filter_info, "filter_edit_done_func":_filter_create_dummy_func} action = edit.add_filter_action(data) action.do_edit() ep = _get_brightness_editable_property(clip, track, clip_index) edit_data["editable_property"] = ep global _kf_editor _kf_editor = TLineKeyFrameEditor(ep, True, BRIGHTNESS_KF_EDIT) tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def clips_drag_out_started(event): # Abort move edit global edit_data, drag_disabled edit_data = None drag_disabled = True tlinewidgets.set_edit_mode_data(None) # Set dnd track = current_sequence().tracks[selected_track] clips = [] for i in range(selected_range_in, selected_range_out + 1): clips.append(track.clips[i]) dnd.start_tline_clips_out_drag(event, clips, gui.tline_canvas.widget) # Update tlione gui updater.repaint_tline()
def mouse_press(event, frame): print "gggg" x = event.x y = event.y # If we have clip being edited and its edit area is hit, we do not need to init data. if _clip_is_being_edited() and _clip_edit_area_hit(x, y): print "ooooooooooooooooooo" return # Get pressed track track = tlinewidgets.get_track(y) # Selecting empty clears selection if track == None: #clear_selected_clips() #pressed_on_selected = False _set_no_clip_edit_data() updater.repaint_tline() return # Get pressed clip index clip_index = current_sequence().get_clip_index(track, frame) # Selecting empty clears selection if clip_index == -1: #clear_selected_clips() #pressed_on_selected = False _set_no_clip_edit_data() updater.repaint_tline() return print "kkkkkk" global edit_data #, pressed_on_selected, drag_disabled edit_data = { "draw_function": _tline_overlay, "clip_index": clip_index, "track": track, "mouse_start_x": x, "mouse_start_y": y } tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def mouse_press(event, frame): x = event.x y = event.y global edit_data #, pressed_on_selected, drag_disabled # Clear edit data in gui module edit_data = None tlinewidgets.set_edit_mode_data(edit_data) # Get pressed track track = tlinewidgets.get_track(y) # Selecting empty clears selection if track == None: #clear_selected_clips() #pressed_on_selected = False updater.repaint_tline() return # Get pressed clip index clip_index = current_sequence().get_clip_index(track, frame) # Selecting empty clears selection if clip_index == -1: #clear_selected_clips() #pressed_on_selected = False updater.repaint_tline() return edit_data = { "draw_function": _tline_overlay, "clip_index": track.id, "track": track, "mouse_start_x": x, "mouse_start_y": y } tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def mouse_release(x, y, frame, state): if mouse_disabled: return global edit_data press_frame = edit_data["press_frame"] min_allowed_delta = -edit_data["multi_data"].max_backwards delta = frame - press_frame if delta < min_allowed_delta: delta = min_allowed_delta if delta != 0: data = {"edit_delta": delta, "multi_data": edit_data["multi_data"]} action = edit.multi_move_action(data) action.do_edit() edit_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def mouse_release(x, y, frame, state): if mouse_disabled: return global edit_data press_frame = edit_data["press_frame"] min_allowed_delta = - edit_data["multi_data"].max_backwards delta = frame - press_frame if delta < min_allowed_delta: delta = min_allowed_delta if delta != 0: data = {"edit_delta":delta, "multi_data":edit_data["multi_data"]} action = edit.multi_move_action(data) action.do_edit() edit_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def _clear_after_illegal_edit(): global edit_data edit_data = None # kill current edit tlinewidgets.set_edit_mode_data(None) clear_selected_clips() updater.repaint_tline()
def _move_mode_pressed(event, frame): """ User presses mouse when in a move mode. Initializes move mode edit action based on user action and state. """ x = event.x y = event.y global edit_data, pressed_on_selected, drag_disabled # Clear edit data in gui module edit_data = None drag_disabled = False tlinewidgets.set_edit_mode_data(edit_data) # Get pressed track track = tlinewidgets.get_track(y) # Selecting empty clears selection if track == None: clear_selected_clips() pressed_on_selected = False updater.repaint_tline() return # Get pressed clip index clip_index = current_sequence().get_clip_index(track, frame) # Selecting empty clears selection if clip_index == -1: clear_selected_clips() pressed_on_selected = False updater.repaint_tline() return # Check locking for pressed track if _track_is_locked(track): clear_selected_clips() pressed_on_selected = False updater.repaint_tline() return pressed_clip = track.clips[clip_index] # Handle pressed clip according to current selection state # Case: no selected clips, select single clip if selected_track == -1: if not pressed_clip.is_blanck_clip: select_clip(track.id, clip_index) pressed_on_selected = False else: # There may be multiple blank clips in area that for user # seems to a single blank area. All of these must be # selected together automatically or user will be exposed to # this impl. detail unnecesserarely. range_in, range_out = _get_blanck_range(track, clip_index) _select_multiple_clips(track.id, range_in, range_out) pressed_on_selected = False drag_disabled = True # case: CTRL or SHIFT down, combine selection with earlier selected clips elif ((event.state & gtk.gdk.CONTROL_MASK) or (event.state & gtk.gdk.SHIFT_MASK)): # CTRL pressing blank clears selection if pressed_clip.is_blanck_clip: clear_selected_clips() pressed_on_selected = False updater.repaint_tline() return # clip before range, make it start if clip_index < selected_range_in: _select_multiple_clips(track.id, clip_index, selected_range_out) pressed_on_selected = False # clip after range, make it end elif clip_index > selected_range_out: _select_multiple_clips(track.id, selected_range_in, clip_index) pressed_on_selected = False else: # Pressing on selected clip clears selection on release pressed_on_selected = True # case: new single clip pressed else: if selected_track != track.id: clear_selected_clips() select_clip(track.id, clip_index) pressed_on_selected = False else: if not pressed_clip.is_blanck_clip: # Pressing on selected clip keeps selection unchanged if clip_index < selected_range_in or clip_index > selected_range_out: select_clip(track.id, clip_index) pressed_on_selected = False # Pressing on non-selected clip clears current selection and selects newly selected clip else: pressed_on_selected = True else: # Black clip, see comment above range_in, range_out = _get_blanck_range(track, clip_index) _select_multiple_clips(track.id, range_in, range_out) pressed_on_selected = False drag_disabled = True # Get length info on selected clips clip_lengths = [] for i in range(selected_range_in, selected_range_out + 1): clip = track.clips[i] clip_lengths.append(clip.clip_out - clip.clip_in + 1) # Overwrite mode ignores this insert_frame = track.clip_start(selected_range_in) # Set edit mode data. This is not used unless mouse delta big enough # to initiate move. edit_data = {"track_id":track.id, "track_object":track, "to_track_object":track, "move_on":False, "press_frame":frame, "current_frame":frame, "first_clip_start":insert_frame, "insert_frame":insert_frame, "clip_lengths":clip_lengths, "mouse_start_x":x, "mouse_start_y":y, "selected_range_in":selected_range_in, # clip index "selected_range_out":selected_range_out} # clip index tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def overwrite_move_release(x, y, frame, state): """ User releases mouse when in overwrite move mode. """ global edit_data, drag_disabled if drag_disabled: drag_disabled = False return if edit_data == None: return press_frame = edit_data["press_frame"] first_clip_start = edit_data["first_clip_start"] track = edit_data["track_object"] to_track = edit_data["to_track_object"] over_in = first_clip_start + (frame - press_frame) over_out = over_in + edit_data["moving_length"] # Check locking of target track. Source track checked at press event. if _track_is_locked(to_track): edit_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline() return # Moved lips are completely out of displayable track area, can't do edit. if over_out < 1: return # Autocorrect moved clips to be fully on displayable track area if over_in < 0: over_out += abs(over_in) over_in = 0 # Collect data for edit action data = {"track":track, "over_in":over_in, "over_out":over_out, "selected_range_in":selected_range_in, "selected_range_out":selected_range_out, "move_edit_done_func":move_edit_done} # Do edit. Use different actions depending on if # clip is moved to a differrent track if track == to_track: # Do edit if were moving and clips have moved if (edit_data["move_on"] == True and (press_frame != frame)): clear_selected_clips() action = edit.overwrite_move_action(data) action.do_edit() PLAYER().seek_frame(over_in, False) else: _move_mode_released() else: # Moved to different track data["to_track"] = to_track clear_selected_clips() action = edit.multitrack_overwrite_move_action(data) action.do_edit() PLAYER().seek_frame(over_in, False) # Clear edit mode data edit_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def insert_move_release(x, y, frame, state): """ User releases mouse when in insert move mode. """ global edit_data, drag_disabled if drag_disabled: drag_disabled = False return # If mouse was not pressed on clip we cant move anyhing if edit_data == None: return # Get attempt insert frame press_frame = edit_data["press_frame"] first_clip_start = edit_data["first_clip_start"] attempt_insert_frame = first_clip_start + (frame - press_frame) # Get tracks and insert index track = edit_data["track_object"] to_track = edit_data["to_track_object"] insert_index = to_track.get_clip_index_at(attempt_insert_frame) # Check locking of target track. Source track checked at press event. if _track_is_locked(to_track): edit_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline() return # Update data for editmode overlay edit_data["current_frame"] = frame edit_data["insert_frame"] = track.clip_start(insert_index) # Collect selection data range_in = edit_data["selected_range_in"] range_out = edit_data["selected_range_out"] data = {"track":track, "insert_index":insert_index, "selected_range_in":range_in, "selected_range_out":range_out, "move_edit_done_func":move_edit_done} # Do edit. Use different actions depending on if # clip is moved to a differrent track if track == to_track: # Do edit if were moving and insert is not into same index # Update selection after edit if (edit_data["move_on"] == True and (insert_index < selected_range_in or insert_index > selected_range_out)): # Remeber selected range to later find index of dropped range # after edit old_range_length = selected_range_out - selected_range_in clear_selected_clips() action = edit.insert_move_action(data) action.do_edit() # Move playback to first frame of dropped range select_index = insert_index if (range_in < insert_index):#when moving forward clips are removed affecting later indexes select_index = insert_index - (old_range_length + 1) PLAYER().seek_frame(track.clip_start(select_index), False) else: _move_mode_released() else: # insert to different track data["to_track"] = to_track clear_selected_clips() action = edit.multitrack_insert_move_action(data) action.do_edit() PLAYER().seek_frame(to_track.clip_start(insert_index), False) # Clear edit mode data edit_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def mouse_release(x, y, frame): global box_selection_data, edit_data, entered_from_overwrite if edit_data == None: if entered_from_overwrite == True: _exit_to_overwrite() return if box_selection_data == None: # mouse action is to select box_selection_data = BoxMoveData(edit_data["press_point"], (x, y)) locked_track = box_selection_data.get_possible_locked_track() if locked_track != None: dialogutils.track_lock_check_and_user_info(locked_track) edit_data = None box_selection_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline() # Exit box mode if entered from overwrite if entered_from_overwrite == True: _exit_to_overwrite() return if box_selection_data.is_empty() == False: edit_data = {"action_on":True, "press_frame":frame, "delta":0, "box_selection_data":box_selection_data} else: box_selection_data = None edit_data = {"action_on":False, "press_frame":-1, "delta":0, "box_selection_data":box_selection_data} # Exit box mode if entered from overwrite with empty selection if entered_from_overwrite == True: _exit_to_overwrite() return else: # mouse action is to move # Exit if selection contains locked track locked_track = box_selection_data.get_possible_locked_track() if locked_track != None: dialogutils.track_lock_check_and_user_info(locked_track) edit_data = None box_selection_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline() # Exit box mode if entered from overwrite if entered_from_overwrite == True: _exit_to_overwrite() return # If we lock track after delta = frame - edit_data["press_frame"] edit_data["delta"] = delta # Do edit data = {"box_selection_data":box_selection_data, "delta":delta} action = edit.box_overwrite_move_action(data) action.do_edit() # Back to start state edit_data = None box_selection_data = None # Exit box mode if entered from overwrite with empty selection if entered_from_overwrite == True: _exit_to_overwrite() return tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def _move_mode_pressed(event, frame): """ User presses mouse when in a move mode. Initializes move mode edit action based on user action and state. """ x = event.x y = event.y global edit_data, pressed_on_selected, drag_disabled # Clear edit data in gui module edit_data = None drag_disabled = False tlinewidgets.set_edit_mode_data(edit_data) # Get pressed track track = tlinewidgets.get_track(y) # Selecting empty clears selection and prevents from setting edit data since we cannot have it. # Exitance of edit_data is also used to determine if we should enter box mode so we need to not have it if we're not hitting clip if track == None or track.id < 1 or track.id > len(current_sequence().tracks) - 2: # -2 because topmost hidden track clear_selected_clips() pressed_on_selected = False updater.repaint_tline() return # Get pressed clip index clip_index = current_sequence().get_clip_index(track, frame) # Selecting empty clears selection if clip_index == -1: clear_selected_clips() pressed_on_selected = False updater.repaint_tline() return # Check locking for pressed track if _track_is_locked(track): clear_selected_clips() pressed_on_selected = False updater.repaint_tline() return pressed_clip = track.clips[clip_index] # Handle pressed clip according to current selection state # Case: no selected clips, select single clip if selected_track == -1: if not pressed_clip.is_blanck_clip: select_clip(track.id, clip_index) pressed_on_selected = False else: # There may be multiple blank clips in area that for user # seems to a single blank area. All of these must be # selected together automatically or user will be exposed to # this impl. detail unnecesserarely. # THIS HAS BEEN CHANGED BECAUSE BLANKS ARE NOW AUTO CONSOLIDATED AFTER ALL EDITS. range_in, range_out = _get_blanck_range(track, clip_index) _select_multiple_clips(track.id, range_in, range_out) pressed_on_selected = False drag_disabled = True # case: CTRL or SHIFT down, combine selection with earlier selected clips elif ((event.get_state() & Gdk.ModifierType.CONTROL_MASK) or (event.get_state() & Gdk.ModifierType.SHIFT_MASK)): # CTRL pressing blank clears selection if pressed_clip.is_blanck_clip: clear_selected_clips() pressed_on_selected = False updater.repaint_tline() return # clip before range, make it start if clip_index < selected_range_in: _select_multiple_clips(track.id, clip_index, selected_range_out) pressed_on_selected = False # clip after range, make it end elif clip_index > selected_range_out: _select_multiple_clips(track.id, selected_range_in, clip_index) pressed_on_selected = False else: # Pressing on selected clip clears selection on release pressed_on_selected = True # case: new single clip pressed else: if selected_track != track.id: clear_selected_clips() select_clip(track.id, clip_index) pressed_on_selected = False else: if not pressed_clip.is_blanck_clip: # Pressing on selected clip keeps selection unchanged if clip_index < selected_range_in or clip_index > selected_range_out: select_clip(track.id, clip_index) pressed_on_selected = False # Pressing on non-selected clip clears current selection and selects newly selected clip else: pressed_on_selected = True else: # Black clip, see comment above range_in, range_out = _get_blanck_range(track, clip_index) _select_multiple_clips(track.id, range_in, range_out) pressed_on_selected = False drag_disabled = True # Get length info on selected clips clip_lengths = [] for i in range(selected_range_in, selected_range_out + 1): clip = track.clips[i] clip_lengths.append(clip.clip_out - clip.clip_in + 1) # Overwrite mode ignores this insert_frame = track.clip_start(selected_range_in) # Set edit mode data. This is not used unless mouse delta big enough # to initiate move. edit_data = {"track_id":track.id, "track_object":track, "to_track_object":track, "move_on":False, "press_frame":frame, # on timeline at mouse press "current_frame":frame, "first_clip_start":insert_frame, # on timeline at mouse press "insert_frame":insert_frame, "clip_lengths":clip_lengths, "mouse_start_x":x, "mouse_start_y":y, "selected_range_in":selected_range_in, # clip index "selected_range_out":selected_range_out} # clip index tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()
def overwrite_move_release(x, y, frame, state): """ User releases mouse when in overwrite move mode. """ global edit_data, drag_disabled if editorstate.overwrite_mode_box == True: boxmove.mouse_release(x, y, frame) edit_data = None return if drag_disabled: drag_disabled = False edit_data = None return if edit_data == None: return press_frame = edit_data["press_frame"] first_clip_start = edit_data["first_clip_start"] track = edit_data["track_object"] to_track = edit_data["to_track_object"] over_in = first_clip_start + (frame - press_frame) over_out = over_in + edit_data["moving_length"] # Check locking of target track. Source track checked at press event. if _track_is_locked(to_track): edit_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline() return # Moved clips are completely out of displayable track area, can't do edit. if over_out < 1: edit_data = None return # Autocorrect moved clips to be fully on displayable track area if over_in < 0: over_out += abs(over_in) over_in = 0 # Collect data for edit action data = {"track":track, "over_in":over_in, "over_out":over_out, "selected_range_in":selected_range_in, "selected_range_out":selected_range_out, "move_edit_done_func":move_edit_done} # Do edit. Use different actions depending on if # clip is moved to a differrent track if track == to_track: # Do edit if were moving and clips have moved if (edit_data["move_on"] == True and (press_frame != frame)): clear_selected_clips() action = edit.overwrite_move_action(data) action.do_edit() PLAYER().seek_frame(over_in, False) else: _move_mode_released() else: # Moved to different track data["to_track"] = to_track clear_selected_clips() action = edit.multitrack_overwrite_move_action(data) action.do_edit() PLAYER().seek_frame(over_in, False) # Clear edit mode data edit_data = None tlinewidgets.set_edit_mode_data(edit_data) updater.repaint_tline()