From 2451e7c59d8f2f5648c13ac567876270a845c970 Mon Sep 17 00:00:00 2001 From: dingjinfeng Date: Mon, 13 Apr 2026 12:00:30 +0800 Subject: [PATCH] feat: add size sort toggle button to category detail view Add a sort button (arrow.up.arrow.down icon) to the right of "Deselect All", defaulting to largest-first. Clicking toggles between descending/ascending order without changing the icon. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- PureMac/Views/CategoryDetailView.swift | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/PureMac/Views/CategoryDetailView.swift b/PureMac/Views/CategoryDetailView.swift index 3f3e965..92bf7dc 100644 --- a/PureMac/Views/CategoryDetailView.swift +++ b/PureMac/Views/CategoryDetailView.swift @@ -1,9 +1,12 @@ import SwiftUI + struct CategoryDetailView: View { @EnvironmentObject var vm: AppViewModel let category: CleaningCategory + @State private var sortDescending: Bool = true + var result: CategoryResult? { vm.categoryResults[category] } @@ -109,6 +112,14 @@ struct CategoryDetailView: View { .font(.system(size: 11, weight: .medium)) .foregroundColor(.pmAccentLight) .buttonStyle(.plain) + + Button(action: { sortDescending.toggle() }) { + Image(systemName: "arrow.up.arrow.down") + .font(.system(size: 14)) + .foregroundColor(.pmAccentLight) + } + .buttonStyle(.plain) + .help(sortDescending ? "Sorted: Largest First" : "Sorted: Smallest First") } .padding(.horizontal, 48) .padding(.vertical, 8) @@ -119,7 +130,7 @@ struct CategoryDetailView: View { ScrollView { LazyVStack(spacing: 4) { - ForEach(result.items) { item in + ForEach(sortedItems(result.items)) { item in FileRow(item: item, color: category.color) } } @@ -173,6 +184,12 @@ struct CategoryDetailView: View { } } + // MARK: - Sort + + private func sortedItems(_ items: [CleanableItem]) -> [CleanableItem] { + items.sorted { sortDescending ? $0.size > $1.size : $0.size < $1.size } + } + // MARK: - Action Bar private var categoryActionBar: some View {