Add reveal in finder to copyable (#669)

This commit is contained in:
Max Goedjen 2025-09-03 23:36:50 -07:00 committed by GitHub
parent 74f4f1c0b1
commit 3d5f0b45bd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 41 additions and 11 deletions

View File

@ -9,4 +9,17 @@ extension URL {
static var socketPath: String {
URL.agentHomeURL.appendingPathComponent("socket.ssh").path()
}
}
extension String {
var normalizedPathAndFolder: (String, String) {
// All foundation-based normalization methods replace this with the container directly.
let processedPath = replacingOccurrences(of: "~", with: "/Users/\(NSUserName())")
let url = URL(filePath: processedPath)
let folder = url.deletingLastPathComponent().path()
return (processedPath, folder)
}
}

View File

@ -40,10 +40,7 @@ struct ConfigurationItemView<Content: View>: View {
.buttonStyle(.borderless)
case .revealInFinder(let rawPath):
Button(.revealInFinderButton, systemImage: "folder") {
// All foundation-based normalization methods replace this with the container directly.
let processedPath = rawPath.replacingOccurrences(of: "~", with: "/Users/\(NSUserName())")
let url = URL(filePath: processedPath)
let folder = url.deletingLastPathComponent().path()
let (processedPath, folder) = rawPath.normalizedPathAndFolder
NSWorkspace.shared.selectFile(processedPath, inFileViewerRootedAtPath: folder)
}
.labelStyle(.iconOnly)

View File

@ -21,7 +21,7 @@ struct SecretDetailView<SecretType: Secret>: View {
CopyableView(title: .secretDetailPublicKeyLabel, image: Image(systemName: "key"), text: keyString)
Spacer()
.frame(height: 20)
CopyableView(title: .secretDetailPublicKeyPathLabel, image: Image(systemName: "lock.doc"), text: publicKeyFileStoreController.publicKeyPath(for: secret))
CopyableView(title: .secretDetailPublicKeyPathLabel, image: Image(systemName: "lock.doc"), text: publicKeyFileStoreController.publicKeyPath(for: secret), showRevealInFinder: true)
Spacer()
}
}

View File

@ -6,6 +6,7 @@ struct CopyableView: View {
var title: LocalizedStringResource
var image: Image
var text: String
var showRevealInFinder = false
@State private var interactionState: InteractionState = .normal
@ -21,9 +22,12 @@ struct CopyableView: View {
.foregroundColor(primaryTextColor)
Spacer()
if interactionState != .normal {
hoverIcon
.bold()
.textCase(.uppercase)
HStack {
if showRevealInFinder {
revealInFinderButton
}
copyButton
}
.foregroundColor(secondaryTextColor)
.transition(.opacity)
}
@ -72,11 +76,18 @@ struct CopyableView: View {
}
@ViewBuilder
var hoverIcon: some View {
var copyButton: some View {
switch interactionState {
case .hovering:
Image(systemName: "document.on.document")
.accessibilityLabel(String(localized: .copyableClickToCopyButton))
Button(.copyableClickToCopyButton, systemImage: "document.on.document") {
withAnimation {
// Button will eat the click, so we set interaction state manually.
interactionState = .clicking
}
copy()
}
.labelStyle(.iconOnly)
.buttonStyle(.borderless)
case .clicking:
Image(systemName: "checkmark.circle.fill")
.accessibilityLabel(String(localized: .copyableCopied))
@ -85,6 +96,15 @@ struct CopyableView: View {
}
}
var revealInFinderButton: some View {
Button(.revealInFinderButton, systemImage: "folder") {
let (processedPath, folder) = text.normalizedPathAndFolder
NSWorkspace.shared.selectFile(processedPath, inFileViewerRootedAtPath: folder)
}
.labelStyle(.iconOnly)
.buttonStyle(.borderless)
}
var primaryTextColor: Color {
switch interactionState {
case .normal, .hovering, .dragging: