47
47
from classes .app import get_app
48
48
from classes .logger import log
49
49
from classes .timeline import TimelineSync
50
- from classes .query import File , Clip , Transition , Marker , Track
51
- from classes .metrics import *
52
- from classes .version import *
50
+ from classes .query import Clip , Transition , Marker , Track
51
+ from classes .metrics import (
52
+ track_metric_session , track_metric_screen ,
53
+ track_metric_error , track_exception_stacktrace ,
54
+ )
55
+ from classes .version import get_current_Version
53
56
from classes .conversion import zoomToSeconds , secondsToZoom
54
57
from classes .thumbnail import httpThumbnailServerThread
55
58
from windows .models .files_model import FilesModel
@@ -756,7 +759,7 @@ def promptImageSequence(self, filename=None):
756
759
else :
757
760
return False
758
761
759
- def actionAdd_to_Timeline_trigger (self , event ):
762
+ def actionAdd_to_Timeline_trigger (self , checked = False ):
760
763
# Loop through selected files
761
764
files = self .selected_files ()
762
765
@@ -779,7 +782,7 @@ def actionAdd_to_Timeline_trigger(self, event):
779
782
else :
780
783
log .info ('canceled' )
781
784
782
- def actionExportVideo_trigger (self , event ):
785
+ def actionExportVideo_trigger (self , checked = True ):
783
786
# show window
784
787
from windows .export import Export
785
788
win = Export ()
@@ -790,37 +793,37 @@ def actionExportVideo_trigger(self, event):
790
793
else :
791
794
log .info ('Export Video add cancelled' )
792
795
793
- def actionExportEDL_trigger (self , event ):
796
+ def actionExportEDL_trigger (self , checked = True ):
794
797
"""Export EDL File"""
795
798
export_edl ()
796
799
797
- def actionExportFCPXML_trigger (self , event ):
800
+ def actionExportFCPXML_trigger (self , checked = True ):
798
801
"""Export XML (Final Cut Pro) File"""
799
802
export_xml ()
800
803
801
- def actionImportEDL_trigger (self , event ):
804
+ def actionImportEDL_trigger (self , checked = True ):
802
805
"""Import EDL File"""
803
806
import_edl ()
804
807
805
- def actionImportFCPXML_trigger (self , event ):
808
+ def actionImportFCPXML_trigger (self , checked = True ):
806
809
"""Import XML (Final Cut Pro) File"""
807
810
import_xml ()
808
811
809
- def actionUndo_trigger (self , event ):
812
+ def actionUndo_trigger (self , checked = True ):
810
813
log .info ('actionUndo_trigger' )
811
814
get_app ().updates .undo ()
812
815
813
816
# Update the preview
814
817
self .refreshFrameSignal .emit ()
815
818
816
- def actionRedo_trigger (self , event ):
819
+ def actionRedo_trigger (self , checked = True ):
817
820
log .info ('actionRedo_trigger' )
818
821
get_app ().updates .redo ()
819
822
820
823
# Update the preview
821
824
self .refreshFrameSignal .emit ()
822
825
823
- def actionPreferences_trigger (self , event ):
826
+ def actionPreferences_trigger (self , checked = True ):
824
827
# Stop preview thread
825
828
self .SpeedSignal .emit (0 )
826
829
ui_util .setup_icon (self , self .actionPlay , "actionPlay" , "media-playback-start" )
@@ -846,74 +849,74 @@ def actionPreferences_trigger(self, event):
846
849
# Restore normal cursor
847
850
get_app ().restoreOverrideCursor ()
848
851
849
- def actionFilesShowAll_trigger (self , event ):
852
+ def actionFilesShowAll_trigger (self , checked = True ):
850
853
self .refreshFilesSignal .emit ()
851
854
852
- def actionFilesShowVideo_trigger (self , event ):
855
+ def actionFilesShowVideo_trigger (self , checked = True ):
853
856
self .refreshFilesSignal .emit ()
854
857
855
- def actionFilesShowAudio_trigger (self , event ):
858
+ def actionFilesShowAudio_trigger (self , checked = True ):
856
859
self .refreshFilesSignal .emit ()
857
860
858
- def actionFilesShowImage_trigger (self , event ):
861
+ def actionFilesShowImage_trigger (self , checked = True ):
859
862
self .refreshFilesSignal .emit ()
860
863
861
- def actionTransitionsShowAll_trigger (self , event ):
864
+ def actionTransitionsShowAll_trigger (self , checked = True ):
862
865
self .refreshTransitionsSignal .emit ()
863
866
864
- def actionTransitionsShowCommon_trigger (self , event ):
867
+ def actionTransitionsShowCommon_trigger (self , checked = True ):
865
868
self .refreshTransitionsSignal .emit ()
866
869
867
- def actionHelpContents_trigger (self , event ):
870
+ def actionHelpContents_trigger (self , checked = True ):
868
871
try :
869
872
webbrowser .open ("https://www.openshot.org/%suser-guide/?app-menu" % info .website_language (), new = 1 )
870
873
except Exception as ex :
871
874
QMessageBox .information (self , "Error !" , "Unable to open the online help" )
872
875
log .error ("Unable to open the Help Contents: {}" .format (str (ex )))
873
876
874
- def actionAbout_trigger (self , event ):
877
+ def actionAbout_trigger (self , checked = True ):
875
878
"""Show about dialog"""
876
879
from windows .about import About
877
880
win = About ()
878
881
# Run the dialog event loop - blocking interaction on this window during this time
879
882
win .exec_ ()
880
883
881
- def actionReportBug_trigger (self , event ):
884
+ def actionReportBug_trigger (self , checked = True ):
882
885
try :
883
886
webbrowser .open ("https://www.openshot.org/%sissues/new/?app-menu" % info .website_language (), new = 1 )
884
887
except Exception as ex :
885
888
QMessageBox .information (self , "Error !" , "Unable to open the Bug Report GitHub Issues web page" )
886
889
log .error ("Unable to open the Bug Report page: {}" .format (str (ex )))
887
890
888
- def actionAskQuestion_trigger (self , event ):
891
+ def actionAskQuestion_trigger (self , checked = True ):
889
892
try :
890
893
webbrowser .open ("https://www.reddit.com/r/OpenShot/" , new = 1 )
891
894
except Exception as ex :
892
895
QMessageBox .information (self , "Error !" , "Unable to open the official OpenShot subreddit web page" )
893
896
log .error ("Unable to open the subreddit page: {}" .format (str (ex )))
894
897
895
- def actionTranslate_trigger (self , event ):
898
+ def actionTranslate_trigger (self , checked = True ):
896
899
try :
897
900
webbrowser .open ("https://translations.launchpad.net/openshot/2.0" , new = 1 )
898
901
except Exception as ex :
899
902
QMessageBox .information (self , "Error !" , "Unable to open the Translation web page" )
900
903
log .error ("Unable to open the translation page: {}" .format (str (ex )))
901
904
902
- def actionDonate_trigger (self , event ):
905
+ def actionDonate_trigger (self , checked = True ):
903
906
try :
904
907
webbrowser .open ("https://www.openshot.org/%sdonate/?app-menu" % info .website_language (), new = 1 )
905
908
except Exception as ex :
906
909
QMessageBox .information (self , "Error !" , "Unable to open the Donate web page" )
907
910
log .error ("Unable to open the donation page: {}" .format (str (ex )))
908
911
909
- def actionUpdate_trigger (self , event ):
912
+ def actionUpdate_trigger (self , checked = True ):
910
913
try :
911
914
webbrowser .open ("https://www.openshot.org/%sdownload/?app-toolbar" % info .website_language (), new = 1 )
912
915
except Exception as ex :
913
916
QMessageBox .information (self , "Error !" , "Unable to open the Download web page" )
914
917
log .error ("Unable to open the download page: {}" .format (str (ex )))
915
918
916
- def actionPlay_trigger (self , event , force = None ):
919
+ def actionPlay_trigger (self , checked , force = None ):
917
920
918
921
# Determine max frame (based on clips)
919
922
timeline_length = 0.0
@@ -941,7 +944,7 @@ def actionPlay_trigger(self, event, force=None):
941
944
ui_util .setup_icon (self , self .actionPlay , "actionPlay" ) # to default
942
945
self .PauseSignal .emit ()
943
946
944
- def actionPreview_File_trigger (self , event ):
947
+ def actionPreview_File_trigger (self , checked = True ):
945
948
""" Preview the selected media file """
946
949
log .info ('actionPreview_File_trigger' )
947
950
@@ -979,7 +982,7 @@ def SetPlayheadFollow(self, enable_follow):
979
982
""" Enable / Disable follow mode """
980
983
self .timeline .SetPlayheadFollow (enable_follow )
981
984
982
- def actionFastForward_trigger (self , event ):
985
+ def actionFastForward_trigger (self , checked = True ):
983
986
984
987
# Get the video player object
985
988
player = self .preview_thread .player
@@ -992,7 +995,7 @@ def actionFastForward_trigger(self, event):
992
995
if player .Mode () == openshot .PLAYBACK_PAUSED :
993
996
self .actionPlay .trigger ()
994
997
995
- def actionRewind_trigger (self , event ):
998
+ def actionRewind_trigger (self , checked = True ):
996
999
997
1000
# Get the video player object
998
1001
player = self .preview_thread .player
@@ -1005,13 +1008,13 @@ def actionRewind_trigger(self, event):
1005
1008
if player .Mode () == openshot .PLAYBACK_PAUSED :
1006
1009
self .actionPlay .trigger ()
1007
1010
1008
- def actionJumpStart_trigger (self , event ):
1011
+ def actionJumpStart_trigger (self , checked = True ):
1009
1012
log .info ("actionJumpStart_trigger" )
1010
1013
1011
1014
# Seek to the 1st frame
1012
1015
self .SeekSignal .emit (1 )
1013
1016
1014
- def actionJumpEnd_trigger (self , event ):
1017
+ def actionJumpEnd_trigger (self , checked = True ):
1015
1018
log .info ("actionJumpEnd_trigger" )
1016
1019
1017
1020
# Determine max frame (based on clips)
@@ -1030,7 +1033,7 @@ def actionJumpEnd_trigger(self, event):
1030
1033
# Seek to the 1st frame
1031
1034
self .SeekSignal .emit (timeline_length_int )
1032
1035
1033
- def actionSaveFrame_trigger (self , event ):
1036
+ def actionSaveFrame_trigger (self , checked = True ):
1034
1037
log .info ("actionSaveFrame_trigger" )
1035
1038
1036
1039
# Translate object
@@ -1185,7 +1188,7 @@ def renumber_all_layers(self, insert_at=None, stride=1000000):
1185
1188
" (inserted {} at {})" .format (insert_num , insert_at ) if insert_at else "" )
1186
1189
)
1187
1190
1188
- def actionAddTrack_trigger (self , event ):
1191
+ def actionAddTrack_trigger (self , checked = True ):
1189
1192
log .info ("actionAddTrack_trigger" )
1190
1193
1191
1194
# Get # of tracks
@@ -1198,7 +1201,7 @@ def actionAddTrack_trigger(self, event):
1198
1201
track .data = {"number" : track_number , "y" : 0 , "label" : "" , "lock" : False }
1199
1202
track .save ()
1200
1203
1201
- def actionAddTrackAbove_trigger (self , event ):
1204
+ def actionAddTrackAbove_trigger (self , checked = True ):
1202
1205
# Get selected track
1203
1206
all_tracks = get_app ().project .get ("layers" )
1204
1207
selected_layer_id = self .selected_tracks [0 ]
@@ -1245,7 +1248,7 @@ def actionAddTrackAbove_trigger(self, event):
1245
1248
# Temporarily for debugging
1246
1249
log .info ("Tracks after: {}" .format ([{x ['number' ]: x ['id' ]} for x in reversed (tracks )]))
1247
1250
1248
- def actionAddTrackBelow_trigger (self , event ):
1251
+ def actionAddTrackBelow_trigger (self , checked = True ):
1249
1252
# Get selected track
1250
1253
all_tracks = get_app ().project .get ("layers" )
1251
1254
selected_layer_id = self .selected_tracks [0 ]
@@ -1295,23 +1298,23 @@ def actionAddTrackBelow_trigger(self, event):
1295
1298
# Temporarily for debugging
1296
1299
log .info ("Tracks after: {}" .format ([{x ['number' ]: x ['id' ]} for x in reversed (tracks )]))
1297
1300
1298
- def actionArrowTool_trigger (self , event ):
1301
+ def actionArrowTool_trigger (self , checked = True ):
1299
1302
log .info ("actionArrowTool_trigger" )
1300
1303
1301
- def actionSnappingTool_trigger (self , event ):
1304
+ def actionSnappingTool_trigger (self , checked = True ):
1302
1305
log .info ("actionSnappingTool_trigger" )
1303
1306
1304
1307
# Enable / Disable snapping mode
1305
1308
self .timeline .SetSnappingMode (self .actionSnappingTool .isChecked ())
1306
1309
1307
- def actionRazorTool_trigger (self , event ):
1310
+ def actionRazorTool_trigger (self , checked = True ):
1308
1311
"""Toggle razor tool on and off"""
1309
1312
log .info ('actionRazorTool_trigger' )
1310
1313
1311
1314
# Enable / Disable razor mode
1312
- self .timeline .SetRazorMode (self . actionRazorTool . isChecked () )
1315
+ self .timeline .SetRazorMode (checked )
1313
1316
1314
- def actionAddMarker_trigger (self , event ):
1317
+ def actionAddMarker_trigger (self , checked = True ):
1315
1318
log .info ("actionAddMarker_trigger" )
1316
1319
1317
1320
# Get player object
@@ -1329,7 +1332,6 @@ def actionAddMarker_trigger(self, event):
1329
1332
marker .data = {"position" : position , "icon" : "blue.png" }
1330
1333
marker .save ()
1331
1334
1332
-
1333
1335
def findAllMarkerPositions (self ):
1334
1336
"""Build and return a list of all seekable locations for the currently-selected timeline elements"""
1335
1337
@@ -1349,31 +1351,36 @@ def getTimelineObjectPositions(obj):
1349
1351
positions .append (clip_stop_time )
1350
1352
1351
1353
# add all keyframes
1352
- for property in obj .data :
1353
- try :
1354
- for point in obj .data [property ]["Points" ] :
1354
+ for property in obj .data :
1355
+ try :
1356
+ for point in obj .data [property ]["Points" ]:
1355
1357
keyframe_time = (point ["co" ]["X" ]- 1 )/ fps_float - obj .data ["start" ] + obj .data ["position" ]
1356
- if keyframe_time > clip_start_time and keyframe_time < clip_stop_time :
1358
+ if clip_start_time < keyframe_time < clip_stop_time :
1357
1359
positions .append (keyframe_time )
1358
1360
except (TypeError , KeyError ):
1359
1361
pass
1360
1362
1361
-
1362
1363
# Add all Effect keyframes
1363
1364
if "effects" in obj .data :
1364
1365
for effect_data in obj .data ["effects" ]:
1365
1366
for property in effect_data :
1366
1367
try :
1367
1368
for point in effect_data [property ]["Points" ]:
1368
1369
keyframe_time = (point ["co" ]["X" ]- 1 )/ fps_float + clip_orig_time
1369
- if keyframe_time > clip_start_time and keyframe_time < clip_stop_time :
1370
+ if clip_start_time < keyframe_time < clip_stop_time :
1370
1371
positions .append (keyframe_time )
1371
1372
except (TypeError , KeyError ):
1372
1373
pass
1373
1374
1374
1375
return positions
1375
1376
1376
- all_marker_positions = []
1377
+ # We can always jump to the beginning of the timeline
1378
+ all_marker_positions = [0 ]
1379
+
1380
+ # If nothing is selected, also add the end of the last clip
1381
+ if not self .selected_clips + self .selected_transitions :
1382
+ all_marker_positions .append (
1383
+ get_app ().window .timeline_sync .timeline .GetMaxTime ())
1377
1384
1378
1385
# Get list of marker and important positions (like selected clip bounds)
1379
1386
for marker in Marker .filter ():
@@ -1398,7 +1405,7 @@ def getTimelineObjectPositions(obj):
1398
1405
1399
1406
return all_marker_positions
1400
1407
1401
- def actionPreviousMarker_trigger (self , event ):
1408
+ def actionPreviousMarker_trigger (self , checked = True ):
1402
1409
log .info ("actionPreviousMarker_trigger" )
1403
1410
1404
1411
# Calculate current position (in seconds)
@@ -1430,7 +1437,7 @@ def actionPreviousMarker_trigger(self, event):
1430
1437
get_app ().window .refreshFrameSignal .emit ()
1431
1438
get_app ().window .propertyTableView .select_frame (frame_to_seek )
1432
1439
1433
- def actionNextMarker_trigger (self , event ):
1440
+ def actionNextMarker_trigger (self , checked = True ):
1434
1441
log .info ("actionNextMarker_trigger" )
1435
1442
1436
1443
# Calculate current position (in seconds)
@@ -1462,7 +1469,7 @@ def actionNextMarker_trigger(self, event):
1462
1469
get_app ().window .refreshFrameSignal .emit ()
1463
1470
get_app ().window .propertyTableView .select_frame (frame_to_seek )
1464
1471
1465
- def actionCenterOnPlayhead_trigger (self , event ):
1472
+ def actionCenterOnPlayhead_trigger (self , checked = True ):
1466
1473
""" Center the timeline on the current playhead position """
1467
1474
self .timeline .centerOnPlayhead ()
1468
1475
0 commit comments