work on tvos subtitle overlay
This commit is contained in:
parent
a9d37033e6
commit
40b6e5c680
|
@ -46,7 +46,7 @@ class VLCPlayerViewController: UIViewController {
|
||||||
private lazy var jumpBackwardOverlayView = makeJumpBackwardOverlayView()
|
private lazy var jumpBackwardOverlayView = makeJumpBackwardOverlayView()
|
||||||
private lazy var jumpForwardOverlayView = makeJumpForwardOverlayView()
|
private lazy var jumpForwardOverlayView = makeJumpForwardOverlayView()
|
||||||
private var currentOverlayHostingController: UIHostingController<tvOSVLCOverlay>?
|
private var currentOverlayHostingController: UIHostingController<tvOSVLCOverlay>?
|
||||||
private var currentOverlayContentHostingController: UIHostingController<tvOSOverlayContentView>?
|
private var currentOverlayContentHostingController: UIHostingController<SmallMediaStreamSelectionView>?
|
||||||
|
|
||||||
// MARK: init
|
// MARK: init
|
||||||
|
|
||||||
|
@ -195,12 +195,21 @@ class VLCPlayerViewController: UIViewController {
|
||||||
case .select:
|
case .select:
|
||||||
didGenerallyTap()
|
didGenerallyTap()
|
||||||
case .upArrow:
|
case .upArrow:
|
||||||
|
if displayingContentOverlay {
|
||||||
|
hideOverlayContent()
|
||||||
|
|
||||||
|
showOverlay()
|
||||||
|
restartOverlayDismissTimer()
|
||||||
|
}
|
||||||
|
|
||||||
print("Up arrow")
|
print("Up arrow")
|
||||||
case .downArrow:
|
case .downArrow:
|
||||||
stopOverlayDismissTimer()
|
if !displayingContentOverlay {
|
||||||
|
stopOverlayDismissTimer()
|
||||||
|
|
||||||
hideOverlay()
|
hideOverlay()
|
||||||
showOverlayContent()
|
showOverlayContent()
|
||||||
|
}
|
||||||
case .leftArrow:
|
case .leftArrow:
|
||||||
didSelectBackward()
|
didSelectBackward()
|
||||||
print("Left arrow")
|
print("Left arrow")
|
||||||
|
@ -292,13 +301,14 @@ class VLCPlayerViewController: UIViewController {
|
||||||
currentOverlayContentHostingController.removeFromParent()
|
currentOverlayContentHostingController.removeFromParent()
|
||||||
}
|
}
|
||||||
|
|
||||||
// let newSmallMenuOverlayView = SmallMediaStreamSelectionView(items: viewModel.subtitleStreams,
|
let newSmallMenuOverlayView = SmallMediaStreamSelectionView(viewModel: viewModel,
|
||||||
// selectedItem: viewModel.subtitleStreams.first(where: { $0.index == viewModel.selectedSubtitleStreamIndex })) { selectedMediaStream in
|
title: "Subtitles",
|
||||||
// self.didSelectSubtitleStream(index: selectedMediaStream.index ?? -1)
|
items: viewModel.subtitleStreams) { selectedMediaStream in
|
||||||
// }
|
self.didSelectSubtitleStream(index: selectedMediaStream.index ?? -1)
|
||||||
// let newOverlayContentHostingController = UIHostingController(rootView: newSmallMenuOverlayView)
|
}
|
||||||
let newOverlayContentView = tvOSOverlayContentView(viewModel: viewModel)
|
let newOverlayContentHostingController = UIHostingController(rootView: newSmallMenuOverlayView)
|
||||||
let newOverlayContentHostingController = UIHostingController(rootView: newOverlayContentView)
|
// let newOverlayContentView = tvOSOverlayContentView(viewModel: viewModel)
|
||||||
|
// let newOverlayContentHostingController = UIHostingController(rootView: newOverlayContentView)
|
||||||
|
|
||||||
newOverlayContentHostingController.view.translatesAutoresizingMaskIntoConstraints = false
|
newOverlayContentHostingController.view.translatesAutoresizingMaskIntoConstraints = false
|
||||||
newOverlayContentHostingController.view.backgroundColor = UIColor.clear
|
newOverlayContentHostingController.view.backgroundColor = UIColor.clear
|
||||||
|
|
|
@ -12,20 +12,14 @@ import SwiftUI
|
||||||
|
|
||||||
struct SmallMediaStreamSelectionView: View {
|
struct SmallMediaStreamSelectionView: View {
|
||||||
|
|
||||||
@Binding var selectedItem: MediaStream?
|
@ObservedObject var viewModel: VideoPlayerViewModel
|
||||||
private let title: String
|
let title: String
|
||||||
private var items: [MediaStream]
|
var items: [MediaStream]
|
||||||
private var selectedAction: (MediaStream) -> Void
|
var selectedAction: (MediaStream) -> Void
|
||||||
|
|
||||||
// init(items: [MediaStream], selectedItem: MediaStream?, selectedAction: @escaping (MediaStream) -> Void) {
|
|
||||||
// self.items = items
|
|
||||||
// self.selectedItem = selectedItem
|
|
||||||
// self.selectedAction = selectedAction
|
|
||||||
// }
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack(alignment: .bottom) {
|
ZStack(alignment: .bottom) {
|
||||||
LinearGradient(gradient: Gradient(colors: [.clear, .black.opacity(0.7)]),
|
LinearGradient(gradient: Gradient(colors: [.clear, .black.opacity(0.9)]),
|
||||||
startPoint: .top,
|
startPoint: .top,
|
||||||
endPoint: .bottom)
|
endPoint: .bottom)
|
||||||
.ignoresSafeArea()
|
.ignoresSafeArea()
|
||||||
|
@ -36,8 +30,8 @@ struct SmallMediaStreamSelectionView: View {
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
HStack {
|
HStack {
|
||||||
Text(title)
|
Text("Subtitles")
|
||||||
.font(.title3)
|
|
||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,9 +39,9 @@ struct SmallMediaStreamSelectionView: View {
|
||||||
HStack {
|
HStack {
|
||||||
ForEach(items, id: \.self) { item in
|
ForEach(items, id: \.self) { item in
|
||||||
Button {
|
Button {
|
||||||
self.selectedAction(item)
|
viewModel.playerOverlayDelegate?.didSelectSubtitleStream(index: item.index ?? -1)
|
||||||
} label: {
|
} label: {
|
||||||
if item == selectedItem {
|
if item.index ?? -1 == viewModel.selectedSubtitleStreamIndex {
|
||||||
Label(item.displayTitle ?? "No Title", systemImage: "checkmark")
|
Label(item.displayTitle ?? "No Title", systemImage: "checkmark")
|
||||||
} else {
|
} else {
|
||||||
Text(item.displayTitle ?? "No Title")
|
Text(item.displayTitle ?? "No Title")
|
||||||
|
|
|
@ -27,24 +27,32 @@ struct tvOSOverlayContentView: View {
|
||||||
} label: {
|
} label: {
|
||||||
Text("About")
|
Text("About")
|
||||||
}
|
}
|
||||||
|
.buttonStyle(PlainButtonStyle())
|
||||||
|
.background(Color.clear)
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
print("here")
|
print("here")
|
||||||
} label: {
|
} label: {
|
||||||
Text("Chapters")
|
Text("Chapters")
|
||||||
}
|
}
|
||||||
|
.buttonStyle(PlainButtonStyle())
|
||||||
|
.background(Color.clear)
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
print("here")
|
print("here")
|
||||||
} label: {
|
} label: {
|
||||||
Text("Subtitles")
|
Text("Subtitles")
|
||||||
}
|
}
|
||||||
|
.buttonStyle(PlainButtonStyle())
|
||||||
|
.background(Color.clear)
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
print("here")
|
print("here")
|
||||||
} label: {
|
} label: {
|
||||||
Text("Audio")
|
Text("Audio")
|
||||||
}
|
}
|
||||||
|
.buttonStyle(PlainButtonStyle())
|
||||||
|
.background(Color.clear)
|
||||||
}
|
}
|
||||||
.frame(height: 50)
|
.frame(height: 50)
|
||||||
|
|
||||||
|
|
|
@ -74,14 +74,16 @@ struct tvOSVLCOverlay: View {
|
||||||
}
|
}
|
||||||
|
|
||||||
if viewModel.shouldShowAutoPlay {
|
if viewModel.shouldShowAutoPlay {
|
||||||
Button {
|
if viewModel.autoplayEnabled {
|
||||||
viewModel.autoplayEnabled.toggle()
|
SFSymbolButton(systemName: "play.circle.fill") {
|
||||||
} label: {
|
viewModel.autoplayEnabled.toggle()
|
||||||
if viewModel.autoplayEnabled {
|
|
||||||
Image(systemName: "play.circle.fill")
|
|
||||||
} else {
|
|
||||||
Image(systemName: "stop.circle")
|
|
||||||
}
|
}
|
||||||
|
.frame(maxWidth: 30, maxHeight: 30)
|
||||||
|
} else {
|
||||||
|
SFSymbolButton(systemName: "stop.circle") {
|
||||||
|
viewModel.autoplayEnabled.toggle()
|
||||||
|
}
|
||||||
|
.frame(maxWidth: 30, maxHeight: 30)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue