mirror of
https://github.com/maxgoedjen/secretive.git
synced 2025-09-09 14:00:56 +00:00
Add reveal in finder to copyable (#669)
This commit is contained in:
parent
74f4f1c0b1
commit
3d5f0b45bd
@ -9,4 +9,17 @@ extension URL {
|
|||||||
static var socketPath: String {
|
static var socketPath: String {
|
||||||
URL.agentHomeURL.appendingPathComponent("socket.ssh").path()
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -40,10 +40,7 @@ struct ConfigurationItemView<Content: View>: View {
|
|||||||
.buttonStyle(.borderless)
|
.buttonStyle(.borderless)
|
||||||
case .revealInFinder(let rawPath):
|
case .revealInFinder(let rawPath):
|
||||||
Button(.revealInFinderButton, systemImage: "folder") {
|
Button(.revealInFinderButton, systemImage: "folder") {
|
||||||
// All foundation-based normalization methods replace this with the container directly.
|
let (processedPath, folder) = rawPath.normalizedPathAndFolder
|
||||||
let processedPath = rawPath.replacingOccurrences(of: "~", with: "/Users/\(NSUserName())")
|
|
||||||
let url = URL(filePath: processedPath)
|
|
||||||
let folder = url.deletingLastPathComponent().path()
|
|
||||||
NSWorkspace.shared.selectFile(processedPath, inFileViewerRootedAtPath: folder)
|
NSWorkspace.shared.selectFile(processedPath, inFileViewerRootedAtPath: folder)
|
||||||
}
|
}
|
||||||
.labelStyle(.iconOnly)
|
.labelStyle(.iconOnly)
|
||||||
|
@ -21,7 +21,7 @@ struct SecretDetailView<SecretType: Secret>: View {
|
|||||||
CopyableView(title: .secretDetailPublicKeyLabel, image: Image(systemName: "key"), text: keyString)
|
CopyableView(title: .secretDetailPublicKeyLabel, image: Image(systemName: "key"), text: keyString)
|
||||||
Spacer()
|
Spacer()
|
||||||
.frame(height: 20)
|
.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()
|
Spacer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ struct CopyableView: View {
|
|||||||
var title: LocalizedStringResource
|
var title: LocalizedStringResource
|
||||||
var image: Image
|
var image: Image
|
||||||
var text: String
|
var text: String
|
||||||
|
var showRevealInFinder = false
|
||||||
|
|
||||||
@State private var interactionState: InteractionState = .normal
|
@State private var interactionState: InteractionState = .normal
|
||||||
|
|
||||||
@ -21,9 +22,12 @@ struct CopyableView: View {
|
|||||||
.foregroundColor(primaryTextColor)
|
.foregroundColor(primaryTextColor)
|
||||||
Spacer()
|
Spacer()
|
||||||
if interactionState != .normal {
|
if interactionState != .normal {
|
||||||
hoverIcon
|
HStack {
|
||||||
.bold()
|
if showRevealInFinder {
|
||||||
.textCase(.uppercase)
|
revealInFinderButton
|
||||||
|
}
|
||||||
|
copyButton
|
||||||
|
}
|
||||||
.foregroundColor(secondaryTextColor)
|
.foregroundColor(secondaryTextColor)
|
||||||
.transition(.opacity)
|
.transition(.opacity)
|
||||||
}
|
}
|
||||||
@ -72,11 +76,18 @@ struct CopyableView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
var hoverIcon: some View {
|
var copyButton: some View {
|
||||||
switch interactionState {
|
switch interactionState {
|
||||||
case .hovering:
|
case .hovering:
|
||||||
Image(systemName: "document.on.document")
|
Button(.copyableClickToCopyButton, systemImage: "document.on.document") {
|
||||||
.accessibilityLabel(String(localized: .copyableClickToCopyButton))
|
withAnimation {
|
||||||
|
// Button will eat the click, so we set interaction state manually.
|
||||||
|
interactionState = .clicking
|
||||||
|
}
|
||||||
|
copy()
|
||||||
|
}
|
||||||
|
.labelStyle(.iconOnly)
|
||||||
|
.buttonStyle(.borderless)
|
||||||
case .clicking:
|
case .clicking:
|
||||||
Image(systemName: "checkmark.circle.fill")
|
Image(systemName: "checkmark.circle.fill")
|
||||||
.accessibilityLabel(String(localized: .copyableCopied))
|
.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 {
|
var primaryTextColor: Color {
|
||||||
switch interactionState {
|
switch interactionState {
|
||||||
case .normal, .hovering, .dragging:
|
case .normal, .hovering, .dragging:
|
||||||
|
Loading…
Reference in New Issue
Block a user