parent
4dae6bc00e
commit
e4f627baeb
|
@ -46,6 +46,7 @@
|
|||
62133890265F83A900A81A2A /* LibraryListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6213388F265F83A900A81A2A /* LibraryListView.swift */; };
|
||||
621338932660107500A81A2A /* String++.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338922660107500A81A2A /* String++.swift */; };
|
||||
62133895266096EF00A81A2A /* LibraryListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62133894266096EF00A81A2A /* LibraryListViewModel.swift */; };
|
||||
621338B32660A07800A81A2A /* LazyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338B22660A07800A81A2A /* LazyView.swift */; };
|
||||
6273DD43265F4195009C1D0B /* Moya in Frameworks */ = {isa = PBXBuildFile; productRef = 6273DD42265F4195009C1D0B /* Moya */; };
|
||||
6273DD45265F4195009C1D0B /* CombineMoya in Frameworks */ = {isa = PBXBuildFile; productRef = 6273DD44265F4195009C1D0B /* CombineMoya */; };
|
||||
6273DD48265F41B3009C1D0B /* JellyfinAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6273DD47265F41B3009C1D0B /* JellyfinAPI.swift */; };
|
||||
|
@ -114,6 +115,7 @@
|
|||
6213388F265F83A900A81A2A /* LibraryListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryListView.swift; sourceTree = "<group>"; };
|
||||
621338922660107500A81A2A /* String++.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String++.swift"; sourceTree = "<group>"; };
|
||||
62133894266096EF00A81A2A /* LibraryListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryListViewModel.swift; sourceTree = "<group>"; };
|
||||
621338B22660A07800A81A2A /* LazyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyView.swift; sourceTree = "<group>"; };
|
||||
6273DD47265F41B3009C1D0B /* JellyfinAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JellyfinAPI.swift; sourceTree = "<group>"; };
|
||||
6273DD4D265F47B2009C1D0B /* LibrarySearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrarySearchViewModel.swift; sourceTree = "<group>"; };
|
||||
AE8C3153265D60BF008AA076 /* SettingsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsModel.swift; sourceTree = "<group>"; };
|
||||
|
@ -162,6 +164,7 @@
|
|||
5377CBF3263B596A003A4E83 /* JellyfinPlayer */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
621338B12660A06F00A81A2A /* SwiftUI */,
|
||||
621338912660106C00A81A2A /* Extensions */,
|
||||
6273DD4A265F4794009C1D0B /* Domains */,
|
||||
6273DD46265F419B009C1D0B /* APIs */,
|
||||
|
@ -239,6 +242,14 @@
|
|||
path = Extensions;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
621338B12660A06F00A81A2A /* SwiftUI */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
621338B22660A07800A81A2A /* LazyView.swift */,
|
||||
);
|
||||
path = SwiftUI;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
6273DD46265F419B009C1D0B /* APIs */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -420,6 +431,7 @@
|
|||
53E4E649263F725B00F67C6B /* MultiSelector.swift in Sources */,
|
||||
53E4E647263F6CF100F67C6B /* LibraryFilterView.swift in Sources */,
|
||||
6213388E265F777C00A81A2A /* LibraryViewModel.swift in Sources */,
|
||||
621338B32660A07800A81A2A /* LazyView.swift in Sources */,
|
||||
62133895266096EF00A81A2A /* LibraryListViewModel.swift in Sources */,
|
||||
6273DD48265F41B3009C1D0B /* JellyfinAPI.swift in Sources */,
|
||||
53892777263CBB000035E14B /* JellyApiTypings.swift in Sources */,
|
||||
|
|
|
@ -220,8 +220,10 @@ struct ContentView: View {
|
|||
Text("Latest \(library_names[library_id] ?? "")").font(.title2).fontWeight(.bold)
|
||||
.padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 16))
|
||||
Spacer()
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(parentID: library_id)),
|
||||
title: library_names[library_id] ?? "")) {
|
||||
NavigationLink(destination: LazyView {
|
||||
LibraryView(viewModel: .init(filter: Filter(parentID: library_id)),
|
||||
title: library_names[library_id] ?? "")
|
||||
}) {
|
||||
Text("See All").font(.subheadline).fontWeight(.bold)
|
||||
}
|
||||
}.padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
|
||||
|
|
|
@ -345,10 +345,12 @@ struct EpisodeItemView: View {
|
|||
HStack {
|
||||
Text("Genres:").font(.callout).fontWeight(.semibold)
|
||||
ForEach(fullItem.Genres, id: \.Id) { genre in
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(genres: [
|
||||
genre
|
||||
.Name,
|
||||
])), title: genre.Name)) {
|
||||
NavigationLink(destination: LazyView {
|
||||
LibraryView(viewModel: .init(filter: Filter(genres: [
|
||||
genre
|
||||
.Name,
|
||||
])), title: genre.Name)
|
||||
}) {
|
||||
Text(genre.Name).font(.footnote)
|
||||
}
|
||||
}
|
||||
|
@ -362,10 +364,12 @@ struct EpisodeItemView: View {
|
|||
HStack {
|
||||
Spacer().frame(width: 16)
|
||||
ForEach(fullItem.Cast, id: \.Id) { cast in
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(personIds: [
|
||||
cast
|
||||
.Id,
|
||||
])), title: cast.Name)) {
|
||||
NavigationLink(destination: LazyView {
|
||||
LibraryView(viewModel: .init(filter: Filter(personIds: [
|
||||
cast
|
||||
.Id,
|
||||
])), title: cast.Name)
|
||||
}) {
|
||||
VStack {
|
||||
WebImage(url: cast.Image)
|
||||
.resizable() // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size
|
||||
|
@ -564,10 +568,12 @@ struct EpisodeItemView: View {
|
|||
HStack {
|
||||
Text("Genres:").font(.callout).fontWeight(.semibold)
|
||||
ForEach(fullItem.Genres, id: \.Id) { genre in
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(genres: [
|
||||
genre
|
||||
.Name,
|
||||
])), title: genre.Name)) {
|
||||
NavigationLink(destination: LazyView {
|
||||
LibraryView(viewModel: .init(filter: Filter(genres: [
|
||||
genre
|
||||
.Name,
|
||||
])), title: genre.Name)
|
||||
}) {
|
||||
Text(genre.Name).font(.footnote)
|
||||
}
|
||||
}
|
||||
|
@ -582,10 +588,12 @@ struct EpisodeItemView: View {
|
|||
HStack {
|
||||
Spacer().frame(width: 16)
|
||||
ForEach(fullItem.Cast, id: \.Id) { cast in
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(personIds: [
|
||||
cast
|
||||
.Id,
|
||||
])), title: cast.Name)) {
|
||||
NavigationLink(destination: LazyView {
|
||||
LibraryView(viewModel: .init(filter: Filter(personIds: [
|
||||
cast
|
||||
.Id,
|
||||
])), title: cast.Name)
|
||||
}) {
|
||||
VStack {
|
||||
WebImage(url: cast.Image)
|
||||
.resizable() // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size
|
||||
|
|
|
@ -20,22 +20,22 @@ struct LibraryListView: View {
|
|||
List(viewModel.libraryIDs, id: \.self) { id in
|
||||
switch id {
|
||||
case "favorites":
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(filterTypes: [.isFavorite])),
|
||||
title: viewModel.libraryNames[id] ?? "")) {
|
||||
NavigationLink(destination: LazyView { LibraryView(viewModel: .init(filter: Filter(filterTypes: [.isFavorite])),
|
||||
title: viewModel.libraryNames[id] ?? "") }) {
|
||||
Text(viewModel.libraryNames[id] ?? "").foregroundColor(Color.primary)
|
||||
}
|
||||
case "genres":
|
||||
Text(viewModel.libraryNames[id] ?? "").foregroundColor(Color.primary)
|
||||
default:
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(parentID: id)),
|
||||
title: viewModel.libraryNames[id] ?? "")) {
|
||||
NavigationLink(destination: LazyView { LibraryView(viewModel: .init(filter: Filter(parentID: id)),
|
||||
title: viewModel.libraryNames[id] ?? "") }) {
|
||||
Text(viewModel.libraryNames[id] ?? "").foregroundColor(Color.primary)
|
||||
}
|
||||
}
|
||||
}
|
||||
.navigationTitle("All Media")
|
||||
.navigationBarItems(trailing:
|
||||
NavigationLink(destination: LibrarySearchView(viewModel: .init(filter: .init()))) {
|
||||
NavigationLink(destination: LazyView { LibrarySearchView(viewModel: .init(filter: .init())) }) {
|
||||
Image(systemName: "magnifyingglass")
|
||||
})
|
||||
}
|
||||
|
|
|
@ -96,7 +96,7 @@ struct LibraryView: View {
|
|||
Image(systemName: "chevron.right")
|
||||
}
|
||||
}
|
||||
NavigationLink(destination: LibrarySearchView(viewModel: .init(filter: viewModel.filter))) {
|
||||
NavigationLink(destination: LazyView { LibrarySearchView(viewModel: .init(filter: viewModel.filter)) }) {
|
||||
Image(systemName: "magnifyingglass")
|
||||
}
|
||||
Button {
|
||||
|
|
|
@ -434,11 +434,13 @@ struct MovieItemView: View {
|
|||
HStack {
|
||||
Text("Genres:").font(.callout).fontWeight(.semibold)
|
||||
ForEach(fullItem.Genres, id: \.Id) { genre in
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(genres: [
|
||||
NavigationLink(destination: LazyView {
|
||||
LibraryView(viewModel: .init(filter: Filter(genres: [
|
||||
genre
|
||||
.Name,
|
||||
])),
|
||||
title: genre.Name)) {
|
||||
title: genre.Name)
|
||||
}) {
|
||||
Text(genre.Name).font(.footnote)
|
||||
}
|
||||
}
|
||||
|
@ -452,10 +454,12 @@ struct MovieItemView: View {
|
|||
HStack {
|
||||
Spacer().frame(width: 16)
|
||||
ForEach(fullItem.Cast, id: \.Id) { cast in
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(personIds: [
|
||||
cast
|
||||
.Id,
|
||||
])), title: cast.Name)) {
|
||||
NavigationLink(destination: LazyView {
|
||||
LibraryView(viewModel: .init(filter: Filter(personIds: [
|
||||
cast
|
||||
.Id,
|
||||
])), title: cast.Name)
|
||||
}) {
|
||||
VStack {
|
||||
WebImage(url: cast.Image)
|
||||
.resizable() // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size
|
||||
|
@ -653,11 +657,13 @@ struct MovieItemView: View {
|
|||
HStack {
|
||||
Text("Genres:").font(.callout).fontWeight(.semibold)
|
||||
ForEach(fullItem.Genres, id: \.Id) { genre in
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(genres: [
|
||||
NavigationLink(destination: LazyView {
|
||||
LibraryView(viewModel: .init(filter: Filter(genres: [
|
||||
genre
|
||||
.Name,
|
||||
])),
|
||||
title: genre.Name)) {
|
||||
title: genre.Name)
|
||||
}) {
|
||||
Text(genre.Name).font(.footnote)
|
||||
}
|
||||
}
|
||||
|
@ -672,10 +678,12 @@ struct MovieItemView: View {
|
|||
HStack {
|
||||
Spacer().frame(width: 16)
|
||||
ForEach(fullItem.Cast, id: \.Id) { cast in
|
||||
NavigationLink(destination: LibraryView(viewModel: .init(filter: Filter(personIds: [
|
||||
cast
|
||||
.Id,
|
||||
])), title: cast.Name)) {
|
||||
NavigationLink(destination: LazyView {
|
||||
LibraryView(viewModel: .init(filter: Filter(personIds: [
|
||||
cast
|
||||
.Id,
|
||||
])), title: cast.Name)
|
||||
}) {
|
||||
VStack {
|
||||
WebImage(url: cast.Image)
|
||||
.resizable() // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
//
|
||||
// LazyView.swift
|
||||
// JellyfinPlayer
|
||||
//
|
||||
// Created by PangMo5 on 2021/05/28.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftUI
|
||||
|
||||
struct LazyView<Content: View>: View {
|
||||
var content: () -> Content
|
||||
var body: some View {
|
||||
self.content()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue