feat: LLM 设置窗口添加「从另一个配置复制」按钮

This commit is contained in:
JOJO 2026-04-24 22:52:53 +08:00
parent 7dc0d8ce26
commit 847ae72e49

View File

@ -9,6 +9,7 @@ final class SettingsWindow: NSWindow {
private let modelField: NSTextField
private let testButton: NSButton
private let saveButton: NSButton
private let copyFromOtherButton: NSButton
private let statusLabel: NSTextField
init(mode: LLMMode) {
@ -19,9 +20,10 @@ final class SettingsWindow: NSWindow {
modelField = NSTextField(frame: .zero)
testButton = NSButton(title: "Test", target: nil, action: nil)
saveButton = NSButton(title: "Save", target: nil, action: nil)
copyFromOtherButton = NSButton(title: "", target: nil, action: nil)
statusLabel = NSTextField(labelWithString: "")
let windowRect = NSRect(x: 0, y: 0, width: 420, height: 280)
let windowRect = NSRect(x: 0, y: 0, width: 420, height: 320)
super.init(
contentRect: windowRect,
styleMask: [.titled, .closable, .miniaturizable],
@ -111,6 +113,13 @@ final class SettingsWindow: NSWindow {
saveButton.target = self
saveButton.action = #selector(saveConfig)
let otherModeName = mode == .input ? "AI 助手" : "语音输入"
copyFromOtherButton.title = "从「\(otherModeName)」复制配置"
copyFromOtherButton.bezelStyle = .rounded
copyFromOtherButton.translatesAutoresizingMaskIntoConstraints = false
copyFromOtherButton.target = self
copyFromOtherButton.action = #selector(copyFromOther)
statusLabel.font = .systemFont(ofSize: 11)
statusLabel.textColor = .secondaryLabelColor
statusLabel.alignment = .center
@ -136,6 +145,7 @@ final class SettingsWindow: NSWindow {
content.addSubview(grid)
content.addSubview(buttonStack)
content.addSubview(copyFromOtherButton)
content.addSubview(statusLabel)
NSLayoutConstraint.activate([
@ -147,7 +157,10 @@ final class SettingsWindow: NSWindow {
buttonStack.centerXAnchor.constraint(equalTo: content.centerXAnchor),
buttonStack.widthAnchor.constraint(equalToConstant: 220),
statusLabel.topAnchor.constraint(equalTo: buttonStack.bottomAnchor, constant: 12),
copyFromOtherButton.topAnchor.constraint(equalTo: buttonStack.bottomAnchor, constant: 10),
copyFromOtherButton.centerXAnchor.constraint(equalTo: content.centerXAnchor),
statusLabel.topAnchor.constraint(equalTo: copyFromOtherButton.bottomAnchor, constant: 10),
statusLabel.centerXAnchor.constraint(equalTo: content.centerXAnchor),
statusLabel.widthAnchor.constraint(equalToConstant: 380)
])
@ -194,6 +207,19 @@ final class SettingsWindow: NSWindow {
}
}
@objc private func copyFromOther() {
let otherMode: LLMMode = mode == .input ? .assist : .input
let config = Config.shared.getLLMConfig(for: otherMode)
baseURLField.stringValue = config.baseURL
apiKeyField.stringValue = config.apiKey
modelField.stringValue = config.model
statusLabel.stringValue = "✅ 已复制「\(otherMode == .input ? "语音输入" : "AI 助手")」的配置"
statusLabel.textColor = .systemGreen
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { [weak self] in
self?.statusLabel.stringValue = ""
}
}
@objc private func saveConfig() {
let url = baseURLField.stringValue.trimmingCharacters(in: CharacterSet(charactersIn: "/"))
let key = apiKeyField.stringValue