|
|
|
@ -51,25 +51,37 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
var body: some View { |
|
|
|
VStack { |
|
|
|
HStack { |
|
|
|
Button(action: { |
|
|
|
player.pause() |
|
|
|
player.replaceCurrentItem(with: nil) |
|
|
|
model.currentURL = nil |
|
|
|
cleanup() |
|
|
|
completionHandler!(model.edit) |
|
|
|
}, label: { |
|
|
|
Text("cancel") |
|
|
|
}).buttonStyle(BorderlessButtonStyle()) |
|
|
|
Button(action: { |
|
|
|
model.loop.toggle() |
|
|
|
}, label: { |
|
|
|
Text("loop") |
|
|
|
}).foregroundColor(model.loop ? Color.yellow : Color.blue).buttonStyle(BorderlessButtonStyle()) |
|
|
|
Button(action: { |
|
|
|
model.zoomed.toggle() |
|
|
|
}, label: { |
|
|
|
Text("zoom") |
|
|
|
}).foregroundColor(model.zoomed ? Color.yellow : Color.blue).buttonStyle(BorderlessButtonStyle()) |
|
|
|
Group { |
|
|
|
Button(action: { |
|
|
|
model.baseItem.favorite = model.favorite |
|
|
|
player.pause() |
|
|
|
player.replaceCurrentItem(with: nil) |
|
|
|
model.currentURL = nil |
|
|
|
cleanup() |
|
|
|
completionHandler!(model.edit) |
|
|
|
}, label: { |
|
|
|
Text("cancel") |
|
|
|
}) |
|
|
|
.buttonStyle(BorderlessButtonStyle()) |
|
|
|
Button(action: { |
|
|
|
model.loop.toggle() |
|
|
|
}, label: { |
|
|
|
Text("loop") |
|
|
|
}) |
|
|
|
.foregroundColor(model.loop ? Color.yellow : Color.blue).buttonStyle(BorderlessButtonStyle()) |
|
|
|
Button(action: { |
|
|
|
model.zoomed.toggle() |
|
|
|
}, label: { |
|
|
|
Text("zoom") |
|
|
|
}) |
|
|
|
.foregroundColor(model.zoomed ? Color.yellow : Color.blue).buttonStyle(BorderlessButtonStyle()) |
|
|
|
Button(action: { |
|
|
|
model.favorite.toggle() |
|
|
|
}, label: { |
|
|
|
Image(systemName: "heart.fill") |
|
|
|
}) |
|
|
|
.foregroundColor(model.favorite ? Color.yellow : Color.blue).buttonStyle(BorderlessButtonStyle()) |
|
|
|
} |
|
|
|
|
|
|
|
Button(action: { |
|
|
|
for s in steps { |
|
|
|
@ -278,31 +290,31 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
} |
|
|
|
|
|
|
|
if let time = getCurrentTime() { |
|
|
|
let sk = model.seeking |
|
|
|
model.seeking = false |
|
|
|
// let sk = model.seeking |
|
|
|
// model.seeking = false |
|
|
|
|
|
|
|
// print("Start \(start.y) Drag \(dragged.width)))") |
|
|
|
let dragWidth = 20.0 |
|
|
|
|
|
|
|
if (start.y < 130) { |
|
|
|
if model.scale > 1.0 { |
|
|
|
return true |
|
|
|
} |
|
|
|
if dragged.width > dragWidth { |
|
|
|
seekTime(time + 8.0) |
|
|
|
} else if dragged.width < -dragWidth { |
|
|
|
seekTime(time - 10.0) |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
if dragged.width > dragWidth { |
|
|
|
seekTime(time + 30.0) |
|
|
|
} else if dragged.width < -dragWidth { |
|
|
|
seekTime(time - 30.0) |
|
|
|
if !model.seeking { |
|
|
|
if (start.y < 130) { |
|
|
|
if model.scale > 1.0 { |
|
|
|
return true |
|
|
|
} |
|
|
|
if dragged.width > dragWidth { |
|
|
|
seekTime(time + 8.0) |
|
|
|
} else if dragged.width < -dragWidth { |
|
|
|
seekTime(time - 10.0) |
|
|
|
} |
|
|
|
} else { |
|
|
|
if dragged.width > dragWidth { |
|
|
|
seekTime(time + 30.0) |
|
|
|
} else if dragged.width < -dragWidth { |
|
|
|
seekTime(time - 30.0) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
model.seeking = sk |
|
|
|
// model.seeking = sk |
|
|
|
} |
|
|
|
|
|
|
|
if dragged.height > 100 && timeCounter == 0 { |
|
|
|
@ -326,6 +338,7 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
|
|
|
|
func seekTime(_ time: Double) { |
|
|
|
print("Seek \(time)") |
|
|
|
self.model.seeking = true |
|
|
|
player.pause() |
|
|
|
// player.cancelPendingPrerolls() |
|
|
|
|
|
|
|
@ -333,11 +346,13 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
item.cancelPendingSeeks() |
|
|
|
} |
|
|
|
|
|
|
|
player.seek(to: CMTime(seconds: time, preferredTimescale: CMTimeScale(10000)), |
|
|
|
toleranceBefore: CMTime(seconds: 0.3, preferredTimescale: CMTimeScale(10000)), |
|
|
|
toleranceAfter: CMTime(seconds: 1.0, preferredTimescale: CMTimeScale(10000))){ _ in |
|
|
|
player.seek(to: CMTime(seconds: time, preferredTimescale: CMTimeScale(600))){ _ in |
|
|
|
// player.seek(to: CMTime(seconds: time, preferredTimescale: CMTimeScale(10000)), |
|
|
|
// toleranceBefore: CMTime(seconds: 0.3, preferredTimescale: CMTimeScale(10000)), |
|
|
|
// toleranceAfter: CMTime(seconds: 1.0, preferredTimescale: CMTimeScale(10000))){ _ in |
|
|
|
player.play() |
|
|
|
player.rate = model.speed |
|
|
|
self.model.seeking = false |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
@ -393,8 +408,8 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
} |
|
|
|
else { |
|
|
|
if model.zoomed && f > 0.0 { |
|
|
|
if f < 0.5 { |
|
|
|
f = f * 1.5 |
|
|
|
if f < 0.6 { |
|
|
|
f = f * CGFloat(LocalManager.sharedInstance.settings.scale) |
|
|
|
} |
|
|
|
model.scale = f |
|
|
|
} |
|
|
|
|