Преглед изворни кода

refactor: switch from a popup to a SettingsPane for controlling URL Hints

Sam Jaffe пре 3 недеља
родитељ
комит
445b6800f7

+ 5 - 1
Todos/Model/URLHint.swift

@@ -8,10 +8,12 @@
 import Foundation
 import SwiftData
 
-final class URLHint {
+final class URLHint : Identifiable {
   var prefix: String = ""
   var replacement: String = ""
   
+  var id: String { prefix }
+  
   init() {}
   
   init(prefix: String, replacement: String) {
@@ -27,4 +29,6 @@ final class URLHint {
     let url = tag.id.replacingOccurrences(of: prefix, with: replacement)
     return URL(string: url)!
   }
+  
+  var valid: Bool { !prefix.isEmpty && !replacement.isEmpty }
 }

+ 11 - 3
Todos/TodosApp.swift

@@ -29,12 +29,20 @@ struct TodosApp: App {
   }()
 
   var body: some Scene {
-    let urlHints = UserDefaults.standard.array(forKey: UserDefaultsKeys.UrlHints)
-      as? URLHintArray.Serial
+    let urlHints = URLHintArray(
+      fromSerial: UserDefaults.standard.array(forKey: UserDefaultsKeys.UrlHints)
+      as? URLHintArray.Serial)
     WindowGroup {
         ContentView()
     }
     .modelContainer(sharedModelContainer)
-    .environmentObject(URLHintArray(fromSerial: urlHints))
+    .environmentObject(urlHints)
+    
+    #if os(macOS)
+    Settings {
+        SettingsView()
+    }
+    .environmentObject(urlHints)
+    #endif
   }
 }

+ 0 - 7
Todos/View/ContentView.swift

@@ -39,16 +39,9 @@ struct ContentView: View {
             Label("New Category", systemImage: "plus")
           }
         }
-        ToolbarItem {
-          Button(action: { showingPopup = true }) {
-            Label("New URL Hint", systemImage: "link")
-          }
-        }
       }
     } detail: {
       Text("Select an item")
-    } .popover(isPresented: $showingPopup) {
-      CreateHintPopover(showingPopup: $showingPopup)
     }
   }
 

+ 0 - 35
Todos/View/CreateHintPopover.swift

@@ -1,35 +0,0 @@
-//
-//  CreateHintPopover.swift
-//  Todos
-//
-//  Created by Sam Jaffe on 3/1/26.
-//
-
-import SwiftUI
-
-struct CreateHintPopover: View {
-  @Binding var showingPopup: Bool
-  @EnvironmentObject var allHints: URLHintArray
-  @State var currentHint: URLHint = URLHint()
-  
-  var body: some View {
-    TextField("", text: $currentHint.prefix, prompt: Text("Tag Prefix"))
-    TextField("", text: $currentHint.replacement, prompt: Text("URL Form"))
-    HStack {
-      Button(action: {
-        currentHint = URLHint()
-        showingPopup = false
-      }) {
-        Label("Cancel", systemImage: "x.circle")
-      }
-      Button(action: {
-        allHints.array.append(currentHint)
-        UserDefaults.standard.set(allHints.serial, forKey: UserDefaultsKeys.UrlHints)
-        currentHint = URLHint()
-        showingPopup = false
-      }) {
-        Label("Submit", systemImage: "checkmark.circle")
-      }
-    }
-  }
-}

+ 61 - 0
Todos/View/SettingsView.swift

@@ -0,0 +1,61 @@
+//
+//  URLHintPreferencePane.swift
+//  Todos
+//
+//  Created by Sam Jaffe on 3/1/26.
+//
+
+import SwiftUI
+
+struct SettingsView: View {
+  @EnvironmentObject var allHints: URLHintArray
+  @State var active = URLHint()
+  
+  var body: some View {
+    TabView {
+      Tab("URL Hints", systemImage: "link") {
+        Text("Custom rules to expand a tag into a URL")
+        Table(of: Binding<URLHint>.self) {
+          TableColumn("Tag Prefix") { hint in
+            TextField("", text: hint.prefix)
+              .onSubmit(addHint)
+          }
+          TableColumn("URL Expansion") { hint in
+            TextField("", text: hint.replacement)
+              .onSubmit(addHint)
+          }
+          TableColumn("") { hint in
+            if hint.id != active.id {
+              Button() {
+                allHints.array.removeAll(where: { $0.id == hint.id })
+                UserDefaults.standard.set(allHints.serial,
+                                          forKey: UserDefaultsKeys.UrlHints)
+              } label: {
+                Label("", systemImage: "trash")
+              }
+            }
+          }.width(max: 20)
+        } rows: {
+          ForEach($allHints.array) { hint in
+            TableRow(hint)
+          }
+          TableRow($active)
+        }
+      }
+    }
+  }
+  
+  private func addHint() {
+    if active.valid {
+      allHints.array.append(active)
+      UserDefaults.standard.set(allHints.serial,
+                                forKey: UserDefaultsKeys.UrlHints)
+      active = URLHint()
+    }
+  }
+}
+
+#Preview {
+  SettingsView()
+    .environmentObject(URLHintArray())
+}