Skip to content

Commit 0aeb7e7

Browse files
committed
Add the download and install button to the side bar entries.
1 parent bec8c35 commit 0aeb7e7

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

Sources/CodexSkillManager/Skills/Sidebar/RemoteSkillRowView.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import SwiftUI
33
struct RemoteSkillRowView: View {
44
let skill: RemoteSkill
55
let installedTargets: Set<SkillPlatform>
6+
let onInstall: () -> Void
67

78
var body: some View {
89
VStack(alignment: .leading, spacing: 6) {
@@ -34,6 +35,19 @@ struct RemoteSkillRowView: View {
3435
}
3536
}
3637
.padding(.vertical, 6)
38+
.padding(.trailing, 26)
39+
.frame(maxWidth: .infinity, alignment: .leading)
40+
.overlay(alignment: .topTrailing) {
41+
Button {
42+
onInstall()
43+
} label: {
44+
Image(systemName: isInstalledEverywhere ? "checkmark.circle.fill" : "arrow.down.circle")
45+
.foregroundStyle(isInstalledEverywhere ? .green : .primary)
46+
}
47+
.buttonStyle(.borderless)
48+
.disabled(isInstalledEverywhere)
49+
.help(isInstalledEverywhere ? "Installed" : "Install")
50+
}
3751
}
3852

3953
private var statsText: String? {
@@ -42,4 +56,8 @@ struct RemoteSkillRowView: View {
4256
guard downloads > 0 || stars > 0 else { return nil }
4357
return "\(downloads)\(stars)"
4458
}
59+
60+
private var isInstalledEverywhere: Bool {
61+
installedTargets == Set(SkillPlatform.allCases)
62+
}
4563
}

Sources/CodexSkillManager/Skills/Sidebar/SkillListView.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ struct SkillListView: View {
1111
let remoteLatestState: RemoteSkillStore.LoadState
1212
let remoteQuery: String
1313
let installedPlatforms: [String: Set<SkillPlatform>]
14+
let onInstallRemoteSkill: (RemoteSkill) -> Void
1415

1516
@Binding var source: SkillSource
1617
@Binding var localSelection: Skill.ID?
@@ -97,7 +98,8 @@ struct SkillListView: View {
9798
ForEach(remoteSearchResults) { skill in
9899
RemoteSkillRowView(
99100
skill: skill,
100-
installedTargets: installedPlatforms[skill.slug, default: []]
101+
installedTargets: installedPlatforms[skill.slug, default: []],
102+
onInstall: { onInstallRemoteSkill(skill) }
101103
)
102104
}
103105
}
@@ -124,7 +126,8 @@ struct SkillListView: View {
124126
ForEach(remoteLatestSkills) { skill in
125127
RemoteSkillRowView(
126128
skill: skill,
127-
installedTargets: installedPlatforms[skill.slug, default: []]
129+
installedTargets: installedPlatforms[skill.slug, default: []],
130+
onInstall: { onInstallRemoteSkill(skill) }
128131
)
129132
}
130133
}

Sources/CodexSkillManager/Skills/SkillSplitView.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ struct SkillSplitView: View {
8585
remoteLatestState: remoteStore.latestState,
8686
remoteQuery: searchText,
8787
installedPlatforms: installedPlatforms,
88+
onInstallRemoteSkill: { skill in
89+
presentRemoteInstallSheet(for: skill)
90+
},
8891
source: $source,
8992
localSelection: localSelectionBinding,
9093
remoteSelection: remoteSelectionBinding
@@ -232,10 +235,13 @@ struct SkillSplitView: View {
232235
NSWorkspace.shared.open(url)
233236
}
234237

235-
private func presentRemoteInstallSheet() {
236-
guard let skill = remoteStore.selectedSkill else { return }
237-
installTargets = defaultInstallTargets(for: skill.slug)
238-
installSkill = skill
238+
private func presentRemoteInstallSheet(for skill: RemoteSkill? = nil) {
239+
if let skill {
240+
remoteStore.selectedSkillID = skill.id
241+
}
242+
guard let resolved = skill ?? remoteStore.selectedSkill else { return }
243+
installTargets = defaultInstallTargets(for: resolved.slug)
244+
installSkill = resolved
239245
}
240246

241247
private var downloadErrorBinding: Binding<Bool> {

0 commit comments

Comments
 (0)