38 from classes
import info, ui_util, settings, qt_types, updates
39 from classes.app
import get_app
40 from classes.logger
import log
42 from windows.preview_thread
import PreviewParent
43 from windows.video_widget
import VideoWidget
48 import simplejson
as json
56 ui_path = os.path.join(info.PATH,
'windows',
'ui',
'cutting.ui')
59 previewFrameSignal = pyqtSignal(int)
60 refreshFrameSignal = pyqtSignal()
61 LoadFileSignal = pyqtSignal(str)
62 PlaySignal = pyqtSignal(int)
63 PauseSignal = pyqtSignal()
64 SeekSignal = pyqtSignal(int)
65 SpeedSignal = pyqtSignal(float)
66 StopSignal = pyqtSignal()
72 QDialog.__init__(self)
85 self.lblInstructions.setVisible(
False)
86 self.widgetControls.setVisible(
False)
87 self.setWindowTitle(_(
"Preview"))
98 self.
fps_num = int(file.data[
'fps'][
'num'])
99 self.
fps_den = int(file.data[
'fps'][
'den'])
101 self.
width = int(file.data[
'width'])
119 if not self.clip.Reader().info.has_video
and self.clip.Reader().info.has_audio:
120 self.clip.Waveform(
True)
123 self.r.info.has_audio = self.clip.Reader().info.has_audio
127 self.clip.display = openshot.FRAME_DISPLAY_CLIP
129 self.r.AddClip(self.
clip)
131 log.error(
'Failed to load media file into preview player: %s' % self.
file_path)
136 self.videoPreview.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
140 viewport_rect = self.videoPreview.centeredViewport(self.videoPreview.width(), self.videoPreview.height())
141 self.r.SetMaxSize(viewport_rect.width(), viewport_rect.height())
155 self.sliderVideo.setMinimum(1)
157 self.sliderVideo.setSingleStep(1)
158 self.sliderVideo.setSingleStep(1)
159 self.sliderVideo.setPageStep(24)
163 if 'start' in self.file.data.keys():
164 start_frame = (float(self.file.data[
'start']) * self.
fps) + 1
167 QTimer.singleShot(500, functools.partial(self.sliderVideo.setValue, start_frame + 1))
168 QTimer.singleShot(600, functools.partial(self.sliderVideo.setValue, start_frame))
190 self.sliderVideo.setValue(frame_number)
194 seconds = (frame_number-1) / self.
fps
198 timestamp =
"%s:%s:%s:%s" % (time_text[
"hour"], time_text[
"min"], time_text[
"sec"], time_text[
"frame"])
201 self.lblVideoTime.setText(timestamp)
204 log.info(
"btnPlay_clicked")
207 self.btnPlay.setChecked(
False)
208 elif force ==
"play":
209 self.btnPlay.setChecked(
True)
211 if self.btnPlay.isChecked():
212 log.info(
'play (icon to pause)')
216 log.info(
'pause (icon to play)')
218 self.preview_thread.Pause()
221 self.sliderVideo.setFocus()
225 log.info(
'sliderVideo_valueChanged')
231 self.preview_thread.previewFrame(new_frame)
242 current_frame = self.sliderVideo.value()
245 if self.btnEnd.isEnabled()
and current_frame >= self.
end_frame:
248 msg.setText(_(
"Please choose valid 'start' and 'end' values for your clip."))
260 self.btnStart.setStyleSheet(
'background-image: url(%s);' % self.start_image.replace(
'\\',
'/'))
263 self.btnEnd.setEnabled(
True)
264 self.btnClear.setEnabled(
True)
267 self.sliderVideo.setFocus()
269 log.info(
'btnStart_clicked, current frame: %s' % self.
start_frame)
280 current_frame = self.sliderVideo.value()
286 msg.setText(_(
"Please choose valid 'start' and 'end' values for your clip."))
295 self.r.GetFrame(self.
end_frame).Thumbnail(self.
end_image, 160, 90,
'',
'',
'#000000',
True)
298 self.btnEnd.setStyleSheet(
'background-image: url(%s);' % self.end_image.replace(
'\\',
'/'))
301 self.btnAddClip.setEnabled(
True)
304 self.sliderVideo.setFocus()
306 log.info(
'btnEnd_clicked, current frame: %s' % self.
end_frame)
311 log.info(
'btnClear_clicked')
324 self.btnStart.setStyleSheet(
'background-image: None;')
325 self.btnEnd.setStyleSheet(
'background-image: None;')
328 self.txtName.setText(
'')
331 self.btnEnd.setEnabled(
False)
332 self.btnAddClip.setEnabled(
False)
333 self.btnClear.setEnabled(
False)
338 log.info(
'btnAddClip_clicked')
341 if 'name' in self.file.data.keys():
342 self.file.data.pop(
'name')
347 self.file.type =
'insert'
350 if self.txtName.text():
351 self.file.data[
'name'] = self.txtName.text()
358 format_mask =
'%%0%sd' % pad_length
359 return format_mask % value
363 milliseconds = secs * 1000
364 sec = math.floor(milliseconds/1000)
365 milli = milliseconds % 1000
366 min = math.floor(sec/60)
368 hour = math.floor(min/60)
370 day = math.floor(hour/24)
372 week = math.floor(day/7)
375 frame = round((milli / 1000.0) * (fps_num / fps_den)) + 1
376 return {
"week":self.
padNumber(week,2),
"day":self.
padNumber(day,2),
"hour":self.
padNumber(hour,2),
"min":self.
padNumber(min,2),
"sec":self.
padNumber(sec,2),
"milli":self.
padNumber(milli,2),
"frame":self.
padNumber(frame,2) };
390 log.info(
'closeEvent')
393 self.preview_parent.worker.Stop()
396 self.preview_parent.worker.kill()
397 self.preview_parent.background.exit()
398 self.preview_parent.background.wait(5000)
403 self.r.ClearAllCache()
def movePlayhead
Update the playhead position.
def track_metric_screen
Track a GUI screen being shown.
def get_app
Returns the current QApplication instance of OpenShot.
def setup_icon
Using the window xml, set the icon on the given element, or if theme_name passed load that icon...
def btnEnd_clicked
End of clip button was clicked.
def close
Actually close window and accept dialog.
def load_ui
Load a Qt *.ui file, and also load an XML parsed version.
def sliderVideo_valueChanged
def accept
Ok button clicked.
def clearForm
Clear all form controls.
def init_ui
Initialize all child widgets and action of a window or dialog.
def btnClear_clicked
Clear the current clip and reset the form.
def btnStart_clicked
Start of clip button was clicked.
def btnAddClip_clicked
Add the selected clip to the project.