File tree Expand file tree Collapse file tree 3 files changed +33
-6
lines changed
Sources/CodexSkillManager/Skills Expand file tree Collapse file tree 3 files changed +33
-6
lines changed Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ import SwiftUI
33struct 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}
Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff 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 > {
You can’t perform that action at this time.
0 commit comments