Skip to content

Commit 54c6ca2

Browse files
committed
^ Somewhat works * No greedy packages
1 parent 35b6b51 commit 54c6ca2

19 files changed

Lines changed: 393 additions & 141 deletions

File tree

Cork/CorkApp.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ struct CorkApp: App
144144
{ _, newValue in
145145
handleDemoTiming(newValue: newValue)
146146
}
147-
.onChange(of: outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.count)
147+
.onChange(of: outdatedPackagesTracker.allDisplayableOutdatedPackages.count)
148148
{ _, outdatedPackageCount in
149149
handleOutdatedPackageChangeAppBadge(outdatedPackageCount: outdatedPackageCount)
150150
}
@@ -320,7 +320,7 @@ struct CorkApp: App
320320

321321
// MARK: - Menu Bar Extra
322322

323-
MenuBarExtra("app-name", systemImage: outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.isEmpty ? "mug" : "mug.fill", isInserted: $showInMenuBar)
323+
MenuBarExtra("app-name", systemImage: outdatedPackagesTracker.allDisplayableOutdatedPackages.isEmpty ? "mug" : "mug.fill", isInserted: $showInMenuBar)
324324
{
325325
MenuBarItem()
326326
.environment(appDelegate.appState)
@@ -608,9 +608,9 @@ struct CorkApp: App
608608
{
609609
if outdatedPackageNotificationType == .badge || outdatedPackageNotificationType == .both
610610
{
611-
if !outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.isEmpty
611+
if !outdatedPackagesTracker.allDisplayableOutdatedPackages.isEmpty
612612
{
613-
NSApp.dockTile.badgeLabel = String(outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.count)
613+
NSApp.dockTile.badgeLabel = String(outdatedPackagesTracker.allDisplayableOutdatedPackages.count)
614614
}
615615
}
616616
else if outdatedPackageNotificationType == .notification || outdatedPackageNotificationType == .none
@@ -703,7 +703,7 @@ struct CorkApp: App
703703
/// Set this to `true` so the normal notification doesn't get sent
704704
await setWhetherToSendStandardUpdatesAvailableNotification(to: false)
705705

706-
let differentPackages: Set<OutdatedPackage> = await newOutdatedPackages.subtracting(outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages)
706+
let differentPackages: Set<OutdatedPackage> = await newOutdatedPackages.subtracting(outdatedPackagesTracker.allDisplayableOutdatedPackages)
707707
AppConstants.shared.logger.debug("Changed packages: \(differentPackages, privacy: .auto)")
708708

709709
sendNotification(title: String(localized: "notification.new-outdated-packages-found.title"), subtitle: differentPackages.map{$0.package.name}.formatted(.list(type: .and)))

Cork/Logic/Updating and Upgrading/Refresh Packages.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func refreshPackages(_ updateProgressTracker: UpdateProgressTracker, outdatedPac
3030

3131
updateProgressTracker.updateProgress = updateProgressTracker.updateProgress + 0.1
3232

33-
if outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.isEmpty
33+
if outdatedPackagesTracker.allDisplayableOutdatedPackages.isEmpty
3434
{
3535
if outputLine.starts(with: "Already up-to-date")
3636
{

Cork/Protocols/Markable.swift

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// Markable.swift
3+
// Cork
4+
//
5+
// Created by David Bureš - P on 07.01.2026.
6+
//
7+
8+
import Foundation
9+
10+
// TODO: Implement this for the right objects (like OutdatedPackage)
11+
/// Protocol providing boilerplate for marking something as either selected or not selectd
12+
protocol Selectable: AnyObject
13+
{
14+
var isSelected: Bool { get set }
15+
16+
func setSelectedState(to newState: Bool?)
17+
}
18+
19+
extension Selectable
20+
{
21+
func setSelectedState(to newState: Bool? = nil)
22+
{
23+
if let newState
24+
{
25+
self.isSelected = newState
26+
}
27+
else
28+
{
29+
self.isSelected.toggle()
30+
}
31+
}
32+
}

Cork/Views/Maintenance/Sub-Views/Maintenance Finished View.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ struct MaintenanceFinishedView: View
6060

6161
/// **Motivation**: Same as above, but even more performant
6262
/// Only formulae can hold back cache purging. Therefore, we just filter out the outdated formulae, and those must be holding back the purging
63-
return outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.filter { $0.package.type == .formula }.map(\.package.name)
63+
return outdatedPackagesTracker.allDisplayableOutdatedPackages.filter { $0.package.type == .formula }.map(\.package.name)
6464
}
6565
else
6666
{

Cork/Views/Menu Bar/Sub-Views/Menu Bar - Package Updating.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,20 @@ struct MenuBar_PackageUpdating: View
2222
}
2323
else
2424
{
25-
if !outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.isEmpty
25+
if !outdatedPackagesTracker.allDisplayableOutdatedPackages.isEmpty
2626
{
2727
if let sanitizedSheetState = appState.sheetToShow
2828
{
2929
if sanitizedSheetState != .fullUpdate || sanitizedSheetState != .partialUpdate(packagesToUpdate: .init())
3030
{
3131
Menu
3232
{
33-
ForEach(outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.sorted(by: { $0.package.installedOn! < $1.package.installedOn! }))
33+
ForEach(outdatedPackagesTracker.allDisplayableOutdatedPackages.sorted(by: { $0.package.installedOn! < $1.package.installedOn! }))
3434
{ outdatedPackage in
3535
SanitizedPackageName(package: outdatedPackage.package, shouldShowVersion: false)
3636
}
3737
} label: {
38-
Text("notification.outdated-packages-found.body-\(outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.count)")
38+
Text("notification.outdated-packages-found.body-\(outdatedPackagesTracker.allDisplayableOutdatedPackages.count)")
3939
}
4040

4141
Button("navigation.upgrade-packages")

Cork/Views/Packages/Package List Item.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ struct PackageListItem: View
1616

1717
var isPackageOutdated: Bool
1818
{
19-
if outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.contains(where: { $0.package.name == packageItem.name })
19+
if outdatedPackagesTracker.allDisplayableOutdatedPackages.contains(where: { $0.package.name == packageItem.name })
2020
{
2121
return true
2222
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// Searchable List.swift
3+
// Cork
4+
//
5+
// Created by David Bureš - P on 06.01.2026.
6+
//
7+
8+
import SwiftUI
9+
10+
struct SearchableListTemplate: View
11+
{
12+
var body: some View
13+
{
14+
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
15+
}
16+
}

Cork/Views/Sidebar/Components/Sidebar Context Menu.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ struct SidebarContextMenu: View
2020

2121
var isPackageOutdated: Bool
2222
{
23-
if outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.contains(where: { $0.package.name == package.name })
23+
if outdatedPackagesTracker.allDisplayableOutdatedPackages.contains(where: { $0.package.name == package.name })
2424
{
2525
return true
2626
}

Cork/Views/Start Page/Sub-Views/Outdated Packages/Outdated Package List Box.swift

Lines changed: 52 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -31,47 +31,23 @@ struct OutdatedPackageListBox: View
3131
{
3232
VStack(alignment: .leading)
3333
{
34-
GroupBoxHeadlineGroupWithArbitraryContent(image: outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.count == 1 ? "square.and.arrow.down" : "square.and.arrow.down.on.square")
34+
GroupBoxHeadlineGroupWithArbitraryContent(image: outdatedPackagesTracker.allDisplayableOutdatedPackages.count == 1 ? "square.and.arrow.down" : "square.and.arrow.down.on.square")
3535
{
3636
VStack(alignment: .leading, spacing: 5)
3737
{
3838
HStack(alignment: .firstTextBaseline)
3939
{
40-
Group
41-
{
42-
switch outdatedPackagesTracker.outdatedPackageListBoxViewType {
43-
case .managedOnly, .bothManagedAndUnmanaged:
44-
Text("start-page.updates.count-\(outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.count)")
45-
case .unmanagedOnly:
46-
Text("start-page.updates.only-unmanaged.count-\(outdatedPackagesTracker.displayableOutdatedPackagesTracker.allDisplayableOutdatedPackages.count)")
47-
}
48-
}
49-
.font(.headline)
40+
boxTitle
5041

5142
Spacer()
5243

53-
if outdatedPackagesTracker.displayableOutdatedPackagesTracker.areAllOutdatedPackagesMarkedForUpdating
44+
if outdatedPackagesTracker.areAllOutdatedPackagesMarkedForUpdating
5445
{
55-
Button
56-
{
57-
appState.showSheet(ofType: .fullUpdate)
58-
} label: {
59-
Text("start-page.updates.action")
60-
}
61-
62-
#if DEBUG
63-
// Text(String(packagesMarkedForUpdating.count))
64-
#endif
46+
fullUpdateButton
6547
}
6648
else
6749
{
68-
Button
69-
{
70-
appState.showSheet(ofType: .partialUpdate(packagesToUpdate: outdatedPackagesTracker.displayableOutdatedPackagesTracker.packagesMarkedForUpdating))
71-
} label: {
72-
Text("start-page.update-incremental.package-count-\(outdatedPackagesTracker.displayableOutdatedPackagesTracker.packagesMarkedForUpdating.count)")
73-
}
74-
.disabled(outdatedPackagesTracker.displayableOutdatedPackagesTracker.packagesMarkedForUpdating.isEmpty)
50+
partialUpdateButton
7551
}
7652
}
7753

@@ -125,7 +101,51 @@ struct OutdatedPackageListBox: View
125101
}
126102
}
127103
.accessibilityLabel("accessibility.label.outdated-packages-box.listing-outdated-packages")
128-
.accessibilityValue("accessibility.value.listing-outdated-packages.\(outdatedPackagesTracker.displayableOutdatedPackagesTracker.packagesManagedByHomebrew.count)-managed.\(outdatedPackagesTracker.displayableOutdatedPackagesTracker.packagesThatUpdateThemselves.count)-unmanaged")
104+
.accessibilityValue("accessibility.value.listing-outdated-packages.\(outdatedPackagesTracker.packagesManagedByHomebrew.count)-managed.\(outdatedPackagesTracker.packagesThatUpdateThemselves.count)-unmanaged")
105+
}
106+
107+
// MARK: - ViewBuilders
108+
109+
@ViewBuilder
110+
private var boxTitle: some View
111+
{
112+
Group
113+
{
114+
switch outdatedPackagesTracker.outdatedPackageListBoxViewType {
115+
case .managedOnly, .bothManagedAndUnmanaged:
116+
Text("start-page.updates.count-\(outdatedPackagesTracker.allDisplayableOutdatedPackages.count)")
117+
case .unmanagedOnly:
118+
Text("start-page.updates.only-unmanaged.count-\(outdatedPackagesTracker.allDisplayableOutdatedPackages.count)")
119+
}
120+
}
121+
.font(.headline)
122+
}
123+
124+
@ViewBuilder
125+
private var fullUpdateButton: some View
126+
{
127+
Button
128+
{
129+
appState.showSheet(ofType: .fullUpdate)
130+
} label: {
131+
Text("start-page.updates.action")
132+
}
133+
134+
#if DEBUG
135+
// Text(String(packagesMarkedForUpdating.count))
136+
#endif
137+
}
138+
139+
@ViewBuilder
140+
private var partialUpdateButton: some View
141+
{
142+
Button
143+
{
144+
appState.showSheet(ofType: .partialUpdate(packagesToUpdate: outdatedPackagesTracker.packagesMarkedForUpdating))
145+
} label: {
146+
Text("start-page.update-incremental.package-count-\(outdatedPackagesTracker.packagesMarkedForUpdating.count)")
147+
}
148+
.disabled(outdatedPackagesTracker.packagesMarkedForUpdating.isEmpty)
129149
}
130150

131151
// MARK: - Outdated package list complex
@@ -149,7 +169,7 @@ struct OutdatedPackageListBox: View
149169
} label: {
150170
Text("start-page.updated.action.deselect-all")
151171
}
152-
.disabled(outdatedPackagesTracker.displayableOutdatedPackagesTracker.packagesMarkedForUpdating.isEmpty)
172+
.disabled(outdatedPackagesTracker.packagesMarkedForUpdating.isEmpty)
153173
.modify
154174
{ viewProxy in
155175
if outdatedPackageInfoDisplayAmount != .all
@@ -181,7 +201,7 @@ struct OutdatedPackageListBox: View
181201
} label: {
182202
Text("start-page.updated.action.select-all")
183203
}
184-
.disabled(outdatedPackagesTracker.displayableOutdatedPackagesTracker.areAllOutdatedPackagesMarkedForUpdating)
204+
.disabled(outdatedPackagesTracker.areAllOutdatedPackagesMarkedForUpdating)
185205
.modify
186206
{ viewProxy in
187207
if outdatedPackageInfoDisplayAmount != .all
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// Outdated Packages List - Managed.swift
3+
// Cork
4+
//
5+
// Created by David Bureš - P on 06.01.2026.
6+
//
7+
8+
import SwiftUI
9+
10+
struct OutdatedPackagesList_Managed: View
11+
{
12+
var body: some View
13+
{
14+
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
15+
}
16+
}

0 commit comments

Comments
 (0)