Replace swipe gestures for jump with doubleTapGesture

run Swiftformat .
This commit is contained in:
PangMo5 2022-04-16 18:55:16 +09:00
parent bf3ee321c0
commit 615e71c334
11 changed files with 81 additions and 64 deletions

View File

@ -28,13 +28,13 @@ struct CinematicNextUpCardView: View {
item.getSeriesThumbImage(maxWidth: 350), item.getSeriesThumbImage(maxWidth: 350),
item.getSeriesBackdropImage(maxWidth: 350), item.getSeriesBackdropImage(maxWidth: 350),
]) ])
.frame(width: 350, height: 210) .frame(width: 350, height: 210)
} else { } else {
ImageView([ ImageView([
.init(url: item.getThumbImage(maxWidth: 350)), .init(url: item.getThumbImage(maxWidth: 350)),
.init(url: item.getBackdropImage(maxWidth: 350), blurHash: item.getBackdropImageBlurHash()), .init(url: item.getBackdropImage(maxWidth: 350), blurHash: item.getBackdropImageBlurHash()),
]) ])
.frame(width: 350, height: 210) .frame(width: 350, height: 210)
} }
LinearGradient(colors: [.clear, .black], LinearGradient(colors: [.clear, .black],

View File

@ -29,13 +29,13 @@ struct CinematicResumeCardView: View {
item.getSeriesThumbImage(maxWidth: 350), item.getSeriesThumbImage(maxWidth: 350),
item.getSeriesBackdropImage(maxWidth: 350), item.getSeriesBackdropImage(maxWidth: 350),
]) ])
.frame(width: 350, height: 210) .frame(width: 350, height: 210)
} else { } else {
ImageView([ ImageView([
.init(url: item.getThumbImage(maxWidth: 350)), .init(url: item.getThumbImage(maxWidth: 350)),
.init(url: item.getBackdropImage(maxWidth: 350), blurHash: item.getBackdropImageBlurHash()), .init(url: item.getBackdropImage(maxWidth: 350), blurHash: item.getBackdropImageBlurHash()),
]) ])
.frame(width: 350, height: 210) .frame(width: 350, height: 210)
} }
LinearGradient(colors: [.clear, .black], LinearGradient(colors: [.clear, .black],

View File

@ -62,18 +62,18 @@ struct tvOSLiveTVOverlay: View {
SFSymbolButton(systemName: "chevron.left.circle", action: { SFSymbolButton(systemName: "chevron.left.circle", action: {
viewModel.playerOverlayDelegate?.didSelectPlayPreviousItem() viewModel.playerOverlayDelegate?.didSelectPlayPreviousItem()
}) })
.frame(maxWidth: 30, maxHeight: 30) .frame(maxWidth: 30, maxHeight: 30)
.disabled(viewModel.previousItemVideoPlayerViewModel == nil) .disabled(viewModel.previousItemVideoPlayerViewModel == nil)
.foregroundColor(viewModel.nextItemVideoPlayerViewModel == nil ? .gray : .white) .foregroundColor(viewModel.nextItemVideoPlayerViewModel == nil ? .gray : .white)
} }
if viewModel.shouldShowPlayNextItem { if viewModel.shouldShowPlayNextItem {
SFSymbolButton(systemName: "chevron.right.circle", action: { SFSymbolButton(systemName: "chevron.right.circle", action: {
viewModel.playerOverlayDelegate?.didSelectPlayNextItem() viewModel.playerOverlayDelegate?.didSelectPlayNextItem()
}) })
.frame(maxWidth: 30, maxHeight: 30) .frame(maxWidth: 30, maxHeight: 30)
.disabled(viewModel.nextItemVideoPlayerViewModel == nil) .disabled(viewModel.nextItemVideoPlayerViewModel == nil)
.foregroundColor(viewModel.nextItemVideoPlayerViewModel == nil ? .gray : .white) .foregroundColor(viewModel.nextItemVideoPlayerViewModel == nil ? .gray : .white)
} }
if viewModel.shouldShowAutoPlay { if viewModel.shouldShowAutoPlay {

View File

@ -62,18 +62,18 @@ struct tvOSVLCOverlay: View {
SFSymbolButton(systemName: "chevron.left.circle", action: { SFSymbolButton(systemName: "chevron.left.circle", action: {
viewModel.playerOverlayDelegate?.didSelectPlayPreviousItem() viewModel.playerOverlayDelegate?.didSelectPlayPreviousItem()
}) })
.frame(maxWidth: 30, maxHeight: 30) .frame(maxWidth: 30, maxHeight: 30)
.disabled(viewModel.previousItemVideoPlayerViewModel == nil) .disabled(viewModel.previousItemVideoPlayerViewModel == nil)
.foregroundColor(viewModel.nextItemVideoPlayerViewModel == nil ? .gray : .white) .foregroundColor(viewModel.nextItemVideoPlayerViewModel == nil ? .gray : .white)
} }
if viewModel.shouldShowPlayNextItem { if viewModel.shouldShowPlayNextItem {
SFSymbolButton(systemName: "chevron.right.circle", action: { SFSymbolButton(systemName: "chevron.right.circle", action: {
viewModel.playerOverlayDelegate?.didSelectPlayNextItem() viewModel.playerOverlayDelegate?.didSelectPlayNextItem()
}) })
.frame(maxWidth: 30, maxHeight: 30) .frame(maxWidth: 30, maxHeight: 30)
.disabled(viewModel.nextItemVideoPlayerViewModel == nil) .disabled(viewModel.nextItemVideoPlayerViewModel == nil)
.foregroundColor(viewModel.nextItemVideoPlayerViewModel == nil ? .gray : .white) .foregroundColor(viewModel.nextItemVideoPlayerViewModel == nil ? .gray : .white)
} }
if viewModel.shouldShowAutoPlay { if viewModel.shouldShowAutoPlay {

View File

@ -2951,7 +2951,7 @@
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 70; CURRENT_PROJECT_VERSION = 70;
DEVELOPMENT_TEAM = 4BHXT8RHFR; DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = WidgetExtension/Info.plist; INFOPLIST_FILE = WidgetExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.0; IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -2977,7 +2977,7 @@
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 70; CURRENT_PROJECT_VERSION = 70;
DEVELOPMENT_TEAM = 4BHXT8RHFR; DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = WidgetExtension/Info.plist; INFOPLIST_FILE = WidgetExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.0; IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (

View File

@ -48,9 +48,9 @@ struct PortraitImageHStackView<TopBarView: View, ItemType: PortraitImageStackabl
failureView: { failureView: {
InitialFailureView(item.failureInitials) InitialFailureView(item.failureInitials)
}) })
.portraitPoster(width: maxWidth) .portraitPoster(width: maxWidth)
.shadow(radius: 4, y: 2) .shadow(radius: 4, y: 2)
.accessibilityIgnoresInvertColors() .accessibilityIgnoresInvertColors()
if item.showTitle { if item.showTitle {
Text(item.title) Text(item.title)

View File

@ -40,9 +40,9 @@ struct PortraitItemButton<ItemType: PortraitImageStackable>: View {
failureView: { failureView: {
InitialFailureView(item.failureInitials) InitialFailureView(item.failureInitials)
}) })
.portraitPoster(width: maxWidth) .portraitPoster(width: maxWidth)
.shadow(radius: 4, y: 2) .shadow(radius: 4, y: 2)
.accessibilityIgnoresInvertColors() .accessibilityIgnoresInvertColors()
if item.showTitle { if item.showTitle {
Text(item.title) Text(item.title)

View File

@ -33,13 +33,13 @@ struct ContinueWatchingView: View {
item.getSeriesThumbImage(maxWidth: 320), item.getSeriesThumbImage(maxWidth: 320),
item.getSeriesBackdropImage(maxWidth: 320), item.getSeriesBackdropImage(maxWidth: 320),
]) ])
.frame(width: 320, height: 180) .frame(width: 320, height: 180)
} else { } else {
ImageView(sources: [ ImageView(sources: [
item.getThumbImage(maxWidth: 320), item.getThumbImage(maxWidth: 320),
item.getBackdropImage(maxWidth: 320), item.getBackdropImage(maxWidth: 320),
]) ])
.frame(width: 320, height: 180) .frame(width: 320, height: 180)
} }
} }
.accessibilityIgnoresInvertColors() .accessibilityIgnoresInvertColors()

