work on tvos subtitle overlay

This commit is contained in:
Ethan Pippin 2022-01-03 11:48:35 -07:00
parent a9d37033e6
commit 40b6e5c680
4 changed files with 47 additions and 33 deletions

View File

@ -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

View File

@ -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")

View File

@ -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)

View File

@ -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)
} }
} }