Skip to content
This repository was archived by the owner on Jan 14, 2024. It is now read-only.

Commit 992bb09

Browse files
committed
Add sorting and settings buttons to CoverFlow
1 parent ec099ae commit 992bb09

File tree

4 files changed

+54
-61
lines changed

4 files changed

+54
-61
lines changed

TheatricalMovieTrailers.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
isa = PBXGroup;
136136
children = (
137137
834FFDC3254085ED007E63C2 /* AVPlayerViewController+enterFullScreen.swift */,
138+
831CD8FA24ABEC36008EDC6F /* CustomDarkAppearance.swift */,
138139
833CB264253A147500E1D15C /* UIApplication+version+build.swift */,
139140
8396CA1924A6A756007734F0 /* current_720p.xml */,
140141
8396CA1B24A6A766007734F0 /* current.xml */,
@@ -166,7 +167,6 @@
166167
8380C5A224A6721A00CA1EB4 /* ExternalView.swift */,
167168
8316E10124A64CD500467F14 /* ExternalTrailerView.swift */,
168169
8334EF7A252E697300A1EB87 /* ExternalMovieMetaView.swift */,
169-
831CD8FA24ABEC36008EDC6F /* CustomDarkAppearance.swift */,
170170
830AA4182536FB94006A3AEB /* TrailerPlayerView.swift */,
171171
83D2117725405FC900EF54A3 /* InlineTrailerPlayerView.swift */,
172172
8380C59D24A66F3000CA1EB4 /* TrailerListView.swift */,

TheatricalMovieTrailers/Views/CompactTrailerListView.swift

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -8,53 +8,9 @@
88
import SwiftUI
99

1010
struct CompactTrailerListView: View {
11-
enum SortingMode: String {
12-
case TitleAscending = "Title (A-Z)"
13-
case ReleaseAscending = "Release date"
14-
case ReleaseDescending = "Release (reversed)"
15-
16-
func nextMode() -> SortingMode {
17-
switch self {
18-
case .TitleAscending:
19-
return .ReleaseAscending
20-
case .ReleaseAscending:
21-
return .ReleaseDescending
22-
default:
23-
return .TitleAscending
24-
}
25-
}
26-
27-
var predicate: ((MovieInfo, MovieInfo) -> Bool) {
28-
get {
29-
switch self {
30-
case .ReleaseAscending:
31-
return {
32-
if let r0 = $0.releaseDate, let r1 = $1.releaseDate {
33-
return r0 < r1
34-
} else {
35-
return $0.title < $1.title
36-
}
37-
}
38-
case .ReleaseDescending:
39-
return {
40-
if let r0 = $0.releaseDate, let r1 = $1.releaseDate {
41-
return r0 > r1
42-
} else {
43-
return $0.title < $1.title
44-
}
45-
}
46-
default:
47-
return {
48-
return $0.title < $1.title
49-
}
50-
}
51-
}
52-
}
53-
}
54-
5511
@Binding var model: [MovieInfo]
12+
@Binding var sortingMode: SortingMode
5613
@State private var showingSettings = false
57-
@State var sortingMode = SortingMode.ReleaseAscending
5814

5915
var body: some View {
6016
GeometryReader { geo in
@@ -112,7 +68,7 @@ struct CompactTrailerListView: View {
11268
#if DEBUG
11369
struct CompactTrailerListView_Previews: PreviewProvider {
11470
static var previews: some View {
115-
CompactTrailerListView(model: .constant([MovieInfo.Example.AQuietPlaceII, MovieInfo.Example.AQuietPlaceII]))
71+
CompactTrailerListView(model: .constant([MovieInfo.Example.AQuietPlaceII]), sortingMode: .constant(.ReleaseAscending))
11672
.colorScheme(.dark)
11773
.background(Color.black)
11874
}

TheatricalMovieTrailers/Views/CoverFlowScrollView.swift

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ struct CoverFlowScrollView: View {
1212
private let scrollAnchor = UnitPoint(x: 0.5, y: 1.0)
1313

1414
@Binding var model: [MovieInfo]
15+
@Binding var sortingMode: SortingMode
1516
@State private var centeringItem: MovieInfo? = nil
1617
@State private var centeredItem: MovieInfo? = nil
1718
@State private var playingTrailer: MovieInfo? = nil
18-
19-
@ObservedObject private var appDelegate = UIApplication.shared.delegate as! AppDelegate
20-
19+
@State private var settingsPresented = false
20+
2121
var body: some View {
2222
GeometryReader { frame in
2323
ScrollView(.vertical, showsIndicators: false) {
@@ -65,8 +65,49 @@ struct CoverFlowScrollView: View {
6565
Spacer()
6666
}
6767
.frame(height: frame.size.height * 2)
68+
.fullScreenCover(item: $playingTrailer) { info in
69+
InlineTrailerPlayerView(url: info.trailerURL!, enterFullScreenOnAppear: true)
70+
.modifier(CustomDarkAppearance())
71+
}
6872

6973
// back in ZStack
74+
VStack(alignment: .trailing) {
75+
HStack {
76+
Button(action: {
77+
let nextMode = sortingMode.nextMode()
78+
DispatchQueue.global(qos: .userInteractive).async {
79+
let sortedModel = model.sorted(by: nextMode.predicate)
80+
DispatchQueue.main.async {
81+
sortingMode = nextMode
82+
model = sortedModel
83+
}
84+
}
85+
}, label: {
86+
HStack {
87+
Image(systemName: "arrow.up.arrow.down")
88+
Text(sortingMode.rawValue)
89+
}
90+
})
91+
92+
Spacer()
93+
94+
Button {
95+
settingsPresented = true
96+
} label: {
97+
HStack {
98+
Image(systemName: "gearshape")
99+
.accessibility(label: Text("Settings"))
100+
Text("Settings")
101+
}
102+
}
103+
.sheet(isPresented: $settingsPresented) {
104+
SettingsView(isPresented: $settingsPresented)
105+
}
106+
}.padding()
107+
// pin buttons to top
108+
Spacer()
109+
}
110+
70111
// Movie Metadata
71112
if let info = centeredItem, info.trailerURL != nil {
72113
CoverFlowMovieMetaView(model: centeredItem ?? MovieInfo.Empty, onTap: { info in
@@ -90,10 +131,6 @@ struct CoverFlowScrollView: View {
90131
.onAppear {
91132
centeredItem = model.first
92133
}
93-
.fullScreenCover(item: $playingTrailer) { info in
94-
InlineTrailerPlayerView(url: info.trailerURL!, enterFullScreenOnAppear: true)
95-
.modifier(CustomDarkAppearance())
96-
}
97134
}
98135

99136
private func playTrailer(_ info: MovieInfo) {
@@ -106,7 +143,7 @@ struct CoverFlowScrollView: View {
106143
#if DEBUG
107144
struct CoverFlowScrollView_Previews: PreviewProvider {
108145
static var previews: some View {
109-
CoverFlowScrollView(model: .constant([MovieInfo.Example.AQuietPlaceII]))
146+
CoverFlowScrollView(model: .constant([MovieInfo.Example.AQuietPlaceII]), sortingMode: .constant(.ReleaseAscending))
110147
}
111148
}
112149
#endif

TheatricalMovieTrailers/Views/MovieInfoOverView.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,24 @@ struct MovieInfoOverView: View {
1717

1818
@ObservedObject private var settings = Settings.instance()
1919
@State var model: [MovieInfo]
20-
@State var sortingMode = SortingMode.ReleaseAscending
20+
@State private var sortingMode = SortingMode.ReleaseAscending
2121

2222
var body: some View {
2323
Group {
2424
if verticalSizeClass == .compact || horizontalSizeClass == .compact {
2525
if settings.isCoverFlow {
26-
CoverFlowScrollView(model: $model)
26+
CoverFlowScrollView(model: $model, sortingMode: $sortingMode)
2727
} else {
28-
CompactTrailerListView(model: $model)
28+
CompactTrailerListView(model: $model, sortingMode: $sortingMode)
2929
}
3030
} else {
3131
// iPad gets a nice sidebar with posters
3232
TrailerListView(model: $model, sortingMode: $sortingMode)
33-
.onChange(of: sortingMode) { sortingMode in
34-
model.sort(by: sortingMode.predicate)
35-
}
3633
}
3734
}
35+
.onChange(of: sortingMode) { sortingMode in
36+
model.sort(by: sortingMode.predicate)
37+
}
3838
}
3939
}
4040

0 commit comments

Comments
 (0)