View File

@ -69,7 +69,7 @@ struct ItemViewBody: View {
selectedAction: { genre in selectedAction: { genre in
itemRouter.route(to: \.library, (viewModel: .init(genre: genre), title: genre.title)) itemRouter.route(to: \.library, (viewModel: .init(genre: genre), title: genre.title))
}) })
.padding(.bottom) .padding(.bottom)
} }
// MARK: Studios // MARK: Studios

View File

@ -375,16 +375,16 @@ struct VLCPlayerOverlayView: View {
ValueSlider(value: $viewModel.sliderPercentage, onEditingChanged: { editing in ValueSlider(value: $viewModel.sliderPercentage, onEditingChanged: { editing in
viewModel.sliderIsScrubbing = editing viewModel.sliderIsScrubbing = editing
}) })
.valueSliderStyle(HorizontalValueSliderStyle(track: .valueSliderStyle(HorizontalValueSliderStyle(track:
HorizontalValueTrack(view: HorizontalValueTrack(view:
Capsule().foregroundColor(.purple)) Capsule().foregroundColor(.purple))
.background(Capsule().foregroundColor(Color.gray.opacity(0.25))) .background(Capsule().foregroundColor(Color.gray.opacity(0.25)))
.frame(height: 4), .frame(height: 4),
thumb: Circle().foregroundColor(.purple), thumb: Circle().foregroundColor(.purple),
thumbSize: CGSize.Circle(radius: viewModel.sliderIsScrubbing ? 20 : 15), thumbSize: CGSize.Circle(radius: viewModel.sliderIsScrubbing ? 20 : 15),
thumbInteractiveSize: CGSize.Circle(radius: 40), thumbInteractiveSize: CGSize.Circle(radius: 40),
options: .defaultOptions)) options: .defaultOptions))
.frame(maxHeight: 50) .frame(maxHeight: 50)
Text(viewModel.rightLabelText) Text(viewModel.rightLabelText)
.font(.system(size: 18, weight: .semibold, design: .default)) .font(.system(size: 18, weight: .semibold, design: .default))

View File

@ -60,23 +60,33 @@ class VLCPlayerViewController: UIViewController {
UIKeyCommand(title: L10n.playAndPause, action: #selector(didSelectMain), input: " "), UIKeyCommand(title: L10n.playAndPause, action: #selector(didSelectMain), input: " "),
UIKeyCommand(title: L10n.jumpForward, action: #selector(didSelectForward), input: UIKeyCommand.inputRightArrow), UIKeyCommand(title: L10n.jumpForward, action: #selector(didSelectForward), input: UIKeyCommand.inputRightArrow),
UIKeyCommand(title: L10n.jumpBackward, action: #selector(didSelectBackward), input: UIKeyCommand.inputLeftArrow), UIKeyCommand(title: L10n.jumpBackward, action: #selector(didSelectBackward), input: UIKeyCommand.inputLeftArrow),
UIKeyCommand(title: L10n.nextItem, action: #selector(didSelectPlayNextItem), input: UIKeyCommand.inputRightArrow, UIKeyCommand(title: L10n.nextItem,
action: #selector(didSelectPlayNextItem),
input: UIKeyCommand.inputRightArrow,
modifierFlags: .command), modifierFlags: .command),
UIKeyCommand(title: L10n.previousItem, action: #selector(didSelectPlayPreviousItem), input: UIKeyCommand.inputLeftArrow, UIKeyCommand(title: L10n.previousItem,
action: #selector(didSelectPlayPreviousItem),
input: UIKeyCommand.inputLeftArrow,
modifierFlags: .command), modifierFlags: .command),
UIKeyCommand(title: L10n.close, action: #selector(didSelectClose), input: UIKeyCommand.inputEscape), UIKeyCommand(title: L10n.close, action: #selector(didSelectClose), input: UIKeyCommand.inputEscape),
] ]
if let previous = viewModel.playbackSpeed.previous { if let previous = viewModel.playbackSpeed.previous {
commands.append(.init(title: "\(L10n.playbackSpeed) \(previous.displayTitle)", commands.append(.init(title: "\(L10n.playbackSpeed) \(previous.displayTitle)",
action: #selector(didSelectPreviousPlaybackSpeed), input: "[", modifierFlags: .command)) action: #selector(didSelectPreviousPlaybackSpeed),
input: "[",
modifierFlags: .command))
} }
if let next = viewModel.playbackSpeed.next { if let next = viewModel.playbackSpeed.next {
commands.append(.init(title: "\(L10n.playbackSpeed) \(next.displayTitle)", action: #selector(didSelectNextPlaybackSpeed), commands.append(.init(title: "\(L10n.playbackSpeed) \(next.displayTitle)",
input: "]", modifierFlags: .command)) action: #selector(didSelectNextPlaybackSpeed),
input: "]",
modifierFlags: .command))
} }
if viewModel.playbackSpeed != .one { if viewModel.playbackSpeed != .one {
commands.append(.init(title: "\(L10n.playbackSpeed) \(PlaybackSpeed.one.displayTitle)", commands.append(.init(title: "\(L10n.playbackSpeed) \(PlaybackSpeed.one.displayTitle)",
action: #selector(didSelectNormalPlaybackSpeed), input: "\\", modifierFlags: .command)) action: #selector(didSelectNormalPlaybackSpeed),
input: "\\",
modifierFlags: .command))
} }
commands.forEach { $0.wantsPriorityOverSystemBehavior = true } commands.forEach { $0.wantsPriorityOverSystemBehavior = true }
return commands return commands
@ -148,12 +158,18 @@ class VLCPlayerViewController: UIViewController {
refreshJumpForwardOverlayView(with: viewModel.jumpForwardLength) refreshJumpForwardOverlayView(with: viewModel.jumpForwardLength)
let defaultNotificationCenter = NotificationCenter.default let defaultNotificationCenter = NotificationCenter.default
defaultNotificationCenter.addObserver(self, selector: #selector(appWillTerminate), name: UIApplication.willTerminateNotification, defaultNotificationCenter.addObserver(self,
selector: #selector(appWillTerminate),
name: UIApplication.willTerminateNotification,
object: nil)
defaultNotificationCenter.addObserver(self,
selector: #selector(appWillResignActive),
name: UIApplication.willResignActiveNotification,
object: nil)
defaultNotificationCenter.addObserver(self,
selector: #selector(appWillResignActive),
name: UIApplication.didEnterBackgroundNotification,
object: nil) object: nil)
defaultNotificationCenter.addObserver(self, selector: #selector(appWillResignActive),
name: UIApplication.willResignActiveNotification, object: nil)
defaultNotificationCenter.addObserver(self, selector: #selector(appWillResignActive),
name: UIApplication.didEnterBackgroundNotification, object: nil)
} }
@objc @objc
@ -205,11 +221,8 @@ class VLCPlayerViewController: UIViewController {
let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didTap)) let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didTap))
let rightSwipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(didRightSwipe)) let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didDoubleTap))
rightSwipeGesture.direction = .right doubleTapGesture.numberOfTapsRequired = 2
let leftSwipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(didLeftSwipe))
leftSwipeGesture.direction = .left
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(didPinch(_:))) let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(didPinch(_:)))
@ -219,8 +232,10 @@ class VLCPlayerViewController: UIViewController {
view.addGestureRecognizer(pinchGesture) view.addGestureRecognizer(pinchGesture)
if viewModel.jumpGesturesEnabled { if viewModel.jumpGesturesEnabled {
view.addGestureRecognizer(rightSwipeGesture) view.addGestureRecognizer(doubleTapGesture)
view.addGestureRecognizer(leftSwipeGesture) singleTapGesture.require(toFail: doubleTapGesture)
singleTapGesture.delaysTouchesBegan = true
doubleTapGesture.delaysTouchesBegan = true
} }
if viewModel.systemControlGesturesEnabled { if viewModel.systemControlGesturesEnabled {
@ -246,13 +261,12 @@ class VLCPlayerViewController: UIViewController {
} }
@objc @objc
private func didRightSwipe() { private func didDoubleTap(_ gestureRecognizer: UITapGestureRecognizer) {
didSelectForward() if gestureRecognizer.location(in: mainGestureView).x > (mainGestureView.frame.width / 2) {
} didSelectForward()
} else {
@objc didSelectBackward()
private func didLeftSwipe() { }
didSelectBackward()
} }
@objc @objc
@ -736,8 +750,11 @@ extension VLCPlayerViewController {
extension VLCPlayerViewController { extension VLCPlayerViewController {
private func restartOverlayDismissTimer(interval: Double = 3) { private func restartOverlayDismissTimer(interval: Double = 3) {
overlayDismissTimer?.invalidate() overlayDismissTimer?.invalidate()
overlayDismissTimer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(dismissTimerFired), overlayDismissTimer = Timer.scheduledTimer(timeInterval: interval,
userInfo: nil, repeats: false) target: self,
selector: #selector(dismissTimerFired),
userInfo: nil,
repeats: false)
} }
@objc @objc