31
31
32
32
from PyQt5 .QtCore import pyqtSignal , QTimer
33
33
from PyQt5 .QtWidgets import QDialog , QMessageBox , QSizePolicy
34
+ from PyQt5 .QtCore import Qt
34
35
import openshot # Python module for libopenshot (required video editing module installed separately)
35
36
36
37
from classes import info , ui_util , time_parts
@@ -72,11 +73,6 @@ def __init__(self, file=None, preview=False):
72
73
# Track metrics
73
74
track_metric_screen ("cutting-screen" )
74
75
75
- self .start_frame = 1
76
- self .start_image = None
77
- self .end_frame = 1
78
- self .end_image = None
79
-
80
76
# Keep track of file object
81
77
self .file = file
82
78
self .file_path = file .absolute_path ()
@@ -90,17 +86,26 @@ def __init__(self, file=None, preview=False):
90
86
self .channels = int (file .data ['channels' ])
91
87
self .channel_layout = int (file .data ['channel_layout' ])
92
88
89
+ self .start_frame = 1
90
+ self .start_image = None
91
+ self .end_frame = self .video_length
92
+ self .end_image = None
93
+
93
94
# If preview, hide cutting controls
94
95
if preview :
95
96
self .lblInstructions .setVisible (False )
96
97
self .widgetControls .setVisible (False )
97
98
self .setWindowTitle (_ ("Preview" ))
98
99
99
- if float (file .data .get ("start" , 0.0 )) > 0.0 :
100
- self .start_frame = round (file .data .get ("start" , 0 ) * self .fps ) + 1
101
- if float (file .data .get ("end" , 0.0 )) > 0.0 :
102
- self .end_frame = round (file .data .get ("end" , 0 ) * self .fps )
103
- self .video_length = (self .end_frame - self .start_frame ) + 1
100
+ if float (file .data .get ("start" , 0.0 )) > 0.0 :
101
+ self .start_frame = round (file .data .get ("start" , 0 ) * self .fps ) + 1
102
+ if float (file .data .get ("end" , 0.0 )) > 0.0 :
103
+ self .end_frame = round (file .data .get ("end" , 0 ) * self .fps )
104
+ self .video_length = (self .end_frame - self .start_frame ) + 1
105
+
106
+ # Set clip start / end
107
+ clip_start = file .data .get ("start" , 0.0 )
108
+ clip_end = file .data .get ("end" , file .data .get ("duration" , 0.0 ))
104
109
105
110
# Open video file with Reader
106
111
log .info (self .file_path )
@@ -128,6 +133,8 @@ def __init__(self, file=None, preview=False):
128
133
# Add clip for current preview file
129
134
self .clip = openshot .Clip (self .file_path )
130
135
self .clip .SetJson (json .dumps ({"reader" : file .data }))
136
+ self .clip .Start (clip_start )
137
+ self .clip .End (clip_end )
131
138
132
139
# Show waveform for audio files
133
140
if not self .clip .Reader ().info .has_video and self .clip .Reader ().info .has_audio :
@@ -139,11 +146,10 @@ def __init__(self, file=None, preview=False):
139
146
# Update video_length property of the Timeline object
140
147
self .r .info .video_length = self .video_length
141
148
142
- if preview :
143
- # Display frame #'s during preview
144
- self .clip .display = openshot .FRAME_DISPLAY_CLIP
145
-
149
+ # Display frame #
150
+ self .clip .display = openshot .FRAME_DISPLAY_CLIP
146
151
self .r .AddClip (self .clip )
152
+
147
153
except Exception :
148
154
log .error (
149
155
'Failed to load media file into preview player: %s' ,
@@ -169,8 +175,8 @@ def __init__(self, file=None, preview=False):
169
175
self .sliderVideo .setPageStep (24 )
170
176
171
177
# Display start frame (and then the previous frame)
172
- QTimer .singleShot (500 , functools .partial (self .sliderVideo .setValue , self . start_frame + 1 ))
173
- QTimer .singleShot (600 , functools .partial (self .sliderVideo .setValue , self . start_frame ))
178
+ QTimer .singleShot (500 , functools .partial (self .sliderVideo .setValue , 2 ))
179
+ QTimer .singleShot (600 , functools .partial (self .sliderVideo .setValue , 1 ))
174
180
175
181
# Connect signals
176
182
self .actionPlay .triggered .connect (self .actionPlay_Triggered )
@@ -180,8 +186,17 @@ def __init__(self, file=None, preview=False):
180
186
self .btnEnd .clicked .connect (self .btnEnd_clicked )
181
187
self .btnClear .clicked .connect (self .btnClear_clicked )
182
188
self .btnAddClip .clicked .connect (self .btnAddClip_clicked )
189
+ self .txtName .installEventFilter (self )
183
190
self .initialized = True
184
191
192
+ def eventFilter (self , source , event ):
193
+ if event .type () == event .KeyPress and source is self .txtName :
194
+ if event .key () == Qt .Key_Return or event .key () == Qt .Key_Enter :
195
+ if self .btnAddClip .isEnabled ():
196
+ self .btnAddClip_clicked ()
197
+ return True
198
+ return super ().eventFilter (source , event )
199
+
185
200
def actionPlay_Triggered (self ):
186
201
# Trigger play button (This action is invoked from the preview thread, so it must exist here)
187
202
self .btnPlay .click ()
@@ -340,16 +355,22 @@ def btnAddClip_clicked(self):
340
355
if 'name' in self .file .data :
341
356
self .file .data .pop ('name' )
342
357
358
+ # Get initial start / end properties (if any)
359
+ previous_start = self .file .data .get ("start" , 0.0 )
360
+
343
361
# Save new file
344
362
self .file .id = None
345
363
self .file .key = None
346
364
self .file .type = 'insert'
347
- self .file .data ['start' ] = ( self .start_frame - 1 ) / self .fps
348
- self .file .data ['end' ] = self .end_frame / self .fps
365
+ self .file .data ['start' ] = previous_start + (( self .start_frame - 1 ) / self .fps )
366
+ self .file .data ['end' ] = previous_start + ( self .end_frame / self .fps )
349
367
if self .txtName .text ():
350
368
self .file .data ['name' ] = self .txtName .text ()
351
369
self .file .save ()
352
370
371
+ # Move to next frame
372
+ self .sliderVideo .setValue (self .end_frame + 1 )
373
+
353
374
# Reset form
354
375
self .clearForm ()
355
376
0 commit comments