From 6b8d3372d21149ed0efb4d43bf0cab44bd24f9a4 Mon Sep 17 00:00:00 2001 From: Shav Kinderlehrer Date: Thu, 11 Jan 2024 20:44:49 -0500 Subject: [PATCH] Implement peopleView --- Jel.xcodeproj/project.pbxproj | 4 +-- .../xcschemes/xcschememanagement.plist | 2 +- .../{Library => }/Item/ItemGenresView.swift | 0 .../{Library => }/Item/ItemHeaderView.swift | 0 .../{Library => Item}/ItemIconView.swift | 0 .../{Library => }/Item/ItemInfoView.swift | 0 .../{Library => }/Item/ItemMediaView.swift | 1 - Jel/Views/{Library => }/Item/ItemView.swift | 0 .../Item/Person/ItemPeopleView.swift | 13 ++++++-- .../Item/Person/ItemPersonIconView.swift | 31 +++++++++++-------- .../Item/Types/ItemMovieView.swift | 6 +++- TODO.txt | 10 ++++++ 12 files changed, 47 insertions(+), 20 deletions(-) rename Jel/Views/{Library => }/Item/ItemGenresView.swift (100%) rename Jel/Views/{Library => }/Item/ItemHeaderView.swift (100%) rename Jel/Views/{Library => Item}/ItemIconView.swift (100%) rename Jel/Views/{Library => }/Item/ItemInfoView.swift (100%) rename Jel/Views/{Library => }/Item/ItemMediaView.swift (96%) rename Jel/Views/{Library => }/Item/ItemView.swift (100%) rename Jel/Views/{Library => }/Item/Person/ItemPeopleView.swift (58%) rename Jel/Views/{Library => }/Item/Person/ItemPersonIconView.swift (65%) rename Jel/Views/{Library => }/Item/Types/ItemMovieView.swift (86%) create mode 100644 TODO.txt diff --git a/Jel.xcodeproj/project.pbxproj b/Jel.xcodeproj/project.pbxproj index 4fe0af5..6237f55 100644 --- a/Jel.xcodeproj/project.pbxproj +++ b/Jel.xcodeproj/project.pbxproj @@ -161,6 +161,7 @@ 3D13F96D2B38A31300E91913 /* Utility */, 3D9063CC2B279A310063DD2A /* ContentView.swift */, 3DDD67902B293B780026781E /* Dashboard */, + 3D13F95D2B375DAC00E91913 /* Item */, 3D8AB2A62B366309005BD7D0 /* Library */, 3DDD67942B29E27A0026781E /* Settings */, 3D91FDC52B28C28900919017 /* SignIn */, @@ -194,6 +195,7 @@ 3D13F95D2B375DAC00E91913 /* Item */ = { isa = PBXGroup; children = ( + 3D41D1F92B2CAE0000E58234 /* ItemIconView.swift */, 3DAFA8ED2B3B707100D71AD1 /* Types */, 3DBAC9E82B4C891C005F8764 /* Person */, 3D13F95E2B375DB800E91913 /* ItemView.swift */, @@ -217,8 +219,6 @@ 3D8AB2A62B366309005BD7D0 /* Library */ = { isa = PBXGroup; children = ( - 3D13F95D2B375DAC00E91913 /* Item */, - 3D41D1F92B2CAE0000E58234 /* ItemIconView.swift */, 3D8AB2A72B366353005BD7D0 /* LibraryDetailView.swift */, ); path = Library; diff --git a/Jel.xcodeproj/xcuserdata/zerocool.xcuserdatad/xcschemes/xcschememanagement.plist b/Jel.xcodeproj/xcuserdata/zerocool.xcuserdatad/xcschemes/xcschememanagement.plist index 4bb5b56..27d21d3 100644 --- a/Jel.xcodeproj/xcuserdata/zerocool.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Jel.xcodeproj/xcuserdata/zerocool.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ Jel.xcscheme_^#shared#^_ orderHint - 1 + 0 JellyfinClient.xcscheme_^#shared#^_ diff --git a/Jel/Views/Library/Item/ItemGenresView.swift b/Jel/Views/Item/ItemGenresView.swift similarity index 100% rename from Jel/Views/Library/Item/ItemGenresView.swift rename to Jel/Views/Item/ItemGenresView.swift diff --git a/Jel/Views/Library/Item/ItemHeaderView.swift b/Jel/Views/Item/ItemHeaderView.swift similarity index 100% rename from Jel/Views/Library/Item/ItemHeaderView.swift rename to Jel/Views/Item/ItemHeaderView.swift diff --git a/Jel/Views/Library/ItemIconView.swift b/Jel/Views/Item/ItemIconView.swift similarity index 100% rename from Jel/Views/Library/ItemIconView.swift rename to Jel/Views/Item/ItemIconView.swift diff --git a/Jel/Views/Library/Item/ItemInfoView.swift b/Jel/Views/Item/ItemInfoView.swift similarity index 100% rename from Jel/Views/Library/Item/ItemInfoView.swift rename to Jel/Views/Item/ItemInfoView.swift diff --git a/Jel/Views/Library/Item/ItemMediaView.swift b/Jel/Views/Item/ItemMediaView.swift similarity index 96% rename from Jel/Views/Library/Item/ItemMediaView.swift rename to Jel/Views/Item/ItemMediaView.swift index 1d1e53d..be8264a 100644 --- a/Jel/Views/Library/Item/ItemMediaView.swift +++ b/Jel/Views/Item/ItemMediaView.swift @@ -21,7 +21,6 @@ struct ItemMediaView: View { Text(item.taglines?.count ?? 0 > 0 ? item.taglines?[0] ?? "" : "") .font(.headline) .frame(maxWidth: .infinity, alignment: .leading) - .padding(.bottom) ForEach(item.overview?.components(separatedBy: "
") ?? [], id: \.self) {overview in Text(overview) diff --git a/Jel/Views/Library/Item/ItemView.swift b/Jel/Views/Item/ItemView.swift similarity index 100% rename from Jel/Views/Library/Item/ItemView.swift rename to Jel/Views/Item/ItemView.swift diff --git a/Jel/Views/Library/Item/Person/ItemPeopleView.swift b/Jel/Views/Item/Person/ItemPeopleView.swift similarity index 58% rename from Jel/Views/Library/Item/Person/ItemPeopleView.swift rename to Jel/Views/Item/Person/ItemPeopleView.swift index 6e2a974..f007796 100644 --- a/Jel/Views/Library/Item/Person/ItemPeopleView.swift +++ b/Jel/Views/Item/Person/ItemPeopleView.swift @@ -20,9 +20,18 @@ struct ItemPeopleView: View { .padding(.leading) ScrollView(.horizontal) { - LazyHStack(alignment: .top) { + // FIXME: For some reason, a LazyHStack clips the text for this view + HStack(alignment: .top) { ForEach(item.people ?? [], id: \.iterId) {person in - ItemPersonIconView(person: person) + NavigationLink { + VStack { + ItemPersonIconView(person: person) + Text("Subview") + } + .navigationTitle(person.name ?? "Unnamed") + } label: { + ItemPersonIconView(person: person) + } } } .padding(.horizontal) diff --git a/Jel/Views/Library/Item/Person/ItemPersonIconView.swift b/Jel/Views/Item/Person/ItemPersonIconView.swift similarity index 65% rename from Jel/Views/Library/Item/Person/ItemPersonIconView.swift rename to Jel/Views/Item/Person/ItemPersonIconView.swift index a6e5161..b839deb 100644 --- a/Jel/Views/Library/Item/Person/ItemPersonIconView.swift +++ b/Jel/Views/Item/Person/ItemPersonIconView.swift @@ -11,12 +11,16 @@ import NukeUI struct ItemPersonIconPlaceholderView: View { var body: some View { - VStack { - Image(systemName: "person") + ZStack { + Color(uiColor: UIColor.secondarySystemBackground) + Image(systemName: "person.fill") .resizable() + .aspectRatio(contentMode: .fit) .padding() - .scaledToFit() + .foregroundStyle(Color(uiColor: UIColor.secondarySystemFill)) } + .frame(height: 150) + .clipShape(RoundedRectangle(cornerRadius: 5)) } } @@ -27,39 +31,40 @@ struct ItemPersonIconView: View { var person: BaseItemPerson @State var personImageUrl: URL? - @State var loading: Bool = true var body: some View { - VStack() { + VStack { LazyImage(url: personImageUrl) {state in if let image = state.image { image .resizable() + .aspectRatio(contentMode: .fit) .clipShape(RoundedRectangle(cornerRadius: 5)) } else { ItemPersonIconPlaceholderView() } } - .aspectRatio(contentMode: .fit) - .frame(width: 100, height: 170) + .frame(height: 170) - VStack { + VStack(alignment: .leading) { Text(person.name ?? "---") - .font(.callout) + .font(.footnote) + .lineLimit(nil) Text(person.role ?? "---") .font(.caption) - .foregroundStyle(.gray) + .foregroundStyle(Color(uiColor: UIColor.secondaryLabel)) + .fixedSize(horizontal: false, vertical: true) + .lineLimit(nil) } - .frame(width: 100) + .multilineTextAlignment(.leading) } - // .redacted(reason: loading ? .placeholder : []) + .frame(width: 100) .onAppear { Task { let request = Paths.getItemImage(itemID: person.id ?? "", imageType: "Primary") let serverUrl = jellyfinClient.getUrl() personImageUrl = serverUrl?.appending(path: request.url?.absoluteString ?? "") - // loading = false } } } diff --git a/Jel/Views/Library/Item/Types/ItemMovieView.swift b/Jel/Views/Item/Types/ItemMovieView.swift similarity index 86% rename from Jel/Views/Library/Item/Types/ItemMovieView.swift rename to Jel/Views/Item/Types/ItemMovieView.swift index 5181e73..5cb5c3b 100644 --- a/Jel/Views/Library/Item/Types/ItemMovieView.swift +++ b/Jel/Views/Item/Types/ItemMovieView.swift @@ -23,7 +23,7 @@ struct ItemMovieView: View { .onChange(of: geo.frame(in: .global).minY) { let minY = geo.frame(in: .global).minY - pageScrolled = minY < -100 + pageScrolled = minY < -150 } } } @@ -32,8 +32,12 @@ struct ItemMovieView: View { .padding() ItemGenresView(item: item) + .padding(.bottom) + .foregroundStyle(Color.primary) ItemPeopleView(item: item) + .padding(.bottom) + .foregroundStyle(Color.primary) } .navigationBarTitleDisplayMode(.inline) .navigationTitle(item.name ?? "Untitled") diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000..a2f41e4 --- /dev/null +++ b/TODO.txt @@ -0,0 +1,10 @@ +=== +TODO + +- Implement play button + +=== +DONE + +- Use Color.seondaryLabel for gray text +- Fix text wrapping on ItemPersonIconView