From 6d32db67511ca83312d3f8dcd971e48b9b59c9e9 Mon Sep 17 00:00:00 2001 From: Shav Kinderlehrer Date: Mon, 8 Jan 2024 12:57:25 -0500 Subject: [PATCH] Update itemView --- Jel.xcodeproj/project.pbxproj | 8 +++--- Jel/Controllers/SettingsController.swift | 24 ----------------- Jel/Views/ContentView.swift | 16 +++-------- .../Dashboard/DashboardLibraryView.swift | 1 + Jel/Views/Library/Item/ItemHeaderView.swift | 19 ++++++------- Jel/Views/Library/Item/ItemInfoView.swift | 21 ++++++++++----- Jel/Views/Library/Item/ItemPeopleView.swift | 27 +++++++++++++++++++ .../Library/Item/Types/ItemMovieView.swift | 6 ++++- Jel/Views/Library/LibraryDetailView.swift | 3 ++- Jel/Views/Settings/AppearancePicker.swift | 25 ----------------- Jel/Views/Settings/SettingsView.swift | 16 ----------- 11 files changed, 65 insertions(+), 101 deletions(-) create mode 100644 Jel/Views/Library/Item/ItemPeopleView.swift delete mode 100644 Jel/Views/Settings/AppearancePicker.swift diff --git a/Jel.xcodeproj/project.pbxproj b/Jel.xcodeproj/project.pbxproj index 2190f02..ae590fc 100644 --- a/Jel.xcodeproj/project.pbxproj +++ b/Jel.xcodeproj/project.pbxproj @@ -19,7 +19,6 @@ 3D16FC3C2B2CDFB500E6D8B3 /* DashboardLibraryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D16FC3B2B2CDFB500E6D8B3 /* DashboardLibraryView.swift */; }; 3D3816C92B4B5648006414D7 /* ItemGenresView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3816C82B4B5648006414D7 /* ItemGenresView.swift */; }; 3D3816CE2B4B78BB006414D7 /* VisibilityTrackingScrollView in Frameworks */ = {isa = PBXBuildFile; productRef = 3D3816CD2B4B78BB006414D7 /* VisibilityTrackingScrollView */; }; - 3D41D1F52B2C962500E58234 /* AppearancePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D41D1F42B2C962500E58234 /* AppearancePicker.swift */; }; 3D41D1FA2B2CAE0000E58234 /* ItemIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D41D1F92B2CAE0000E58234 /* ItemIconView.swift */; }; 3D4C15722B3CAA670035373E /* DashboardSectionTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D4C15712B3CAA670035373E /* DashboardSectionTitleView.swift */; }; 3D7709392B29139700199889 /* Pulse in Frameworks */ = {isa = PBXBuildFile; productRef = 3D7709382B29139700199889 /* Pulse */; }; @@ -41,6 +40,7 @@ 3DAFA8EA2B39039900D71AD1 /* JellyfinKitExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAFA8E92B39039900D71AD1 /* JellyfinKitExtensions.swift */; }; 3DAFA8EC2B394F9F00D71AD1 /* ViewConditionalMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAFA8EB2B394F9F00D71AD1 /* ViewConditionalMethod.swift */; }; 3DAFA8EF2B3B707B00D71AD1 /* ItemMovieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAFA8EE2B3B707B00D71AD1 /* ItemMovieView.swift */; }; + 3DBAC9E22B4C31BE005F8764 /* ItemPeopleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DBAC9E12B4C31BE005F8764 /* ItemPeopleView.swift */; }; 3DC6BA2D2B2A422300416B9F /* SettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC6BA2C2B2A422300416B9F /* SettingsController.swift */; }; 3DDD67932B293BC40026781E /* DashboardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DDD67922B293BC40026781E /* DashboardView.swift */; }; 3DDD67962B29E28B0026781E /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DDD67952B29E28B0026781E /* SettingsView.swift */; }; @@ -88,7 +88,6 @@ 3D13F96E2B38A32500E91913 /* StickyHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickyHeaderView.swift; sourceTree = ""; }; 3D16FC3B2B2CDFB500E6D8B3 /* DashboardLibraryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardLibraryView.swift; sourceTree = ""; }; 3D3816C82B4B5648006414D7 /* ItemGenresView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemGenresView.swift; sourceTree = ""; }; - 3D41D1F42B2C962500E58234 /* AppearancePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearancePicker.swift; sourceTree = ""; }; 3D41D1F92B2CAE0000E58234 /* ItemIconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemIconView.swift; sourceTree = ""; }; 3D4C15712B3CAA670035373E /* DashboardSectionTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardSectionTitleView.swift; sourceTree = ""; }; 3D8AB2A42B36440D005BD7D0 /* BlurHashDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlurHashDecode.swift; sourceTree = ""; }; @@ -111,6 +110,7 @@ 3DAFA8E92B39039900D71AD1 /* JellyfinKitExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JellyfinKitExtensions.swift; sourceTree = ""; }; 3DAFA8EB2B394F9F00D71AD1 /* ViewConditionalMethod.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewConditionalMethod.swift; sourceTree = ""; }; 3DAFA8EE2B3B707B00D71AD1 /* ItemMovieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemMovieView.swift; sourceTree = ""; }; + 3DBAC9E12B4C31BE005F8764 /* ItemPeopleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemPeopleView.swift; sourceTree = ""; }; 3DC0E5802B2832B9001CCE96 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 3DC6BA2C2B2A422300416B9F /* SettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsController.swift; sourceTree = ""; }; 3DDD67922B293BC40026781E /* DashboardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardView.swift; sourceTree = ""; }; @@ -193,6 +193,7 @@ 3DAFA8E72B38AFED00D71AD1 /* ItemInfoView.swift */, 3D13F9642B37EC7A00E91913 /* ItemHeaderView.swift */, 3D3816C82B4B5648006414D7 /* ItemGenresView.swift */, + 3DBAC9E12B4C31BE005F8764 /* ItemPeopleView.swift */, ); path = Item; sourceTree = ""; @@ -308,7 +309,6 @@ isa = PBXGroup; children = ( 3DDD67952B29E28B0026781E /* SettingsView.swift */, - 3D41D1F42B2C962500E58234 /* AppearancePicker.swift */, ); path = Settings; sourceTree = ""; @@ -483,7 +483,7 @@ 3D1015E42B28000E00F5C29A /* AuthStateController.swift in Sources */, 3D13F95F2B375DB800E91913 /* ItemView.swift in Sources */, 3DDD67962B29E28B0026781E /* SettingsView.swift in Sources */, - 3D41D1F52B2C962500E58234 /* AppearancePicker.swift in Sources */, + 3DBAC9E22B4C31BE005F8764 /* ItemPeopleView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Jel/Controllers/SettingsController.swift b/Jel/Controllers/SettingsController.swift index 2b912c4..29820d9 100644 --- a/Jel/Controllers/SettingsController.swift +++ b/Jel/Controllers/SettingsController.swift @@ -7,38 +7,14 @@ import Foundation -enum AppearanceState: Int, CaseIterable, Identifiable, CustomStringConvertible { - case automatic - case light - case dark - - var id: Self { self } - - var description: String { - switch self { - case .light: - return "Light" - case .dark: - return "Dark" - case .automatic: - return "Automatic" - } - } -} - class SettingsController: ObservableObject { static let shared: SettingsController = SettingsController() - @Published var appearance: AppearanceState = .automatic - private let defaults = UserDefaults.standard func save() { - defaults.set(self.appearance.rawValue, forKey: "Settings_appearance") } func load() { - let oldAppearance = defaults.integer(forKey: "Settings_appearance") - self.appearance = AppearanceState(rawValue: oldAppearance) ?? .automatic } } diff --git a/Jel/Views/ContentView.swift b/Jel/Views/ContentView.swift index 700f2a2..6c5ec59 100644 --- a/Jel/Views/ContentView.swift +++ b/Jel/Views/ContentView.swift @@ -25,19 +25,9 @@ struct ContentView: View { } } } - .preferredColorScheme({ - switch settingsController.appearance { - case .dark: - return ColorScheme.dark - case .light: - return ColorScheme.light - case .automatic: - return .none - } - }()) } } -#Preview { - ContentView() -} +//#Preview { +// ContentView() +//} diff --git a/Jel/Views/Dashboard/DashboardLibraryView.swift b/Jel/Views/Dashboard/DashboardLibraryView.swift index 19f7bf3..b2a8449 100644 --- a/Jel/Views/Dashboard/DashboardLibraryView.swift +++ b/Jel/Views/Dashboard/DashboardLibraryView.swift @@ -33,6 +33,7 @@ struct DashboardLibraryView: View { } label: { ItemIconView(item: library, height: 150) .setAspectRatio(library.primaryImageAspectRatio) + .showCaption() } .buttonStyle(PlainButtonStyle()) } diff --git a/Jel/Views/Library/Item/ItemHeaderView.swift b/Jel/Views/Library/Item/ItemHeaderView.swift index 3b5769a..afcc21e 100644 --- a/Jel/Views/Library/Item/ItemHeaderView.swift +++ b/Jel/Views/Library/Item/ItemHeaderView.swift @@ -11,11 +11,13 @@ import JellyfinKit struct ItemHeaderView: View { var item: BaseItemDto - let overlayGradient = LinearGradient(gradient: Gradient(stops: [ + let overlayGradientMask = LinearGradient(gradient: Gradient(stops: [ .init(color: .clear, location: 0), - .init(color: .black, location: 0.5), - // .init(color: .black, location: 0.7), - // .init(color: .clear, location: 1) + .init(color: .black, location: 0.3), + ]), startPoint: .bottom, endPoint: .top) + let overlayGradient = LinearGradient(gradient: Gradient(stops: [ + .init(color: .black, location: 0), + .init(color: .clear, location: 0.5) ]), startPoint: .bottom, endPoint: .top) var body: some View { @@ -23,12 +25,8 @@ struct ItemHeaderView: View { StickyHeaderView(minHeight: 300) { ItemIconView(item: item, imageType: "Backdrop", contentMode: .fill) .setCornerRadius(0) - .mask(overlayGradient) - .background { - ItemIconView(item: item, imageType: "Backdrop", contentMode: .fill) - .setCornerRadius(0) - .blur(radius: 50) - } + .overlay(overlayGradient.opacity(0.8)) + .mask(overlayGradientMask) } HStack { @@ -38,7 +36,6 @@ struct ItemHeaderView: View { .frame(alignment: .leading) Spacer() ItemInfoView(item: item) - .foregroundStyle(.white) } .padding([.leading, .trailing]) } diff --git a/Jel/Views/Library/Item/ItemInfoView.swift b/Jel/Views/Library/Item/ItemInfoView.swift index 0e1ce11..bafbc9f 100644 --- a/Jel/Views/Library/Item/ItemInfoView.swift +++ b/Jel/Views/Library/Item/ItemInfoView.swift @@ -15,15 +15,24 @@ struct ItemInfoView: View { VStack(alignment: .leading) { HStack { Text((item.productionYear != nil) ? String(item.productionYear!) : "---") - .shadow(color: .black, radius: 1) Text("•") - .shadow(color: .black, radius: 1) Text(item.genres?.first ?? "---") - .shadow(color: .black, radius: 1) } - if item.type == .movie { - Text(item.getRuntime() ?? "-:--") - .shadow(color: .black, radius: 1) + + HStack { + if item.type == .movie { + Text(item.getRuntime() ?? "-:--") + } + if let officialRating = item.officialRating { + Text(officialRating) + .bold() + .padding(2) + .overlay { + RoundedRectangle(cornerSize: CGSize(width: 2, height: 2), style: .continuous) + .stroke(.gray) + } + .foregroundStyle(.gray) + } } } .font(.caption) diff --git a/Jel/Views/Library/Item/ItemPeopleView.swift b/Jel/Views/Library/Item/ItemPeopleView.swift new file mode 100644 index 0000000..b8b0846 --- /dev/null +++ b/Jel/Views/Library/Item/ItemPeopleView.swift @@ -0,0 +1,27 @@ +// +// ItemPeopleView.swift +// Jel +// +// Created by zerocool on 1/8/24. +// + +import SwiftUI +import JellyfinKit + +struct ItemPeopleView: View { + var item: BaseItemDto + + var body: some View { + ScrollView(.horizontal) { + HStack { + ForEach(item.people ?? []) {person in + Text(person.name ?? "---") + } + } + } + } +} + +//#Preview { +// ItemPeopleView() +//} diff --git a/Jel/Views/Library/Item/Types/ItemMovieView.swift b/Jel/Views/Library/Item/Types/ItemMovieView.swift index 5a9100b..b621d2e 100644 --- a/Jel/Views/Library/Item/Types/ItemMovieView.swift +++ b/Jel/Views/Library/Item/Types/ItemMovieView.swift @@ -9,7 +9,8 @@ import SwiftUI import JellyfinKit struct ItemMovieView: View { - @State var item: BaseItemDto + var item: BaseItemDto + var body: some View { VStack { ItemMediaView(item: item) { @@ -18,7 +19,10 @@ struct ItemMovieView: View { } .buttonStyle(.borderedProminent) } + + ItemPeopleView(item: item) } + .padding() } } diff --git a/Jel/Views/Library/LibraryDetailView.swift b/Jel/Views/Library/LibraryDetailView.swift index 8c74140..c85651d 100644 --- a/Jel/Views/Library/LibraryDetailView.swift +++ b/Jel/Views/Library/LibraryDetailView.swift @@ -88,7 +88,8 @@ struct LibraryDetailView: View { .genres, .taglines, .overview, - .parentID] + .parentID, + .people] ) let request = Paths.getItems(parameters: params) diff --git a/Jel/Views/Settings/AppearancePicker.swift b/Jel/Views/Settings/AppearancePicker.swift deleted file mode 100644 index 93edead..0000000 --- a/Jel/Views/Settings/AppearancePicker.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// AppearancePicker.swift -// Jel -// -// Created by zerocool on 12/15/23. -// - -import SwiftUI - -struct AppearancePicker: View { - @ObservedObject var settingsController: SettingsController = SettingsController.shared - - var body: some View { - Picker("Appearance", selection: $settingsController.appearance) { - ForEach(AppearanceState.allCases) { option in - Text(String(describing: option)) - } - } - .pickerStyle(.menu) - } -} - -#Preview { - AppearancePicker() -} diff --git a/Jel/Views/Settings/SettingsView.swift b/Jel/Views/Settings/SettingsView.swift index 174573d..cff1fc3 100644 --- a/Jel/Views/Settings/SettingsView.swift +++ b/Jel/Views/Settings/SettingsView.swift @@ -43,12 +43,6 @@ struct SettingsView: View { Text("Current User") } - Section() { - AppearancePicker() - } header: { - Text("Accessibility") - } - Section() { NavigationLink { ConsoleView() @@ -72,16 +66,6 @@ struct SettingsView: View { } } } - .preferredColorScheme({ - switch settingsController.appearance { - case .dark: - return ColorScheme.dark - case .light: - return ColorScheme.light - case .automatic: - return .none - } - }()) } } }