Parcourir la source

feat: implement move for Project/Task/SubTask

Sam Jaffe il y a 2 semaines
Parent
commit
4fe1951ccc
3 fichiers modifiés avec 20 ajouts et 3 suppressions
  1. 1 0
      Todos/Model/Project.swift
  2. 11 1
      Todos/View/ContentView.swift
  3. 8 2
      Todos/View/ProjectPanelView.swift

+ 1 - 0
Todos/Model/Project.swift

@@ -10,6 +10,7 @@ import SwiftData
 
 @Model
 final class Project : Codable {
+  var sortOrder: Int = 0
   var timestamp: Date
   var category: String = ""
   var name: String = "New Project"

+ 11 - 1
Todos/View/ContentView.swift

@@ -13,7 +13,7 @@ struct ContentView: View {
   @AppStorage(UserDefaultsKeys.WeekStart) private var weekStart = Date()
   let inPreview = ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
   
-  @Query private var items: [Project]
+  @Query(sort: \Project.sortOrder) private var items: [Project]
   @State private var selection: Project?
 
   var body: some View {
@@ -28,6 +28,7 @@ struct ContentView: View {
             }
           }
         }
+        .onMove(perform: reOrder)
         .onDelete(perform: deleteItems)
       }
       .navigationSplitViewColumnWidth(min: 180, ideal: 200)
@@ -56,6 +57,15 @@ struct ContentView: View {
     }
   }
   
+  private func reOrder(fromOffsets: IndexSet, toOffset: Int) {
+    var s = items.sorted(by: { $0.sortOrder < $1.sortOrder })
+    s.move(fromOffsets: fromOffsets, toOffset: toOffset)
+    for (index, item) in s.enumerated() {
+      item.sortOrder = index
+    }
+    try? self.modelContext.save()
+  }
+  
   private func autosave() {
     if inPreview {
       // This isn't great, but we shouldn't be running this in a preview

+ 8 - 2
Todos/View/ProjectPanelView.swift

@@ -56,8 +56,14 @@ struct ProjectPanelView: View {
                 deleteItem(item: subtask.wrappedValue, from: task.wrappedValue)
               }
             }
-        }
-      }
+        }.onMove(perform: { indices, index in
+          withAnimation {
+            task.subtasks.wrappedValue.move(fromOffsets: indices, toOffset: index)
+          }
+        })
+      }.onMove(perform: { indices, index in
+        item.tasks.move(fromOffsets: indices, toOffset: index)
+      })
     }
   }