feat: copy translation and dismiss with Return

This commit is contained in:
2026-10-17 23:21:51 +02:00
parent 9eb16ddd5a
commit 038a5b78a0
4 changed files with 67 additions and 8 deletions
+22 -3
View File
@@ -13,6 +13,8 @@ final class TranslationController: NSViewController {
private var task: Task<Void, Never>?
var input: (() -> String)?
var closed: (() -> Void)?
var dismiss: (() -> Void)?
private let pasteboard: NSPasteboard
private let defaults: UserDefaults
private let credentialsStore: Credentials
private let myMemory: @MainActor (String) async throws -> String
@@ -22,12 +24,14 @@ final class TranslationController: NSViewController {
defaults: UserDefaults = .standard,
credentials: Credentials = .keychain,
myMemory: @escaping @MainActor (String) async throws -> String = { try await MyMemoryAPI.translate($0) },
openAI: @escaping @MainActor (String, String) async throws -> String = { try await TranslationAPI.translate($0, apiKey: $1) }
openAI: @escaping @MainActor (String, String) async throws -> String = { try await TranslationAPI.translate($0, apiKey: $1) },
pasteboard: NSPasteboard = .general
) {
self.defaults = defaults
self.credentialsStore = credentials
self.myMemory = myMemory
self.openAI = openAI
self.pasteboard = pasteboard
super.init(nibName: nil, bundle: nil)
}
@@ -49,7 +53,7 @@ final class TranslationController: NSViewController {
NotificationCenter.default.addObserver(self, selector: #selector(credentialsChanged),
name: Notification.Name("ConjureTranslationCredentialsChanged"), object: nil)
translateButton.target = self
translateButton.action = #selector(translate)
translateButton.action = #selector(performPrimaryAction)
translateButton.keyEquivalent = "\r"
translateButton.isBordered = false
translateButton.font = .systemFont(ofSize: 12, weight: .medium)
@@ -131,6 +135,8 @@ final class TranslationController: NSViewController {
func inputChanged() {
cancelRequest()
output.string = ""
translateButton.title = "Translate"
translateButton.toolTip = "Translate the English input (Return). Escape dismisses Conjure."
settingsButton.isHidden = true
setStatus("Press Return to translate.")
}
@@ -151,6 +157,17 @@ final class TranslationController: NSViewController {
status.textColor = isError ? .systemRed : SunsetPalette.secondaryText
}
@objc func performPrimaryAction() {
guard task == nil else { return }
guard !output.string.isEmpty else { translate(); return }
pasteboard.clearContents()
if pasteboard.setString(output.string, forType: .string) {
dismiss?()
} else {
setStatus("Could not copy the translation. Try again.", isError: true)
}
}
@objc func translate() {
guard task == nil else { return }
let text = input?() ?? ""
@@ -186,7 +203,9 @@ final class TranslationController: NSViewController {
: openAITranslate(text, key)
guard !Task.isCancelled, let self else { return }
self.output.string = translation
self.setStatus("Japanese · Select text to copy (⌘C).")
self.setStatus("English → Japanese")
self.translateButton.title = "Copy"
self.translateButton.toolTip = "Copy the translation and close Conjure (Return)."
} catch {
guard !Task.isCancelled, let self else { return }
self.settingsButton.isHidden = myMemory