|
|
|
@ -28,7 +28,7 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
@State var upsidedown = false |
|
|
|
@State var more = false |
|
|
|
@State var tilt = false |
|
|
|
@State var slow = false |
|
|
|
@State var jump = false |
|
|
|
@State var smoothTime = -1.0 |
|
|
|
@State var smoothSeekTime = -1.0 |
|
|
|
@State var timeCounter = 0 |
|
|
|
@ -121,7 +121,9 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
|
|
|
|
|
|
|
|
Text(model.currentSnapshot.name).foregroundColor(Color.blue) |
|
|
|
Text("(\(model.codec) \(model.height), \(model.nominalFrameRate), \(model.bitRate)m)").foregroundColor(Color.blue) |
|
|
|
Text(""" |
|
|
|
(\(model.codec) \(model.height), \(model.nominalFrameRate), \(model.bitRate)m)\n\(model.scale, specifier: "%.2f")x (\(model.dragOffset.width, specifier: "%.0f"),\(model.dragOffset.height, specifier: "%.0f")) |
|
|
|
""").foregroundColor(Color.blue) |
|
|
|
|
|
|
|
ScrollView(.horizontal, showsIndicators: false) { |
|
|
|
HStack { |
|
|
|
@ -130,7 +132,7 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
gotoSnapshot(item) |
|
|
|
}) { |
|
|
|
AsyncImage(item: item, placeholder: { Text("Loading ...") }, |
|
|
|
image: { Image(uiImage: $0).resizable() }) |
|
|
|
image: { Image(uiImage: $0).resizable() }).border(.yellow, width: (item===model.currentSnapshot) ? 1 : 0) |
|
|
|
.overlay(Image(systemName: "repeat.circle").offset(x: 20, y: -20).opacity((item.length > 0.0) ? 1 : 0)) |
|
|
|
} |
|
|
|
} |
|
|
|
@ -216,8 +218,9 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
.frame(height: 30) |
|
|
|
.foregroundColor(tilt ? Color.yellow : Color.blue).buttonStyle(BorderlessButtonStyle()) |
|
|
|
|
|
|
|
KToggleButton(text: "slow", binding: $slow).frame(height: 30) |
|
|
|
KToggleButton(text: "slow", binding: $model.slow).frame(height: 30) |
|
|
|
KToggleButton(text: "zoom", binding: $model.zoomed).frame(height: 30) |
|
|
|
KToggleButton(text: "jump", binding: $jump).frame(height: 30) |
|
|
|
KToggleButton(text: "loop", binding: $model.loop).frame(height: 30) |
|
|
|
// .fullScreenCover(isPresented: $model.loop) { |
|
|
|
// SVideoLoopPlayer(completionHandler: { |
|
|
|
@ -447,9 +450,8 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
smoothTime = time |
|
|
|
} |
|
|
|
|
|
|
|
if (start.y < 130) { |
|
|
|
if (start.y < 170) { |
|
|
|
let delta = (dragged.width + dragged.height) / 400.0 |
|
|
|
print(start.y) |
|
|
|
seekTimeSmoothly(smoothTime + delta) |
|
|
|
|
|
|
|
return false |
|
|
|
@ -458,12 +460,10 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
return true |
|
|
|
} |
|
|
|
else { |
|
|
|
let dragWidth = 20.0 |
|
|
|
if dragged.width > dragWidth { |
|
|
|
seekTime(time + 4.0) |
|
|
|
} else if dragged.width < -dragWidth { |
|
|
|
seekTime(time - 5.0) |
|
|
|
} |
|
|
|
let delta = (dragged.width + dragged.height) / 400.0 |
|
|
|
seekTimeSmoothly(smoothTime + delta) |
|
|
|
|
|
|
|
return false |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
@ -471,7 +471,7 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if dragged.height > 100 { |
|
|
|
if dragged.height > 100 && jump { |
|
|
|
if timeCounter == 0 { |
|
|
|
if let i = model.allItems.index(where: { m in m === model.currentSnapshot }) { |
|
|
|
if i + 1 < model.allItems.count { |
|
|
|
@ -489,19 +489,20 @@ struct SVideoPlayer: View, EditItemDelegate { |
|
|
|
if let time = getCurrentTime() { |
|
|
|
let dragWidth = 20.0 |
|
|
|
if !model.seeking { |
|
|
|
if (start.y < 130 || slow) { |
|
|
|
if model.scale > 1.0 && !slow { |
|
|
|
if model.scale > 1.0 && start.y > 200 { |
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
|
|
if (model.slow) { |
|
|
|
if dragged.width > dragWidth { |
|
|
|
seekTime(time + 5.0) |
|
|
|
} else if dragged.width < -dragWidth { |
|
|
|
seekTime(time - 8.0) |
|
|
|
} |
|
|
|
} else { |
|
|
|
if dragged.width > dragWidth { |
|
|
|
if dragged.width > dragWidth * 2 { |
|
|
|
seekTime(time + 30.0) |
|
|
|
} else if dragged.width < -dragWidth { |
|
|
|
} else if dragged.width < -dragWidth * 2 { |
|
|
|
seekTime(time - 30.0) |
|
|
|
} |
|
|
|
} |
|
|
|
|