feat: copy translation and dismiss with Return
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user