Sort review clips by active setting
This commit is contained in:
@@ -253,6 +253,9 @@ struct ContentView: View {
|
|||||||
selectedClipID = project?.clips.first?.id
|
selectedClipID = project?.clips.first?.id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.onChange(of: settings.sortMode) { sortMode in
|
||||||
|
processor.reorderProject(sortMode: sortMode)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private var statusHeader: some View {
|
private var statusHeader: some View {
|
||||||
@@ -307,7 +310,8 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func projectReviewPanel(_ project: GrowthLapseProject) -> some View {
|
private func projectReviewPanel(_ project: GrowthLapseProject) -> some View {
|
||||||
let selectedClip = project.clips.first { $0.id == selectedClipID } ?? project.clips.first
|
let orderedClips = orderedProjectClips(project.clips)
|
||||||
|
let selectedClip = orderedClips.first { $0.id == selectedClipID } ?? orderedClips.first
|
||||||
|
|
||||||
return VStack(alignment: .leading, spacing: 10) {
|
return VStack(alignment: .leading, spacing: 10) {
|
||||||
HStack {
|
HStack {
|
||||||
@@ -328,7 +332,7 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HStack(alignment: .top, spacing: 12) {
|
HStack(alignment: .top, spacing: 12) {
|
||||||
List(project.clips, selection: $selectedClipID) { clip in
|
List(orderedClips, selection: $selectedClipID) { clip in
|
||||||
VStack(alignment: .leading, spacing: 2) {
|
VStack(alignment: .leading, spacing: 2) {
|
||||||
HStack {
|
HStack {
|
||||||
Text(String(format: "%03d", clip.index))
|
Text(String(format: "%03d", clip.index))
|
||||||
@@ -429,6 +433,28 @@ struct ContentView: View {
|
|||||||
processor.project?.clips.first { $0.id == id }
|
processor.project?.clips.first { $0.id == id }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func orderedProjectClips(_ clips: [GrowthLapseProjectClip]) -> [GrowthLapseProjectClip] {
|
||||||
|
clips.sorted { left, right in
|
||||||
|
switch settings.sortMode {
|
||||||
|
case .filenameAscending:
|
||||||
|
return left.displayName.localizedStandardCompare(right.displayName) == .orderedAscending
|
||||||
|
case .ageWeeksAscending:
|
||||||
|
if left.ageWeeks != right.ageWeeks {
|
||||||
|
return (left.ageWeeks ?? Int.max) < (right.ageWeeks ?? Int.max)
|
||||||
|
}
|
||||||
|
return left.displayName.localizedStandardCompare(right.displayName) == .orderedAscending
|
||||||
|
case .modificationDateAscending:
|
||||||
|
return left.index < right.index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.enumerated()
|
||||||
|
.map { offset, clip in
|
||||||
|
var updated = clip
|
||||||
|
updated.index = offset + 1
|
||||||
|
return updated
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var errorBinding: Binding<Bool> {
|
private var errorBinding: Binding<Bool> {
|
||||||
Binding(
|
Binding(
|
||||||
get: {
|
get: {
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ final class VideoProcessor: ObservableObject {
|
|||||||
state = .running
|
state = .running
|
||||||
|
|
||||||
let settingsCopy = settings
|
let settingsCopy = settings
|
||||||
let projectCopy = project
|
let projectCopy = reorderedProject(project, sortMode: settings.sortMode)
|
||||||
renderTask = Task {
|
renderTask = Task {
|
||||||
do {
|
do {
|
||||||
let outcome = try await render(settings: settingsCopy, existingProject: projectCopy)
|
let outcome = try await render(settings: settingsCopy, existingProject: projectCopy)
|
||||||
@@ -106,6 +106,15 @@ final class VideoProcessor: ObservableObject {
|
|||||||
saveProject(project)
|
saveProject(project)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func reorderProject(sortMode: SortMode) {
|
||||||
|
guard let project else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let reordered = reorderedProject(project, sortMode: sortMode)
|
||||||
|
self.project = reordered
|
||||||
|
saveProject(reordered)
|
||||||
|
}
|
||||||
|
|
||||||
func confirmProjectAndDeleteCache() {
|
func confirmProjectAndDeleteCache() {
|
||||||
guard let project else {
|
guard let project else {
|
||||||
return
|
return
|
||||||
@@ -1039,6 +1048,41 @@ final class VideoProcessor: ObservableObject {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func reorderedProject(_ project: GrowthLapseProject, sortMode: SortMode) -> GrowthLapseProject {
|
||||||
|
var copy = project
|
||||||
|
copy.clips = sortedProjectClips(project.clips, sortMode: sortMode).enumerated().map { offset, clip in
|
||||||
|
var updated = clip
|
||||||
|
updated.index = offset + 1
|
||||||
|
return updated
|
||||||
|
}
|
||||||
|
return copy
|
||||||
|
}
|
||||||
|
|
||||||
|
private func sortedProjectClips(_ clips: [GrowthLapseProjectClip], sortMode: SortMode) -> [GrowthLapseProjectClip] {
|
||||||
|
clips.sorted { left, right in
|
||||||
|
switch sortMode {
|
||||||
|
case .filenameAscending:
|
||||||
|
return left.displayName.localizedStandardCompare(right.displayName) == .orderedAscending
|
||||||
|
case .ageWeeksAscending:
|
||||||
|
if left.ageWeeks != right.ageWeeks {
|
||||||
|
return (left.ageWeeks ?? Int.max) < (right.ageWeeks ?? Int.max)
|
||||||
|
}
|
||||||
|
return left.displayName.localizedStandardCompare(right.displayName) == .orderedAscending
|
||||||
|
case .modificationDateAscending:
|
||||||
|
let leftDate = modificationDate(for: left.sourceURL)
|
||||||
|
let rightDate = modificationDate(for: right.sourceURL)
|
||||||
|
if leftDate != rightDate {
|
||||||
|
return leftDate < rightDate
|
||||||
|
}
|
||||||
|
return left.displayName.localizedStandardCompare(right.displayName) == .orderedAscending
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func modificationDate(for url: URL) -> Date {
|
||||||
|
(try? url.resourceValues(forKeys: [.contentModificationDateKey]).contentModificationDate) ?? .distantPast
|
||||||
|
}
|
||||||
|
|
||||||
private func saveProject(_ project: GrowthLapseProject) {
|
private func saveProject(_ project: GrowthLapseProject) {
|
||||||
let url = GrowthLapseProject.url(for: project.outputFileURL)
|
let url = GrowthLapseProject.url(for: project.outputFileURL)
|
||||||
do {
|
do {
|
||||||
|
|||||||
Reference in New Issue
Block a user