import AppKit
|
import AlignerCore
|
|
@MainActor
|
final class SettingsWindowController: NSWindowController {
|
private let modeProvider: () -> QuickSwitchWaterfallViewMode
|
private let onWaterfallViewModeChanged: (QuickSwitchWaterfallViewMode) -> Void
|
private let tabView = NSTabView()
|
private let verticalColumnsButton = NSButton(
|
radioButtonWithTitle: "纵栏瀑布",
|
target: nil,
|
action: nil
|
)
|
private let horizontalMasonryButton = NSButton(
|
radioButtonWithTitle: "横栏瀑布",
|
target: nil,
|
action: nil
|
)
|
|
init(
|
modeProvider: @escaping () -> QuickSwitchWaterfallViewMode,
|
onWaterfallViewModeChanged: @escaping (QuickSwitchWaterfallViewMode) -> Void
|
) {
|
self.modeProvider = modeProvider
|
self.onWaterfallViewModeChanged = onWaterfallViewModeChanged
|
|
let window = NSWindow(
|
contentRect: NSRect(x: 0, y: 0, width: 520, height: 340),
|
styleMask: [.titled, .closable, .miniaturizable],
|
backing: .buffered,
|
defer: false
|
)
|
window.title = "Aligner 设置"
|
window.isReleasedWhenClosed = false
|
window.center()
|
|
super.init(window: window)
|
window.contentView = makeContentView()
|
refreshWaterfallViewMode()
|
}
|
|
@available(*, unavailable)
|
required init?(coder: NSCoder) {
|
nil
|
}
|
|
override func showWindow(_ sender: Any?) {
|
refreshWaterfallViewMode()
|
tabView.selectTabViewItem(withIdentifier: "view")
|
super.showWindow(sender)
|
window?.makeKeyAndOrderFront(sender)
|
}
|
|
func refreshWaterfallViewMode() {
|
let mode = modeProvider()
|
verticalColumnsButton.state = mode == .verticalColumns ? .on : .off
|
horizontalMasonryButton.state = mode == .horizontalMasonry ? .on : .off
|
}
|
|
func reportDictionary() -> [String: Any] {
|
[
|
"exists": true,
|
"visible": window?.isVisible ?? false,
|
"title": window?.title ?? "",
|
"selectedTabLabel": tabView.selectedTabViewItem?.label ?? "",
|
"selectedTabIdentifier": tabView.selectedTabViewItem?.identifier as? String ?? "",
|
"waterfallViewMode": modeProvider().rawValue,
|
"hasViewTab": tabView.tabViewItems.contains { $0.identifier as? String == "view" },
|
"usesSwiftUI": false
|
]
|
}
|
|
private func makeContentView() -> NSView {
|
tabView.translatesAutoresizingMaskIntoConstraints = false
|
tabView.tabViewType = .topTabsBezelBorder
|
tabView.addTabViewItem(makeViewTab())
|
|
let root = NSView()
|
root.addSubview(tabView)
|
NSLayoutConstraint.activate([
|
tabView.leadingAnchor.constraint(equalTo: root.leadingAnchor, constant: 20),
|
tabView.trailingAnchor.constraint(equalTo: root.trailingAnchor, constant: -20),
|
tabView.topAnchor.constraint(equalTo: root.topAnchor, constant: 18),
|
tabView.bottomAnchor.constraint(equalTo: root.bottomAnchor, constant: -20)
|
])
|
return root
|
}
|
|
private func makeViewTab() -> NSTabViewItem {
|
let tab = NSTabViewItem(identifier: "view")
|
tab.label = "视图"
|
tab.view = makeViewSettingsView()
|
return tab
|
}
|
|
private func makeViewSettingsView() -> NSView {
|
let title = NSTextField(labelWithString: "Quick Switch 视图")
|
title.font = .systemFont(ofSize: 18, weight: .semibold)
|
|
let subtitle = NSTextField(wrappingLabelWithString: "切换后立即生效。")
|
subtitle.textColor = .secondaryLabelColor
|
|
verticalColumnsButton.target = self
|
verticalColumnsButton.action = #selector(selectVerticalColumns)
|
horizontalMasonryButton.target = self
|
horizontalMasonryButton.action = #selector(selectHorizontalMasonry)
|
|
let modeStack = NSStackView(views: [verticalColumnsButton, horizontalMasonryButton])
|
modeStack.orientation = .vertical
|
modeStack.alignment = .leading
|
modeStack.spacing = 10
|
|
let stack = NSStackView(views: [title, subtitle, modeStack])
|
stack.orientation = .vertical
|
stack.alignment = .leading
|
stack.spacing = 14
|
stack.translatesAutoresizingMaskIntoConstraints = false
|
|
let view = NSView()
|
view.addSubview(stack)
|
NSLayoutConstraint.activate([
|
stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 22),
|
stack.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor, constant: -22),
|
stack.topAnchor.constraint(equalTo: view.topAnchor, constant: 24)
|
])
|
return view
|
}
|
|
@objc private func selectVerticalColumns() {
|
onWaterfallViewModeChanged(.verticalColumns)
|
refreshWaterfallViewMode()
|
}
|
|
@objc private func selectHorizontalMasonry() {
|
onWaterfallViewModeChanged(.horizontalMasonry)
|
refreshWaterfallViewMode()
|
}
|
}
|