Cleanup and UDPBroadcastConnection Package (#765)

This commit is contained in:
Ethan Pippin 2023-05-06 22:07:34 -06:00 committed by GitHub
parent bfccb04deb
commit 2a51598004
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 121 additions and 90 deletions

View File

@ -1,4 +1,3 @@
binary "https://code.videolan.org/videolan/VLCKit/raw/master/Packaging/MobileVLCKit.json" ~> 3.4.0
binary "https://code.videolan.org/videolan/VLCKit/raw/master/Packaging/TVVLCKit.json" ~> 3.3.0
github "gunterhager/UDPBroadcastConnection"
binary "ChromeCastFramework.json"

View File

@ -8,25 +8,77 @@
import SwiftUI
// TODO: Allow optional binding
struct EnumPicker<EnumType: CaseIterable & Displayable & Hashable>: View {
struct EnumPicker<EnumType: CaseIterable & Displayable & Hashable & RawRepresentable>: View {
enum NoneStyle: Displayable {
case text
case dash(Int)
case custom(String)
var displayTitle: String {
switch self {
case .text:
return L10n.none
case let .dash(length):
precondition(length >= 1, "Dash must have length of at least 1.")
return String(repeating: "-", count: length)
case let .custom(text):
precondition(!text.isEmpty, "Custom text must have length of at least 1.")
return text
}
}
}
@Binding
var selection: EnumType
private var selection: EnumType?
let title: String
init(title: String, selection: Binding<EnumType>) {
self.title = title
self._selection = selection
}
private let title: String
private let hasNil: Bool
private var noneStyle: NoneStyle
var body: some View {
Picker(title, selection: $selection) {
if hasNil {
Text(noneStyle.displayTitle)
.tag(nil as EnumType?)
}
ForEach(EnumType.allCases.asArray, id: \.hashValue) {
Text($0.displayTitle).tag($0)
Text($0.displayTitle)
.tag($0 as EnumType?)
}
}
}
}
extension EnumPicker {
init(title: String, selection: Binding<EnumType?>) {
self.title = title
self._selection = selection
self.hasNil = true
self.noneStyle = .text
}
init(title: String, selection: Binding<EnumType>) {
self.title = title
let binding = Binding<EnumType?> {
selection.wrappedValue
} set: { newValue, _ in
assert(newValue != nil, "Should not have nil new value with non-optional binding")
selection.wrappedValue = newValue!
}
self._selection = binding
self.hasNil = false
self.noneStyle = .text
}
func noneStyle(_ newStyle: NoneStyle) -> Self {
copy(modifying: \.noneStyle, with: newStyle)
}
}

View File

@ -9,7 +9,8 @@
import Defaults
import Foundation
// TODO: look at optional values for defaults to remove .none
// Optional values aren't yet supported in Defaults
// https://github.com/sindresorhus/Defaults/issues/54
protocol GestureAction: CaseIterable, Codable, Defaults.Serializable, Displayable {}

View File

@ -9,19 +9,6 @@
import Foundation
import JellyfinAPI
// enum SpecialFeatureType: String, CaseIterable, Displayable {
//
// case unknown = "Unknown"
// case clip = "Clip"
// case trailer = "Trailer"
// case behindTheScenes = "BehindTheScenes"
// case deletedScene = "DeletedScene"
// case interview = "Interview"
// case scene = "Scene"
// case sample = "Sample"
// case themeSong = "ThemeSong"
// case themeVideo = "ThemeVideo"
extension SpecialFeatureType: Displayable {
// TODO: localize

View File

@ -39,7 +39,7 @@ struct SelectorView<Item: Displayable & Identifiable>: View {
Spacer()
if selection.contains { $0.id == item.id } {
if selection.contains(where: { $0.id == item.id }) {
Image(systemName: "checkmark.circle.fill")
.resizable()
.aspectRatio(contentMode: .fit)

View File

@ -2,10 +2,6 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIUserInterfaceStyle</key>
<string>Dark</string>
<key>CFBundledisplayTitle</key>
<string>Jellyfin</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@ -20,6 +16,8 @@
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>CFBundledisplayTitle</key>
<string>Jellyfin</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
@ -36,5 +34,7 @@
<array>
<string>arm64</string>
</array>
<key>UIUserInterfaceStyle</key>
<string>Dark</string>
</dict>
</plist>

View File

@ -51,12 +51,3 @@ extension ItemView.AboutView {
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ItemView.AboutView.InformationCard(
title: "Subtitles",
content: "Fre - Default - PGSSUB"
)
}
}

View File

@ -51,32 +51,3 @@ extension VideoPlayer {
}
}
}
// struct VideoPlayerOverlay_Preview: PreviewProvider {
//
// static var previews: some View {
// ZStack {
//
// Color.red
//
// VideoPlayer.MainOverlay()
// .environmentObject(VideoPlayerManager())
// .environmentObject(VideoPlayerViewModel(
// playbackURL: URL(string: "http://apple.com")!,
// item: .init(indexNumber: 1, name: "Interstellar", parentIndexNumber: 1, seriesName: "New Girl", type: .episode),
// mediaSource: .init(),
// playSessionID: "",
// videoStreams: [],
// audioStreams: [],
// subtitleStreams: [],
// selectedAudioStreamIndex: 1,
// selectedSubtitleStreamIndex: 1,
// chapters: [],
// streamType: .direct)
// )
// .environmentObject(VideoPlayerManager.CurrentProgressHandler())
// .environmentObject(TimerProxy())
// }
// .ignoresSafeArea()
// }
// }

View File

@ -82,8 +82,6 @@
6220D0C026D61C5000B8E046 /* ItemCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0BF26D61C5000B8E046 /* ItemCoordinator.swift */; };
6220D0C926D63F3700B8E046 /* Stinsen in Frameworks */ = {isa = PBXBuildFile; productRef = 6220D0C826D63F3700B8E046 /* Stinsen */; };
6220D0CC26D640C400B8E046 /* AppURLHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0CB26D640C400B8E046 /* AppURLHandler.swift */; };
62400C4B287ED19600F6AD3D /* UDPBroadcast.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 637FCAF3287B5B2600C0A353 /* UDPBroadcast.xcframework */; };
62400C4C287ED19600F6AD3D /* UDPBroadcast.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 637FCAF3287B5B2600C0A353 /* UDPBroadcast.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
625CB5732678C32A00530A6E /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5722678C32A00530A6E /* HomeViewModel.swift */; };
625CB5752678C33500530A6E /* MediaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5742678C33500530A6E /* MediaViewModel.swift */; };
625CB5772678C34300530A6E /* ConnectToServerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5762678C34300530A6E /* ConnectToServerViewModel.swift */; };
@ -447,6 +445,7 @@
E17FB55928C125E900311DFE /* StudiosHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E17FB55828C125E900311DFE /* StudiosHStack.swift */; };
E17FB55B28C1266400311DFE /* GenresHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E17FB55A28C1266400311DFE /* GenresHStack.swift */; };
E18295E429CAC6F100F91ED0 /* BasicNavigationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E154967D296CCB6C00C4EF88 /* BasicNavigationCoordinator.swift */; };
E18443CB2A037773002DDDC8 /* UDPBroadcast in Frameworks */ = {isa = PBXBuildFile; productRef = E18443CA2A037773002DDDC8 /* UDPBroadcast */; };
E185920628CDAA6400326F80 /* CastAndCrewHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E185920528CDAA6400326F80 /* CastAndCrewHStack.swift */; };
E185920828CDAAA200326F80 /* SimilarItemsHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E185920728CDAAA200326F80 /* SimilarItemsHStack.swift */; };
E185920A28CEF23A00326F80 /* FocusGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = E185920928CEF23A00326F80 /* FocusGuide.swift */; };
@ -700,13 +699,12 @@
E1EBCB44278BD1CE009FE6E9 /* ItemOverviewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB43278BD1CE009FE6E9 /* ItemOverviewCoordinator.swift */; };
E1EBCB46278BD595009FE6E9 /* ItemOverviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB45278BD595009FE6E9 /* ItemOverviewView.swift */; };
E1EBCB4A278BE443009FE6E9 /* ItemOverviewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB43278BD1CE009FE6E9 /* ItemOverviewCoordinator.swift */; };
E1ECD8F528C1BA10008B9DC6 /* UDPBroadcast.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 637FCAF3287B5B2600C0A353 /* UDPBroadcast.xcframework */; };
E1ECD8F628C1BA10008B9DC6 /* UDPBroadcast.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 637FCAF3287B5B2600C0A353 /* UDPBroadcast.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
E1EF473A289A0F610034046B /* TruncatedTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB41278BD174009FE6E9 /* TruncatedTextView.swift */; };
E1EF4C412911B783008CC695 /* StreamType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EF4C402911B783008CC695 /* StreamType.swift */; };
E1F0204E26CCCA74001C1C3B /* VideoPlayerJumpLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */; };
E1FA891B289A302300176FEB /* iPadOSCollectionItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA891A289A302300176FEB /* iPadOSCollectionItemView.swift */; };
E1FA891E289A305D00176FEB /* iPadOSCollectionItemContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA891D289A305D00176FEB /* iPadOSCollectionItemContentView.swift */; };
E1FAD1C62A0375BA007F5521 /* UDPBroadcast in Frameworks */ = {isa = PBXBuildFile; productRef = E1FAD1C52A0375BA007F5521 /* UDPBroadcast */; };
E1FBDB6629D0F336003DD5E2 /* KeyCommandAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FBDB6529D0F336003DD5E2 /* KeyCommandAction.swift */; };
E1FCD08826C35A0D007C8DCF /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
E1FCD08926C35A0D007C8DCF /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
@ -733,7 +731,6 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
62400C4C287ED19600F6AD3D /* UDPBroadcast.xcframework in Embed Frameworks */,
62666DF827E5012C00EC0ECD /* MobileVLCKit.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
@ -746,7 +743,6 @@
dstSubfolderSpec = 10;
files = (
62666DFB27E5013700EC0ECD /* TVVLCKit.xcframework in Embed Frameworks */,
E1ECD8F628C1BA10008B9DC6 /* UDPBroadcast.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@ -1287,9 +1283,9 @@
E1388A46293F0ABA009721B1 /* SwizzleSwift in Frameworks */,
62666E2C27E5021000EC0ECD /* QuartzCore.framework in Frameworks */,
62666E1927E501D000EC0ECD /* CoreFoundation.framework in Frameworks */,
E18443CB2A037773002DDDC8 /* UDPBroadcast in Frameworks */,
62666E2E27E5021400EC0ECD /* Security.framework in Frameworks */,
E1B5F7AD29577BDD004B26CF /* OrderedCollections in Frameworks */,
E1ECD8F528C1BA10008B9DC6 /* UDPBroadcast.xcframework in Frameworks */,
53ABFDDC267972BF00886593 /* TVServices.framework in Frameworks */,
62666E1F27E501DF00EC0ECD /* CoreText.framework in Frameworks */,
E13DD3CD27164CA7009D4DAF /* CoreStore in Frameworks */,
@ -1327,8 +1323,8 @@
62666E1027E501B400EC0ECD /* VideoToolbox.framework in Frameworks */,
62666E0C27E501A500EC0ECD /* OpenGLES.framework in Frameworks */,
E19E6E0A28A0BEFF005C10C8 /* BlurHashKit in Frameworks */,
E1FAD1C62A0375BA007F5521 /* UDPBroadcast in Frameworks */,
62666E0127E5016900EC0ECD /* CoreFoundation.framework in Frameworks */,
62400C4B287ED19600F6AD3D /* UDPBroadcast.xcframework in Frameworks */,
62666E2427E501F300EC0ECD /* Foundation.framework in Frameworks */,
E18A8E7A28D5FEDF00333B9A /* VLCUI in Frameworks */,
53352571265EA0A0006CCA86 /* Introspect in Frameworks */,
@ -2734,6 +2730,7 @@
E1B5F7AA29577BCE004B26CF /* PulseUI */,
E1B5F7AC29577BDD004B26CF /* OrderedCollections */,
E1DC981D296DD91900982F06 /* CollectionView */,
E18443CA2A037773002DDDC8 /* UDPBroadcast */,
);
productName = "JellyfinPlayer tvOS";
productReference = 535870602669D21600D05A09 /* Swiftfin tvOS.app */;
@ -2776,6 +2773,7 @@
E19DDEC62948EF9900954E10 /* OrderedCollections */,
E1DC9813296DC06200982F06 /* PulseLogHandler */,
E1DC9820296DDBE600982F06 /* CollectionView */,
E1FAD1C52A0375BA007F5521 /* UDPBroadcast */,
);
productName = JellyfinPlayer;
productReference = 5377CBF1263B596A003A4E83 /* Swiftfin iOS.app */;
@ -2787,11 +2785,12 @@
5377CBE9263B596A003A4E83 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
KnownAssetTags = (
New,
);
LastSwiftUpdateCheck = 1250;
LastUpgradeCheck = 1400;
LastUpgradeCheck = 1430;
TargetAttributes = {
5358705F2669D21600D05A09 = {
CreatedOnToolsVersion = 12.5;
@ -2842,6 +2841,7 @@
E19DDEC52948EF9900954E10 /* XCRemoteSwiftPackageReference "swift-collections" */,
E1DC9812296DC06200982F06 /* XCRemoteSwiftPackageReference "PulseLogHandler" */,
E1DC981F296DDBE600982F06 /* XCRemoteSwiftPackageReference "CollectionView" */,
E1FAD1C42A0375BA007F5521 /* XCRemoteSwiftPackageReference "UDPBroadcastConnection" */,
);
productRefGroup = 5377CBF2263B596A003A4E83 /* Products */;
projectDirPath = "";
@ -3691,7 +3691,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = "";
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 70;
@ -3720,7 +3720,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = "";
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 70;
@ -3868,16 +3868,15 @@
5377CC1C263B596B003A4E83 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-primary-primary";
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = "";
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CODE_SIGN_ENTITLEMENTS = Swiftfin/Swiftfin.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 78;
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = TY84JMYEFE;
DEVELOPMENT_TEAM = "";
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
EXCLUDED_ARCHS = "";
@ -3891,7 +3890,7 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = pip.jellyfin.swiftfin;
PRODUCT_BUNDLE_IDENTIFIER = org.jellyfin.swiftfin;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTS_MACCATALYST = NO;
@ -3906,9 +3905,8 @@
5377CC1D263B596B003A4E83 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-primary-primary";
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = "";
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CODE_SIGN_ENTITLEMENTS = Swiftfin/Swiftfin.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
@ -3916,7 +3914,7 @@
CURRENT_PROJECT_VERSION = 78;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = TY84JMYEFE;
DEVELOPMENT_TEAM = "";
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
EXCLUDED_ARCHS = "";
@ -3930,7 +3928,7 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = pip.jellyfin.swiftfin;
PRODUCT_BUNDLE_IDENTIFIER = org.jellyfin.swiftfin;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTS_MACCATALYST = NO;
@ -4110,6 +4108,14 @@
kind = branch;
};
};
E1FAD1C42A0375BA007F5521 /* XCRemoteSwiftPackageReference "UDPBroadcastConnection" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/gunterhager/UDPBroadcastConnection";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 5.0.0;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
@ -4243,6 +4249,11 @@
package = E1575E3A293C6B15001665B1 /* XCRemoteSwiftPackageReference "Files" */;
productName = Files;
};
E18443CA2A037773002DDDC8 /* UDPBroadcast */ = {
isa = XCSwiftPackageProductDependency;
package = E1FAD1C42A0375BA007F5521 /* XCRemoteSwiftPackageReference "UDPBroadcastConnection" */;
productName = UDPBroadcast;
};
E18A8E7928D5FEDF00333B9A /* VLCUI */ = {
isa = XCSwiftPackageProductDependency;
package = E18A8E7828D5FEDF00333B9A /* XCRemoteSwiftPackageReference "VLCUI" */;
@ -4317,6 +4328,11 @@
package = E1DC981F296DDBE600982F06 /* XCRemoteSwiftPackageReference "CollectionView" */;
productName = CollectionView;
};
E1FAD1C52A0375BA007F5521 /* UDPBroadcast */ = {
isa = XCSwiftPackageProductDependency;
package = E1FAD1C42A0375BA007F5521 /* XCRemoteSwiftPackageReference "UDPBroadcastConnection" */;
productName = UDPBroadcast;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 5377CBE9263B596A003A4E83 /* Project object */;

View File

@ -162,6 +162,15 @@
"version" : "1.0.0"
}
},
{
"identity" : "udpbroadcastconnection",
"kind" : "remoteSourceControl",
"location" : "https://github.com/gunterhager/UDPBroadcastConnection",
"state" : {
"revision" : "3680f532c00d18a168bb8da7b9f8f82fcd89180d",
"version" : "5.0.5"
}
},
{
"identity" : "urlqueryencoder",
"kind" : "remoteSourceControl",

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1400"
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1400"
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@ -50,7 +50,7 @@ struct SwiftfinApp: App {
CoreStoreDefaults.dataStack = SwiftfinStore.dataStack
CoreStoreDefaults.logger = SwiftfinCorestoreLogger()
// Don't let the tab bar disappear when a new view is pushed
// Sometimes the tab bar won't appear properly on push, always have material background
UITabBar.appearance().scrollEdgeAppearance = UITabBarAppearance(idiom: .unspecified)
}

View File

@ -9,6 +9,11 @@
import Defaults
import SwiftUI
// TODO: organize into a better structure
// TODO: add footer descriptions to each explaining the
// the gesture + why horizontal pan/swipe caveat
// TODO: add page describing each action?
struct GestureSettingsView: View {
@Default(.VideoPlayer.Gesture.horizontalPanGesture)