Skip to content

Commit

Permalink
Fixing lots of regressions with Preview / Split Clip dialog:
Browse files Browse the repository at this point in the history
- Preview should always start at the beginning
- Both split and preview should respect previous split start/end
- Both split and preview should display frame #
- After typing clip name, Enter key should create clip
- After clip is created, frame # should increment by 1
  • Loading branch information
jonoomph committed Jun 22, 2024
1 parent a9c348c commit 86e6f08
Showing 1 changed file with 39 additions and 18 deletions.
57 changes: 39 additions & 18 deletions src/windows/cutting.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@

from PyQt5.QtCore import pyqtSignal, QTimer
from PyQt5.QtWidgets import QDialog, QMessageBox, QSizePolicy
from PyQt5.QtCore import Qt
import openshot # Python module for libopenshot (required video editing module installed separately)

from classes import info, ui_util, time_parts
Expand Down Expand Up @@ -72,11 +73,6 @@ def __init__(self, file=None, preview=False):
# Track metrics
track_metric_screen("cutting-screen")

self.start_frame = 1
self.start_image = None
self.end_frame = 1
self.end_image = None

# Keep track of file object
self.file = file
self.file_path = file.absolute_path()
Expand All @@ -90,17 +86,26 @@ def __init__(self, file=None, preview=False):
self.channels = int(file.data['channels'])
self.channel_layout = int(file.data['channel_layout'])

self.start_frame = 1
self.start_image = None
self.end_frame = self.video_length
self.end_image = None

# If preview, hide cutting controls
if preview:
self.lblInstructions.setVisible(False)
self.widgetControls.setVisible(False)
self.setWindowTitle(_("Preview"))

if float(file.data.get("start", 0.0)) > 0.0:
self.start_frame = round(file.data.get("start", 0) * self.fps) + 1
if float(file.data.get("end", 0.0)) > 0.0:
self.end_frame = round(file.data.get("end", 0) * self.fps)
self.video_length = (self.end_frame - self.start_frame) + 1
if float(file.data.get("start", 0.0)) > 0.0:
self.start_frame = round(file.data.get("start", 0) * self.fps) + 1
if float(file.data.get("end", 0.0)) > 0.0:
self.end_frame = round(file.data.get("end", 0) * self.fps)
self.video_length = (self.end_frame - self.start_frame) + 1

# Set clip start / end
clip_start = file.data.get("start", 0.0)
clip_end = file.data.get("end", file.data.get("duration", 0.0))

# Open video file with Reader
log.info(self.file_path)
Expand Down Expand Up @@ -128,6 +133,8 @@ def __init__(self, file=None, preview=False):
# Add clip for current preview file
self.clip = openshot.Clip(self.file_path)
self.clip.SetJson(json.dumps({"reader": file.data}))
self.clip.Start(clip_start)
self.clip.End(clip_end)

# Show waveform for audio files
if not self.clip.Reader().info.has_video and self.clip.Reader().info.has_audio:
Expand All @@ -139,11 +146,10 @@ def __init__(self, file=None, preview=False):
# Update video_length property of the Timeline object
self.r.info.video_length = self.video_length

if preview:
# Display frame #'s during preview
self.clip.display = openshot.FRAME_DISPLAY_CLIP

# Display frame #
self.clip.display = openshot.FRAME_DISPLAY_CLIP
self.r.AddClip(self.clip)

except Exception:
log.error(
'Failed to load media file into preview player: %s',
Expand All @@ -169,8 +175,8 @@ def __init__(self, file=None, preview=False):
self.sliderVideo.setPageStep(24)

# Display start frame (and then the previous frame)
QTimer.singleShot(500, functools.partial(self.sliderVideo.setValue, self.start_frame + 1))
QTimer.singleShot(600, functools.partial(self.sliderVideo.setValue, self.start_frame))
QTimer.singleShot(500, functools.partial(self.sliderVideo.setValue, 2))
QTimer.singleShot(600, functools.partial(self.sliderVideo.setValue, 1))

# Connect signals
self.actionPlay.triggered.connect(self.actionPlay_Triggered)
Expand All @@ -180,8 +186,17 @@ def __init__(self, file=None, preview=False):
self.btnEnd.clicked.connect(self.btnEnd_clicked)
self.btnClear.clicked.connect(self.btnClear_clicked)
self.btnAddClip.clicked.connect(self.btnAddClip_clicked)
self.txtName.installEventFilter(self)
self.initialized = True

def eventFilter(self, source, event):
if event.type() == event.KeyPress and source is self.txtName:
if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
if self.btnAddClip.isEnabled():
self.btnAddClip_clicked()
return True
return super().eventFilter(source, event)

def actionPlay_Triggered(self):
# Trigger play button (This action is invoked from the preview thread, so it must exist here)
self.btnPlay.click()
Expand Down Expand Up @@ -340,16 +355,22 @@ def btnAddClip_clicked(self):
if 'name' in self.file.data:
self.file.data.pop('name')

# Get initial start / end properties (if any)
previous_start = self.file.data.get("start", 0.0)

# Save new file
self.file.id = None
self.file.key = None
self.file.type = 'insert'
self.file.data['start'] = (self.start_frame - 1) / self.fps
self.file.data['end'] = self.end_frame / self.fps
self.file.data['start'] = previous_start + ((self.start_frame - 1) / self.fps)
self.file.data['end'] = previous_start + (self.end_frame / self.fps)
if self.txtName.text():
self.file.data['name'] = self.txtName.text()
self.file.save()

# Move to next frame
self.sliderVideo.setValue(self.end_frame + 1)

# Reset form
self.clearForm()

Expand Down

0 comments on commit 86e6f08

Please sign in to comment.