34 from uuid
import uuid4
35 from copy
import deepcopy
38 from PyQt5.QtGui import QIcon, QCursor, QKeySequence
42 from windows.views.timeline_webview
import TimelineWebView
43 from classes
import info, ui_util, settings, qt_types, updates
44 from classes.app
import get_app
45 from classes.logger
import log
46 from classes.timeline
import TimelineSync
47 from classes.query
import File, Clip, Transition, Marker, Track
50 from images
import openshot_rc
51 from windows.views.files_treeview
import FilesTreeView
52 from windows.views.files_listview
import FilesListView
53 from windows.views.transitions_treeview
import TransitionsTreeView
54 from windows.views.transitions_listview
import TransitionsListView
55 from windows.views.effects_treeview
import EffectsTreeView
56 from windows.views.effects_listview
import EffectsListView
57 from windows.views.properties_tableview
import PropertiesTableView, SelectionLabel
58 from windows.views.tutorial
import TutorialManager
59 from windows.video_widget
import VideoWidget
60 from windows.preview_thread
import PreviewParent
68 ui_path = os.path.join(info.PATH,
'windows',
'ui',
'main-window.ui')
70 previewFrameSignal = pyqtSignal(int)
71 refreshFrameSignal = pyqtSignal()
72 LoadFileSignal = pyqtSignal(str)
73 PlaySignal = pyqtSignal(int)
74 PauseSignal = pyqtSignal()
75 StopSignal = pyqtSignal()
76 SeekSignal = pyqtSignal(int)
77 SpeedSignal = pyqtSignal(float)
78 RecoverBackup = pyqtSignal()
79 FoundVersionSignal = pyqtSignal(str)
80 WaveformReady = pyqtSignal(str, list)
86 self.tutorial_manager.exit_manager()
89 if get_app().project.needs_save():
90 log.info(
'Prompt user to save project')
95 ret = QMessageBox.question(self, _(
"Unsaved Changes"), _(
"Save changes to project before closing?"), QMessageBox.Cancel | QMessageBox.No | QMessageBox.Yes)
96 if ret == QMessageBox.Yes:
100 elif ret == QMessageBox.Cancel:
112 self.StopSignal.emit()
113 self.preview_thread.kill()
116 openshot.ZmqLogger.Instance().Close()
117 get_app().logger_libopenshot.kill()
120 self.preview_parent.background.wait(500)
128 log.info(
"recover_backup")
130 recovery_path = os.path.join(info.BACKUP_PATH,
"backup.osp")
133 if os.path.exists(recovery_path):
134 log.info(
"Recovering backup file: %s" % recovery_path)
135 self.
open_project(recovery_path, clear_thumbnails=
False)
138 get_app().project.current_filepath =
None 139 get_app().project.has_unsaved_changes =
True 147 msg.setWindowTitle(_(
"Backup Recovered"))
148 msg.setText(_(
"Your most recent unsaved project has been recovered."))
157 lock_path = os.path.join(info.USER_PATH,
".lock")
158 lock_value = str(uuid4())
161 if os.path.exists(lock_path):
163 log_path = os.path.join(info.USER_PATH,
"libopenshot.log")
165 if os.path.exists(log_path):
166 with open(log_path,
"r") as f: 168 for line
in reversed(f.readlines()):
170 if "---" not in line
and "libopenshot logging:" not in line:
177 last_log_line = last_log_line.replace(
"()",
"")
178 log_parts = last_log_line.split(
"(")
179 if len(log_parts) == 2:
180 last_log_line =
"-%s" % log_parts[0].replace(
"logger_libopenshot:INFO ",
"").strip()[:64]
181 elif len(log_parts) >= 3:
182 last_log_line =
"-%s (%s" % (log_parts[0].replace(
"logger_libopenshot:INFO ",
"").strip()[:64], log_parts[1])
187 log.error(
"Unhandled crash detected... will attempt to recover backup project: %s" % info.BACKUP_PATH)
194 QTimer.singleShot(0, self.RecoverBackup.emit)
204 with open(lock_path,
'w')
as f:
210 lock_path = os.path.join(info.USER_PATH,
".lock")
213 if os.path.exists(lock_path):
229 self.filesTreeView.refresh_view()
230 log.info(
"New Project created.")
237 from windows.animated_title
import AnimatedTitle
238 win = AnimatedTitle()
241 if result == QDialog.Accepted:
242 log.info(
'animated title add confirmed')
244 log.info(
'animated title add cancelled')
248 from windows.animation
import Animation
252 if result == QDialog.Accepted:
253 log.info(
'animation confirmed')
255 log.info(
'animation cancelled')
259 from windows.title_editor
import TitleEditor
263 if result == QDialog.Accepted:
264 log.info(
'title editor add confirmed')
266 log.info(
'title editor add cancelled')
270 from windows.Import_image_seq
import ImportImageSeq
271 win = ImportImageSeq()
274 if result == QDialog.Accepted:
275 log.info(
'Import image sequence add confirmed')
277 log.info(
'Import image sequence add cancelled')
287 app.project.save(file_path)
295 log.info(
"Saved project {}".
format(file_path))
297 except Exception
as ex:
298 log.error(
"Couldn't save project %s. %s" % (file_path, str(ex)))
299 QMessageBox.warning(self, _(
"Error Saving Project"), str(ex))
309 get_app().setOverrideCursor(QCursor(Qt.WaitCursor))
312 if os.path.exists(file_path.encode(
'UTF-8')):
318 app.project.load(file_path)
331 self.filesTreeView.refresh_view()
336 log.info(
"Loaded project {}".
format(file_path))
338 except Exception
as ex:
339 log.error(
"Couldn't open project {}".
format(file_path))
340 QMessageBox.warning(self, _(
"Error Opening Project"), str(ex))
343 get_app().restoreOverrideCursor()
349 if os.path.exists(info.THUMBNAIL_PATH):
350 log.info(
"Clear all thumbnails: %s" % info.THUMBNAIL_PATH)
352 shutil.rmtree(info.THUMBNAIL_PATH)
354 os.mkdir(info.THUMBNAIL_PATH)
357 if os.path.exists(info.BLENDER_PATH):
358 log.info(
"Clear all animations: %s" % info.BLENDER_PATH)
360 shutil.rmtree(info.BLENDER_PATH)
362 os.mkdir(info.BLENDER_PATH)
365 if os.path.exists(info.BACKUP_PATH):
366 log.info(
"Clear all backups: %s" % info.BACKUP_PATH)
368 shutil.rmtree(info.BACKUP_PATH)
370 os.mkdir(info.BACKUP_PATH)
372 log.info(
"Failed to clear thumbnails: %s" % info.THUMBNAIL_PATH)
377 recommended_path = app.project.current_filepath
378 if not recommended_path:
379 recommended_path = info.HOME_PATH
380 file_path, file_type = QFileDialog.getOpenFileName(self, _(
"Open Project..."), recommended_path, _(
"OpenShot Project (*.osp)"))
390 file_path = app.project.current_filepath
392 recommended_path = os.path.join(info.HOME_PATH,
"%s.osp" % _(
"Untitled Project"))
393 file_path, file_type = QFileDialog.getSaveFileName(self, _(
"Save Project..."), recommended_path, _(
"OpenShot Project (*.osp)"))
397 if ".osp" not in file_path:
398 file_path =
"%s.osp" % file_path
406 log.info(
"auto_save_project")
409 file_path =
get_app().project.current_filepath
410 if get_app().project.needs_save():
414 if ".osp" not in file_path:
415 file_path =
"%s.osp" % file_path
418 log.info(
"Auto save project file: %s" % file_path)
423 recovery_path = os.path.join(info.BACKUP_PATH,
"backup.osp")
424 log.info(
"Creating backup of project file: %s" % recovery_path)
425 get_app().project.save(recovery_path, move_temp_files=
False, make_paths_relative=
False)
428 get_app().project.current_filepath =
None 429 get_app().project.has_unsaved_changes =
True 435 recommended_path = app.project.current_filepath
436 if not recommended_path:
437 recommended_path = os.path.join(info.HOME_PATH,
"%s.osp" % _(
"Untitled Project"))
438 file_path, file_type = QFileDialog.getSaveFileName(self, _(
"Save Project As..."), recommended_path, _(
"OpenShot Project (*.osp)"))
441 if ".osp" not in file_path:
442 file_path =
"%s.osp" % file_path
450 recommended_path = app.project.current_filepath
451 if not recommended_path:
452 recommended_path = os.path.join(info.HOME_PATH)
453 files = QFileDialog.getOpenFileNames(self, _(
"Import File..."), recommended_path)[0]
454 for file_path
in files:
455 self.filesTreeView.add_file(file_path)
456 self.filesTreeView.refresh_view()
457 log.info(
"Imported media file {}".
format(file_path))
465 files.append(File.get(id=file_id))
468 fps =
get_app().project.get([
"fps"])
469 fps_float = float(fps[
"num"]) / float(fps[
"den"])
470 pos = (self.preview_thread.player.Position() - 1) / fps_float
473 from windows.add_to_timeline
import AddToTimeline
474 win = AddToTimeline(files, pos)
477 if result == QDialog.Accepted:
478 log.info(
'confirmed')
484 from windows.upload_video
import UploadVideo
488 if result == QDialog.Accepted:
489 log.info(
'Upload Video add confirmed')
491 log.info(
'Upload Video add cancelled')
495 from windows.export
import Export
499 if result == QDialog.Accepted:
500 log.info(
'Export Video add confirmed')
502 log.info(
'Export Video add cancelled')
505 log.info(
'actionUndo_trigger')
510 log.info(
'actionRedo_trigger')
516 from windows.preferences
import Preferences
520 if result == QDialog.Accepted:
521 log.info(
'Preferences add confirmed')
523 log.info(
'Preferences add cancelled')
526 self.filesTreeView.refresh_view()
529 self.filesTreeView.refresh_view()
532 self.filesTreeView.refresh_view()
535 self.filesTreeView.refresh_view()
538 self.transitionsTreeView.refresh_view()
541 self.transitionsTreeView.refresh_view()
544 self.effectsTreeView.refresh_view()
547 self.effectsTreeView.refresh_view()
550 self.effectsTreeView.refresh_view()
554 webbrowser.open(
"http://openshotusers.com/?app-menu")
555 log.info(
"Help Contents is open")
557 QMessageBox.information(self,
"Error !",
558 "Unable to open the Help Contents. Please ensure the openshot-doc package is installed.")
559 log.info(
"Unable to open the Help Contents")
564 from windows.about
import About
568 if result == QDialog.Accepted:
569 log.info(
'About Openshot add confirmed')
571 log.info(
'About Openshot add cancelled')
575 webbrowser.open(
"https://github.com/OpenShot/openshot-qt/issues/?app-menu-bug")
576 log.info(
"Open the Bug Report GitHub Issues web page with success")
578 QMessageBox.information(self,
"Error !",
"Unable to open the Bug Report GitHub Issues web page")
579 log.info(
"Unable to open the Bug Report GitHub Issues web page")
583 webbrowser.open(
"https://github.com/OpenShot/openshot-qt/issues/?app-menu-question")
584 log.info(
"Open the Questions GitHub Issues web page with success")
586 QMessageBox.information(self,
"Error !",
"Unable to open the Questions GitHub Issues web page")
587 log.info(
"Unable to open the Questions GitHub Issues web page")
591 webbrowser.open(
"https://translations.launchpad.net/openshot/2.0")
592 log.info(
"Open the Translate launchpad web page with success")
594 QMessageBox.information(self,
"Error !",
"Unable to open the Translation web page")
595 log.info(
"Unable to open the Translation web page")
599 webbrowser.open(
"http://openshot.org/donate/?app-menu")
600 log.info(
"Open the Donate web page with success")
602 QMessageBox.information(self,
"Error !",
"Unable to open the Donate web page")
603 log.info(
"Unable to open the Donate web page")
607 webbrowser.open(
"http://openshot.org/download/?app-toolbar")
608 log.info(
"Open the Download web page with success")
610 QMessageBox.information(self,
"Error !",
"Unable to open the Download web page")
611 log.info(
"Unable to open the Download web page")
616 timeline_length = 0.0
617 fps =
get_app().window.timeline_sync.timeline.info.fps.ToFloat()
618 clips =
get_app().window.timeline_sync.timeline.Clips()
620 clip_last_frame = clip.Position() + clip.Duration()
621 if clip_last_frame > timeline_length:
623 timeline_length = clip_last_frame
626 timeline_length_int = round(timeline_length * fps) + 1
629 self.actionPlay.setChecked(
False)
630 elif force ==
"play":
631 self.actionPlay.setChecked(
True)
633 if self.actionPlay.isChecked():
635 self.PlaySignal.emit(timeline_length_int)
639 self.PauseSignal.emit()
644 log.info(
'actionPreview_File_trigger')
651 previewPath = f.data[
"path"]
654 self.LoadFileSignal.emit(previewPath)
657 self.actionPlay.setChecked(
False)
658 self.actionPlay.trigger()
664 self.previewFrameSignal.emit(position_frames)
667 self.propertyTableView.select_frame(position_frames)
673 self.timeline.movePlayhead(position_frames)
678 player = self.preview_thread.player
680 if player.Speed() + 1 != 0:
681 self.SpeedSignal.emit(player.Speed() + 1)
683 self.SpeedSignal.emit(player.Speed() + 2)
685 if player.Mode() == openshot.PLAYBACK_PAUSED:
686 self.actionPlay.trigger()
691 player = self.preview_thread.player
693 if player.Speed() - 1 != 0:
694 self.SpeedSignal.emit(player.Speed() - 1)
696 self.SpeedSignal.emit(player.Speed() - 2)
698 if player.Mode() == openshot.PLAYBACK_PAUSED:
699 self.actionPlay.trigger()
702 log.info(
"actionJumpStart_trigger")
705 self.SeekSignal.emit(1)
708 log.info(
"actionJumpEnd_trigger")
711 timeline_length = 0.0
712 fps =
get_app().window.timeline_sync.timeline.info.fps.ToFloat()
713 clips =
get_app().window.timeline_sync.timeline.Clips()
715 clip_last_frame = clip.Position() + clip.Duration()
716 if clip_last_frame > timeline_length:
718 timeline_length = clip_last_frame
721 timeline_length_int = round(timeline_length * fps) + 1
724 self.SeekSignal.emit(timeline_length_int)
727 log.info(
"actionAddTrack_trigger")
730 track_number = len(
get_app().project.get([
"layers"]))
734 track.data = {
"number": track_number,
"y": 0,
"label":
"",
"lock":
False}
738 log.info(
"actionAddTrackAbove_trigger")
741 max_track_number = len(
get_app().project.get([
"layers"]))
745 existing_track = Track.get(id=selected_layer_id)
746 selected_layer_number = int(existing_track.data[
"number"])
750 track.data = {
"number": max_track_number,
"y": 0,
"label":
"",
"lock":
False}
754 for existing_layer
in list(reversed(range(selected_layer_number + 1, max_track_number))):
755 existing_track.data[
"label"] =
"" 756 existing_track.save()
758 for clip
in Clip.filter(layer=existing_layer):
759 clip.data[
"layer"] = int(clip.data[
"layer"]) + 1
763 log.info(
"actionAddTrackAbove_trigger")
766 max_track_number = len(
get_app().project.get([
"layers"]))
770 existing_track = Track.get(id=selected_layer_id)
771 selected_layer_number = int(existing_track.data[
"number"])
775 track.data = {
"number": max_track_number,
"y": 0,
"label":
"",
"lock":
False}
779 for existing_layer
in list(reversed(range(selected_layer_number, max_track_number))):
780 existing_track.data[
"label"] =
"" 781 existing_track.save()
783 for clip
in Clip.filter(layer=existing_layer):
784 clip.data[
"layer"] = int(clip.data[
"layer"]) + 1
788 log.info(
"actionArrowTool_trigger")
791 log.info(
"actionSnappingTool_trigger")
792 log.info(self.actionSnappingTool.isChecked())
795 self.timeline.SetSnappingMode(self.actionSnappingTool.isChecked())
798 log.info(
"actionAddMarker_trigger")
801 player = self.preview_thread.player
804 fps =
get_app().project.get([
"fps"])
805 fps_float = float(fps[
"num"]) / float(fps[
"den"])
808 position = player.Position() / fps_float
812 marker.data = {
"position": position,
"icon":
"blue.png"}
816 log.info(
"actionPreviousMarker_trigger")
819 fps =
get_app().project.get([
"fps"])
820 fps_float = float(fps[
"num"]) / float(fps[
"den"])
821 current_position = self.preview_thread.current_frame / fps_float
824 closest_position =
None 825 for marker
in Marker.filter():
826 marker_position = marker.data[
"position"]
829 if marker_position < current_position:
831 if closest_position
and marker_position > closest_position:
833 closest_position = marker_position
834 elif not closest_position:
836 closest_position = marker_position
841 frame_to_seek = int(closest_position * fps_float)
842 self.SeekSignal.emit(frame_to_seek)
845 log.info(
"actionNextMarker_trigger")
846 log.info(self.preview_thread.current_frame)
849 fps =
get_app().project.get([
"fps"])
850 fps_float = float(fps[
"num"]) / float(fps[
"den"])
851 current_position = self.preview_thread.current_frame / fps_float
854 closest_position =
None 855 for marker
in Marker.filter():
856 marker_position = marker.data[
"position"]
859 if marker_position > current_position:
861 if closest_position
and marker_position < closest_position:
863 closest_position = marker_position
864 elif not closest_position:
866 closest_position = marker_position
871 frame_to_seek = int(closest_position * fps_float)
872 self.SeekSignal.emit(frame_to_seek)
878 shortcut = QKeySequence(s.get(setting_name))
884 keyboard_shortcuts = []
886 for setting
in all_settings:
887 if setting.get(
'category') ==
'Keyboard':
888 keyboard_shortcuts.append(setting)
889 return keyboard_shortcuts
894 MOD_MASK = (Qt.CTRL | Qt.ALT | Qt.SHIFT | Qt.META)
897 key_value = event.key()
899 modifiers = int(event.modifiers())
900 if (key_value > 0
and key_value != Qt.Key_Shift
and key_value != Qt.Key_Alt
and 901 key_value != Qt.Key_Control
and key_value != Qt.Key_Meta):
903 key = QKeySequence(modifiers + key_value)
909 log.info(
"keyPressEvent: %s" % (key.toString()))
912 player = self.preview_thread.player
915 fps =
get_app().project.get([
"fps"])
916 fps_float = float(fps[
"num"]) / float(fps[
"den"])
917 playhead_position = float(self.preview_thread.current_frame) / fps_float
920 if key.matches(self.
getShortcutByName(
"seekPreviousFrame")) == QKeySequence.ExactMatch:
924 if player.Speed() != 0:
925 self.SpeedSignal.emit(0)
927 self.SeekSignal.emit(player.Position() - 1)
930 self.propertyTableView.select_frame(player.Position())
932 elif key.matches(self.
getShortcutByName(
"seekNextFrame")) == QKeySequence.ExactMatch:
936 if player.Speed() != 0:
937 self.SpeedSignal.emit(0)
939 self.SeekSignal.emit(player.Position() + 1)
942 self.propertyTableView.select_frame(player.Position())
944 elif key.matches(self.
getShortcutByName(
"rewindVideo")) == QKeySequence.ExactMatch:
946 self.actionRewind.trigger()
948 self.actionPlay.setChecked(
True)
950 elif key.matches(self.
getShortcutByName(
"fastforwardVideo")) == QKeySequence.ExactMatch:
952 self.actionFastForward.trigger()
954 self.actionPlay.setChecked(
True)
956 elif key.matches(self.
getShortcutByName(
"playToggle")) == QKeySequence.ExactMatch
or \
957 key.matches(self.
getShortcutByName(
"playToggle1")) == QKeySequence.ExactMatch
or \
958 key.matches(self.
getShortcutByName(
"playToggle2")) == QKeySequence.ExactMatch
or \
961 self.actionPlay.trigger()
962 self.propertyTableView.select_frame(player.Position())
964 elif key.matches(self.
getShortcutByName(
"deleteItem")) == QKeySequence.ExactMatch
or \
967 self.actionRemoveClip.trigger()
968 self.actionRemoveTransition.trigger()
971 elif key.matches(self.
getShortcutByName(
"actionNew")) == QKeySequence.ExactMatch:
972 self.actionNew.trigger()
973 elif key.matches(self.
getShortcutByName(
"actionOpen")) == QKeySequence.ExactMatch:
974 self.actionOpen.trigger()
975 elif key.matches(self.
getShortcutByName(
"actionSave")) == QKeySequence.ExactMatch:
976 self.actionSave.trigger()
977 elif key.matches(self.
getShortcutByName(
"actionUndo")) == QKeySequence.ExactMatch:
978 self.actionUndo.trigger()
979 elif key.matches(self.
getShortcutByName(
"actionSaveAs")) == QKeySequence.ExactMatch:
980 self.actionSaveAs.trigger()
981 elif key.matches(self.
getShortcutByName(
"actionImportFiles")) == QKeySequence.ExactMatch:
982 self.actionImportFiles.trigger()
983 elif key.matches(self.
getShortcutByName(
"actionRedo")) == QKeySequence.ExactMatch:
984 self.actionRedo.trigger()
985 elif key.matches(self.
getShortcutByName(
"actionExportVideo")) == QKeySequence.ExactMatch:
986 self.actionExportVideo.trigger()
987 elif key.matches(self.
getShortcutByName(
"actionQuit")) == QKeySequence.ExactMatch:
988 self.actionQuit.trigger()
989 elif key.matches(self.
getShortcutByName(
"actionPreferences")) == QKeySequence.ExactMatch:
990 self.actionPreferences.trigger()
991 elif key.matches(self.
getShortcutByName(
"actionAddTrack")) == QKeySequence.ExactMatch:
992 self.actionAddTrack.trigger()
993 elif key.matches(self.
getShortcutByName(
"actionAddMarker")) == QKeySequence.ExactMatch:
994 self.actionAddMarker.trigger()
995 elif key.matches(self.
getShortcutByName(
"actionPreviousMarker")) == QKeySequence.ExactMatch:
996 self.actionPreviousMarker.trigger()
997 elif key.matches(self.
getShortcutByName(
"actionNextMarker")) == QKeySequence.ExactMatch:
998 self.actionNextMarker.trigger()
999 elif key.matches(self.
getShortcutByName(
"actionTimelineZoomIn")) == QKeySequence.ExactMatch:
1000 self.actionTimelineZoomIn.trigger()
1001 elif key.matches(self.
getShortcutByName(
"actionTimelineZoomOut")) == QKeySequence.ExactMatch:
1002 self.actionTimelineZoomOut.trigger()
1003 elif key.matches(self.
getShortcutByName(
"actionTitle")) == QKeySequence.ExactMatch:
1004 self.actionTitle.trigger()
1005 elif key.matches(self.
getShortcutByName(
"actionAnimatedTitle")) == QKeySequence.ExactMatch:
1006 self.actionAnimatedTitle.trigger()
1007 elif key.matches(self.
getShortcutByName(
"actionFullscreen")) == QKeySequence.ExactMatch:
1008 self.actionFullscreen.trigger()
1009 elif key.matches(self.
getShortcutByName(
"actionAbout")) == QKeySequence.ExactMatch:
1010 self.actionAbout.trigger()
1011 elif key.matches(self.
getShortcutByName(
"actionThumbnailView")) == QKeySequence.ExactMatch:
1012 self.actionThumbnailView.trigger()
1013 elif key.matches(self.
getShortcutByName(
"actionDetailsView")) == QKeySequence.ExactMatch:
1014 self.actionDetailsView.trigger()
1015 elif key.matches(self.
getShortcutByName(
"actionProfile")) == QKeySequence.ExactMatch:
1016 self.actionProfile.trigger()
1017 elif key.matches(self.
getShortcutByName(
"actionAdd_to_Timeline")) == QKeySequence.ExactMatch:
1018 self.actionAdd_to_Timeline.trigger()
1019 elif key.matches(self.
getShortcutByName(
"actionSplitClip")) == QKeySequence.ExactMatch:
1020 self.actionSplitClip.trigger()
1021 elif key.matches(self.
getShortcutByName(
"actionSnappingTool")) == QKeySequence.ExactMatch:
1022 self.actionSnappingTool.trigger()
1023 elif key.matches(self.
getShortcutByName(
"actionJumpStart")) == QKeySequence.ExactMatch:
1024 self.actionJumpStart.trigger()
1025 elif key.matches(self.
getShortcutByName(
"actionJumpEnd")) == QKeySequence.ExactMatch:
1026 self.actionJumpEnd.trigger()
1027 elif key.matches(self.
getShortcutByName(
"actionProperties")) == QKeySequence.ExactMatch:
1028 self.actionProperties.trigger()
1031 elif key.matches(self.
getShortcutByName(
"sliceAllKeepBothSides")) == QKeySequence.ExactMatch:
1032 intersecting_clips = Clip.filter(intersect=playhead_position)
1033 intersecting_trans = Transition.filter(intersect=playhead_position)
1034 if intersecting_clips
or intersecting_trans:
1036 clip_ids = [c.id
for c
in intersecting_clips]
1037 trans_ids = [t.id
for t
in intersecting_trans]
1038 self.timeline.Slice_Triggered(0, clip_ids, trans_ids, playhead_position)
1039 elif key.matches(self.
getShortcutByName(
"sliceAllKeepLeftSide")) == QKeySequence.ExactMatch:
1040 intersecting_clips = Clip.filter(intersect=playhead_position)
1041 intersecting_trans = Transition.filter(intersect=playhead_position)
1042 if intersecting_clips
or intersecting_trans:
1044 clip_ids = [c.id
for c
in intersecting_clips]
1045 trans_ids = [t.id
for t
in intersecting_trans]
1046 self.timeline.Slice_Triggered(1, clip_ids, trans_ids, playhead_position)
1047 elif key.matches(self.
getShortcutByName(
"sliceAllKeepRightSide")) == QKeySequence.ExactMatch:
1048 intersecting_clips = Clip.filter(intersect=playhead_position)
1049 intersecting_trans = Transition.filter(intersect=playhead_position)
1050 if intersecting_clips
or intersecting_trans:
1052 clip_ids = [c.id
for c
in intersecting_clips]
1053 trans_ids = [t.id
for t
in intersecting_trans]
1054 self.timeline.Slice_Triggered(2, clip_ids, trans_ids, playhead_position)
1057 elif key.matches(self.
getShortcutByName(
"pasteAll")) == QKeySequence.ExactMatch:
1058 self.timeline.Paste_Triggered(9, float(playhead_position), -1, [], [])
1061 elif key.matches(self.
getShortcutByName(
"selectAll")) == QKeySequence.ExactMatch:
1062 self.timeline.SelectAll()
1064 elif key.matches(self.
getShortcutByName(
"selectNone")) == QKeySequence.ExactMatch:
1065 self.timeline.ClearAllSelections()
1073 from windows.profile
import Profile
1076 result = win.exec_()
1077 if result == QDialog.Accepted:
1078 log.info(
'Profile add confirmed')
1082 log.info(
"actionSplitClip_trigger")
1088 f = File.get(id=file_id)
1096 from windows.cutting
import Cutting
1099 result = win.exec_()
1100 if result == QDialog.Accepted:
1101 log.info(
'Cutting Finished')
1103 log.info(
'Cutting Cancelled')
1106 log.info(
"actionRemove_from_Project_trigger")
1111 f = File.get(id=file_id)
1117 clips = Clip.filter(file_id=file_id)
1126 log.info(
'actionRemoveClip_trigger')
1131 clips = Clip.filter(id=clip_id)
1140 log.info(
'actionProperties_trigger')
1143 if not self.dockProperties.isVisible():
1144 self.dockProperties.show()
1147 log.info(
'actionRemoveEffect_trigger')
1151 log.info(
"effect id: %s" % effect_id)
1154 clips = Clip.filter()
1157 found_effect =
False 1158 log.info(
"c.data[effects]: %s" % c.data[
"effects"])
1160 for effect
in c.data[
"effects"]:
1161 if effect[
"id"] == effect_id:
1162 found_effect = effect
1167 c.data[
"effects"].remove(found_effect)
1170 c.data.pop(
"reader")
1179 log.info(
'actionRemoveTransition_trigger')
1184 transitions = Transition.filter(id=tran_id)
1185 for t
in transitions:
1193 log.info(
'actionRemoveTrack_trigger')
1199 max_track_number = len(
get_app().project.get([
"layers"]))
1202 selected_track = Track.get(id=track_id)
1203 selected_track_number = int(selected_track.data[
"number"])
1206 if max_track_number == 1:
1208 QMessageBox.warning(self, _(
"Error Removing Track"), _(
"You must keep at least 1 track"))
1212 for clip
in Clip.filter(layer=selected_track_number):
1216 for trans
in Transition.filter(layer=selected_track_number):
1220 selected_track.delete()
1223 for existing_layer
in list(range(selected_track_number + 1, max_track_number)):
1225 track = Track.get(number=existing_layer)
1226 track.data[
"number"] = existing_layer - 1
1227 track.data[
"label"] =
"" 1230 for clip
in Clip.filter(layer=existing_layer):
1231 clip.data[
"layer"] = int(clip.data[
"layer"]) - 1
1240 log.info(
'actionLockTrack_trigger')
1244 selected_track = Track.get(id=track_id)
1247 selected_track.data[
'lock'] =
True 1248 selected_track.save()
1253 log.info(
'actionUnlockTrack_trigger')
1257 selected_track = Track.get(id=track_id)
1260 selected_track.data[
'lock'] =
False 1261 selected_track.save()
1266 log.info(
'actionRenameTrack_trigger')
1273 selected_track = Track.get(id=track_id)
1274 track_name = selected_track.data[
"label"]
or _(
"Track %s") % selected_track.data[
"number"]
1276 text, ok = QInputDialog.getText(self, _(
'Rename Track'), _(
'Track Name:'), text=track_name)
1279 selected_track.data[
"label"] = text
1280 selected_track.save()
1283 log.info(
'actionRemoveMarker_trigger')
1286 marker = Marker.filter(id=marker_id)
1292 self.sliderZoom.setValue(self.sliderZoom.value() - self.sliderZoom.singleStep())
1295 self.sliderZoom.setValue(self.sliderZoom.value() + self.sliderZoom.singleStep())
1299 if not self.isFullScreen():
1300 self.showFullScreen()
1305 log.info(
"Show file properties")
1311 f = File.get(id=file_id)
1314 from windows.file_properties
import FileProperties
1315 win = FileProperties(f)
1317 result = win.exec_()
1318 if result == QDialog.Accepted:
1319 log.info(
'File Properties Finished')
1321 log.info(
'File Properties Cancelled')
1324 log.info(
"Switch to Details View")
1331 if app.context_menu_object ==
"files":
1332 s.set(
"file_view",
"details")
1334 self.filesTreeView.deleteLater()
1340 elif app.context_menu_object ==
"transitions":
1341 s.set(
"transitions_view",
"details")
1343 self.transitionsTreeView.deleteLater()
1349 elif app.context_menu_object ==
"effects":
1350 s.set(
"effects_view",
"details")
1352 self.effectsTreeView.deleteLater()
1358 log.info(
"Switch to Thumbnail View")
1365 if app.context_menu_object ==
"files":
1366 s.set(
"file_view",
"thumbnail")
1368 self.filesTreeView.deleteLater()
1374 elif app.context_menu_object ==
"transitions":
1375 s.set(
"transitions_view",
"thumbnail")
1377 self.transitionsTreeView.deleteLater()
1383 elif app.context_menu_object ==
"effects":
1384 s.set(
"effects_view",
"thumbnail")
1386 self.effectsTreeView.deleteLater()
1393 self.filesTreeView.resize_contents()
1398 return [self.dockFiles,
1399 self.dockTransitions,
1402 self.dockProperties]
1408 self.removeDockWidget(dock)
1414 self.addDockWidget(area, dock)
1420 dock.setFloating(is_floating)
1426 if get_app().window.dockWidgetArea(dock) != Qt.NoDockWidgetArea:
1434 dock.setFeatures(QDockWidget.NoDockWidgetFeatures)
1440 dock.setFeatures(QDockWidget.AllDockWidgetFeatures)
1452 self.
addDocks([self.dockFiles, self.dockTransitions, self.dockEffects, self.dockVideo], Qt.TopDockWidgetArea)
1454 self.tabifyDockWidget(self.dockFiles, self.dockTransitions)
1455 self.tabifyDockWidget(self.dockTransitions, self.dockEffects)
1456 self.
showDocks([self.dockFiles, self.dockTransitions, self.dockEffects, self.dockVideo])
1459 simple_state =
"AAAA/wAAAAD9AAAAAwAAAAAAAAD8AAAA9PwCAAAAAfwAAAILAAAA9AAAAAAA////+v////8CAAAAAvsAAAAcAGQAbwBjAGsAUAByAG8AcABlAHIAdABpAGUAcwAAAAAA/////wAAAKEA////+wAAABgAZABvAGMAawBLAGUAeQBmAHIAYQBtAGUAAAAAAP////8AAAATAP///wAAAAEAAAEcAAABQPwCAAAAAfsAAAAYAGQAbwBjAGsASwBlAHkAZgByAGEAbQBlAQAAAVgAAAAVAAAAAAAAAAAAAAACAAAEqwAAAdz8AQAAAAL8AAAAAAAAAWQAAAB7AP////oAAAAAAgAAAAP7AAAAEgBkAG8AYwBrAEYAaQBsAGUAcwEAAAAA/////wAAAJgA////+wAAAB4AZABvAGMAawBUAHIAYQBuAHMAaQB0AGkAbwBuAHMBAAAAAP////8AAACYAP////sAAAAWAGQAbwBjAGsARQBmAGYAZQBjAHQAcwEAAAAA/////wAAAJgA////+wAAABIAZABvAGMAawBWAGkAZABlAG8BAAABagAAA0EAAAA6AP///wAABKsAAAD2AAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAAAAAAA==" 1461 QCoreApplication.processEvents()
1470 self.
addDocks([self.dockFiles, self.dockTransitions, self.dockVideo], Qt.TopDockWidgetArea)
1471 self.
addDocks([self.dockEffects], Qt.RightDockWidgetArea)
1472 self.
addDocks([self.dockProperties], Qt.LeftDockWidgetArea)
1475 self.
showDocks([self.dockFiles, self.dockTransitions, self.dockVideo, self.dockEffects, self.dockProperties])
1478 advanced_state =
"AAAA/wAAAAD9AAAAAwAAAAAAAAD8AAABQPwCAAAAAfwAAAG/AAABQAAAAKEA////+gAAAAACAAAAAvsAAAAcAGQAbwBjAGsAUAByAG8AcABlAHIAdABpAGUAcwEAAAAA/////wAAAKEA////+wAAABgAZABvAGMAawBLAGUAeQBmAHIAYQBtAGUAAAAAAP////8AAAATAP///wAAAAEAAAEcAAABQPwCAAAAAvsAAAAYAGQAbwBjAGsASwBlAHkAZgByAGEAbQBlAQAAAVgAAAAVAAAAAAAAAAD7AAAAFgBkAG8AYwBrAEUAZgBmAGUAYwB0AHMBAAABvwAAAUAAAACYAP///wAAAAIAAASrAAABkvwBAAAAA/sAAAASAGQAbwBjAGsARgBpAGwAZQBzAQAAAAAAAAFeAAAAcAD////7AAAAHgBkAG8AYwBrAFQAcgBhAG4AcwBpAHQAaQBvAG4AcwEAAAFkAAABAAAAAHAA////+wAAABIAZABvAGMAawBWAGkAZABlAG8BAAACagAAAkEAAAA6AP///wAAAocAAAFAAAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAAAAAAA==" 1480 QCoreApplication.processEvents()
1486 self.actionFreeze_View.setVisible(
False)
1487 self.actionUn_Freeze_View.setVisible(
True)
1493 self.actionFreeze_View.setVisible(
True)
1494 self.actionUn_Freeze_View.setVisible(
False)
1507 s.set(
"tutorial_enabled",
True)
1508 s.set(
"tutorial_ids",
"")
1512 self.tutorial_manager.exit_manager()
1523 profile =
get_app().project.get([
"profile"])
1526 if not get_app().project.current_filepath:
1528 self.setWindowTitle(
"%s [%s] - %s" % (_(
"Untitled Project"), profile,
"OpenShot Video Editor"))
1532 parent_path, filename = os.path.split(
get_app().project.current_filepath)
1533 filename, ext = os.path.splitext(filename)
1534 filename = filename.replace(
"_",
" ").replace(
"-",
" ").capitalize()
1535 self.setWindowTitle(
"%s [%s] - %s" % (filename, profile,
"OpenShot Video Editor"))
1539 log.info(
'updateStatusChanged')
1540 self.actionUndo.setEnabled(undo_status)
1541 self.actionRedo.setEnabled(redo_status)
1545 log.info(
'main::addSelection: item_id: %s, item_type: %s, clear_existing: %s' % (item_id, item_type, clear_existing))
1549 if item_type ==
"clip":
1550 self.selected_clips.clear()
1551 elif item_type ==
"transition":
1552 self.selected_transitions.clear()
1553 elif item_type ==
"effect":
1554 self.selected_effects.clear()
1559 self.selected_clips.append(item_id)
1561 self.selected_transitions.append(item_id)
1563 self.selected_effects.append(item_id)
1566 self.propertyTableView.loadProperties.emit(item_id, item_type)
1571 self.selected_clips.remove(item_id)
1573 self.selected_transitions.remove(item_id)
1575 self.selected_effects.remove(item_id)
1579 self.propertyTableView.loadProperties.emit(self.
selected_clips[0], item_type)
1583 self.propertyTableView.loadProperties.emit(self.
selected_effects[0], item_type)
1586 self.propertyTableView.loadProperties.emit(
"",
"")
1614 recent_projects = s.get(
"recent_projects")
1620 self.
recent_menu = self.menuFile.addMenu(QIcon.fromTheme(
"document-open-recent"), _(
"Recent Projects"))
1621 self.menuFile.insertMenu(self.actionRecent_Placeholder, self.
recent_menu)
1624 self.recent_menu.clear()
1627 for file_path
in reversed(recent_projects):
1628 new_action = self.recent_menu.addAction(file_path)
1642 self.actionUndo.setEnabled(
False)
1643 self.actionRedo.setEnabled(
False)
1648 self.filesActionGroup.setExclusive(
True)
1649 self.filesActionGroup.addAction(self.actionFilesShowAll)
1650 self.filesActionGroup.addAction(self.actionFilesShowVideo)
1651 self.filesActionGroup.addAction(self.actionFilesShowAudio)
1652 self.filesActionGroup.addAction(self.actionFilesShowImage)
1653 self.actionFilesShowAll.setChecked(
True)
1654 self.filesToolbar.addAction(self.actionFilesShowAll)
1655 self.filesToolbar.addAction(self.actionFilesShowVideo)
1656 self.filesToolbar.addAction(self.actionFilesShowAudio)
1657 self.filesToolbar.addAction(self.actionFilesShowImage)
1659 self.filesFilter.setObjectName(
"filesFilter")
1660 self.filesFilter.setPlaceholderText(_(
"Filter"))
1662 self.actionFilesClear.setEnabled(
False)
1663 self.filesToolbar.addAction(self.actionFilesClear)
1669 self.transitionsActionGroup.setExclusive(
True)
1670 self.transitionsActionGroup.addAction(self.actionTransitionsShowAll)
1671 self.transitionsActionGroup.addAction(self.actionTransitionsShowCommon)
1672 self.actionTransitionsShowAll.setChecked(
True)
1673 self.transitionsToolbar.addAction(self.actionTransitionsShowAll)
1674 self.transitionsToolbar.addAction(self.actionTransitionsShowCommon)
1676 self.transitionsFilter.setObjectName(
"transitionsFilter")
1677 self.transitionsFilter.setPlaceholderText(_(
"Filter"))
1679 self.actionTransitionsClear.setEnabled(
False)
1680 self.transitionsToolbar.addAction(self.actionTransitionsClear)
1686 self.effectsActionGroup.setExclusive(
True)
1687 self.effectsActionGroup.addAction(self.actionEffectsShowAll)
1688 self.effectsActionGroup.addAction(self.actionEffectsShowVideo)
1689 self.effectsActionGroup.addAction(self.actionEffectsShowAudio)
1690 self.actionEffectsShowAll.setChecked(
True)
1691 self.effectsToolbar.addAction(self.actionEffectsShowAll)
1692 self.effectsToolbar.addAction(self.actionEffectsShowVideo)
1693 self.effectsToolbar.addAction(self.actionEffectsShowAudio)
1695 self.effectsFilter.setObjectName(
"effectsFilter")
1696 self.effectsFilter.setPlaceholderText(_(
"Filter"))
1698 self.actionEffectsClear.setEnabled(
False)
1699 self.effectsToolbar.addAction(self.actionEffectsClear)
1706 spacer = QWidget(self)
1707 spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
1708 self.videoToolbar.addWidget(spacer)
1711 self.videoToolbar.addAction(self.actionJumpStart)
1712 self.videoToolbar.addAction(self.actionRewind)
1713 self.videoToolbar.addAction(self.actionPlay)
1714 self.videoToolbar.addAction(self.actionFastForward)
1715 self.videoToolbar.addAction(self.actionJumpEnd)
1716 self.actionPlay.setCheckable(
True)
1719 spacer = QWidget(self)
1720 spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
1721 self.videoToolbar.addWidget(spacer)
1728 self.timelineToolbar.addAction(self.actionAddTrack)
1729 self.timelineToolbar.addSeparator()
1732 self.timelineToolbar.addAction(self.actionSnappingTool)
1733 self.timelineToolbar.addSeparator()
1734 self.timelineToolbar.addAction(self.actionAddMarker)
1735 self.timelineToolbar.addAction(self.actionPreviousMarker)
1736 self.timelineToolbar.addAction(self.actionNextMarker)
1737 self.timelineToolbar.addSeparator()
1741 self.sliderZoom.setPageStep(6)
1742 self.sliderZoom.setRange(8, 800)
1743 self.sliderZoom.setValue(20)
1744 self.sliderZoom.setInvertedControls(
True)
1745 self.sliderZoom.resize(100, 16)
1750 self.timelineToolbar.addAction(self.actionTimelineZoomIn)
1751 self.timelineToolbar.addWidget(self.
sliderZoom)
1752 self.timelineToolbar.addAction(self.actionTimelineZoomOut)
1759 spacer = QWidget(self)
1760 spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
1761 self.toolBar.addWidget(spacer)
1762 self.toolBar.addAction(self.actionUpdate)
1776 self.propertyTableView.loadProperties.emit(
"",
"")
1781 log.info(
'foundCurrentVersion: Found the latest version: %s' % version)
1785 if info.VERSION < version:
1787 self.actionUpdate.setVisible(
True)
1788 self.actionUpdate.setText(_(
"New Version Available: %s") % version)
1789 self.actionUpdate.setToolTip(_(
"New Version Available: %s") % version)
1795 self.tutorial_manager.re_position_dialog()
1800 if e.type() == QEvent.WindowActivate:
1801 self.tutorial_manager.re_show_dialog()
1802 elif e.type() == QEvent.WindowStateChange
and self.isMinimized():
1803 self.tutorial_manager.minimize()
1816 for action
in self.findChildren(QAction):
1817 if shortcut.get(
'setting') == action.objectName():
1818 action.setShortcut(QKeySequence(_(shortcut.get(
'value'))))
1823 QMainWindow.__init__(self)
1853 get_app().updates.add_watcher(self)
1864 self.frameWeb.layout().addWidget(self.
timeline)
1870 if s.get(
"file_view") ==
"details":
1877 if s.get(
"transitions_view") ==
"details":
1884 if s.get(
"effects_view") ==
"details":
1891 self.txtPropertyFilter.setPlaceholderText(_(
"Filter"))
1894 self.dockPropertiesContent.layout().addWidget(self.
selectionLabel, 0, 1)
1902 self.tabVideo.layout().insertWidget(0, self.
videoPreview)
1912 self.preview_parent.Init(self, self.timeline_sync.timeline, self.
videoPreview)
1917 self.auto_save_timer.setInterval(s.get(
"autosave-interval") * 1000 * 60)
1919 if s.get(
"enable-auto-save"):
1920 self.auto_save_timer.start()
1932 self.installEventFilter(self)
def moveEvent(self, event)
Move tutorial dialogs also (if any)
def actionProperties_trigger(self, event)
def addSelection(self, item_id, item_type, clear_existing=False)
def actionThumbnailView_trigger(self, event)
def setup_icon(window, elem, name, theme_name=None)
Using the window xml, set the icon on the given element, or if theme_name passed load that icon...
def actionTitle_trigger(self, event)
def actionPreferences_trigger(self, event)
def actionAddTrack_trigger(self, event)
def actionRemove_from_Project_trigger(self, event)
def get_app()
Returns the current QApplication instance of OpenShot.
def updateStatusChanged(self, undo_status, redo_status)
Easily be notified each time there are 'undo' or 'redo' actions available in the UpdateManager.
def resize_contents(self)
def addDocks(self, docks, area)
Add all dockable widgets to the same dock area on the main screen.
def actionExportVideo_trigger(self, event)
def actionDonate_trigger(self, event)
def actionRedo_trigger(self, event)
def actionRemoveTransition_trigger(self, event)
def actionSnappingTool_trigger(self, event)
def actionUnlockTrack_trigger(self, event)
Callback for unlocking a track.
def actionTransitionsShowCommon_trigger(self, event)
def actionUndo_trigger(self, event)
def freezeDocks(self)
Freeze all dockable widgets on the main screen (no float, moving, or closing)
def track_metric_session(is_start=True)
Track a GUI screen being shown.
def actionImportImageSequence_trigger(self, event)
def actionFilesShowImage_trigger(self, event)
def actionRemoveTrack_trigger(self, event)
def InitKeyboardShortcuts(self)
Initialize all keyboard shortcuts from the settings file.
def actionUploadVideo_trigger(self, event)
def actionAdd_to_Timeline_trigger(self, event)
def actionFullscreen_trigger(self, event)
def get_current_Version()
Get the current version.
def actionAddTrackAbove_trigger(self, event)
def actionFile_Properties_trigger(self, event)
def actionSave_trigger(self, event)
def actionArrowTool_trigger(self, event)
def getAllKeyboardShortcuts(self)
Get a key sequence back from the setting name.
def actionRemoveMarker_trigger(self, event)
def keyPressEvent(self, event)
Process key press events and match with known shortcuts.
def actionPreview_File_trigger(self, event)
Preview the selected media file.
def actionRewind_trigger(self, event)
def actionNew_trigger(self, event)
def load_recent_menu(self)
Clear and load the list of recent menu items.
def actionOpen_trigger(self, event)
def actionLockTrack_trigger(self, event)
Callback for locking a track.
def str_to_bytes(string)
This is required to save Qt byte arrays into a base64 string (to save screen preferences) ...
def actionUn_Freeze_View_trigger(self, event)
Un-Freeze all dockable widgets on the main screen.
def create_lock_file(self)
Create a lock file.
def save_project(self, file_path)
Save a project to a file path, and refresh the screen.
def actionTimelineZoomIn_trigger(self, event)
def actionTransitionsShowAll_trigger(self, event)
def actionFreeze_View_trigger(self, event)
Freeze all dockable widgets on the main screen.
def eventFilter(self, object, e)
Filter out certain types of window events.
def unFreezeDocks(self)
Un-freeze all dockable widgets on the main screen (allow them to be moved, closed, and floated)
def actionAbout_trigger(self, event)
Show about dialog.
def floatDocks(self, is_floating)
Float or Un-Float all dockable widgets above main screen.
def clearSelections(self)
Clear all selection containers.
def actionReportBug_trigger(self, event)
def actionHelpContents_trigger(self, event)
def actionTutorial_trigger(self, event)
Show tutorial again.
def actionRenameTrack_trigger(self, event)
Callback for renaming track.
def removeDocks(self)
Remove all dockable widgets on main screen.
def showDocks(self, docks)
Show all dockable widgets on the main screen.
def actionEffectsShowAudio_trigger(self, event)
def actionUpdate_trigger(self, event)
def auto_save_project(self)
Auto save the project.
def bytes_to_str(bytes)
This is required to load base64 Qt byte array strings into a Qt byte array (to load screen preference...
def actionFilesShowVideo_trigger(self, event)
def actionEffectsShowVideo_trigger(self, event)
def foundCurrentVersion(self, version)
Handle the callback for detecting the current version on openshot.org.
def actionDetailsView_trigger(self, event)
def actionFilesShowAll_trigger(self, event)
def actionAnimation_trigger(self, event)
def previewFrame(self, position_seconds, position_frames, time_code)
Preview a specific frame.
def actionProfile_trigger(self, event)
def hideDocks(self)
Hide all dockable widgets on the main screen.
def actionAskQuestion_trigger(self, event)
def recent_project_clicked(self, file_path)
Load a recent project when clicked.
def get_settings()
Get the current QApplication's settings instance.
def actionSimple_View_trigger(self, event)
Switch to the default / simple view.
def actionAdvanced_View_trigger(self, event)
Switch to an alternative view.
def clear_all_thumbnails(self)
Clear all user thumbnails.
def SetWindowTitle(self, profile=None)
Set the window title based on a variety of factors.
Interface for classes that listen for 'undo' and 'redo' events.
def actionNextMarker_trigger(self, event)
def actionEffectsShowAll_trigger(self, event)
def actionAddMarker_trigger(self, event)
def movePlayhead(self, position_frames)
Update playhead position.
def actionRemoveClip_trigger(self, event)
def init_ui(window)
Initialize all child widgets and action of a window or dialog.
def recover_backup(self)
Recover the backup file (if any)
def destroy_lock_file(self)
Destroy the lock file.
def getShortcutByName(self, setting_name)
Get a key sequence back from the setting name.
This class contains the logic for the main window widget.
def track_metric_screen(screen_name)
Track a GUI screen being shown.
def actionPreviousMarker_trigger(self, event)
def updateStatusChanged(self, undo_status, redo_status)
def actionAddTrackBelow_trigger(self, event)
def open_project(self, file_path, clear_thumbnails=True)
Open a project from a file path, and refresh the screen.
def actionSaveAs_trigger(self, event)
def track_metric_error(error_name, is_fatal=False)
Track an error has occurred.
def removeSelection(self, item_id, item_type)
def actionRemoveEffect_trigger(self, event)
def actionTranslate_trigger(self, event)
def actionPlay_trigger(self, event, force=None)
def actionFastForward_trigger(self, event)
def actionFilesShowAudio_trigger(self, event)
def load_ui(window, path)
Load a Qt *.ui file, and also load an XML parsed version.
def actionTimelineZoomOut_trigger(self, event)
def actionShow_All_trigger(self, event)
Show all dockable widgets.
def actionAnimatedTitle_trigger(self, event)
Interface for classes that listen for changes (insert, update, and delete).
def actionJumpEnd_trigger(self, event)
def actionSplitClip_trigger(self, event)
def closeEvent(self, event)
def getDocks(self)
Get a list of all dockable widgets.
def actionImportFiles_trigger(self, event)
def actionJumpStart_trigger(self, event)