Files
NetNewsWire/Mac/MainWindow/About/AboutWindowController.swift
Stuart Breckenridge 871d751640 var to let
2022-10-06 20:52:11 +08:00

132 lines
3.4 KiB
Swift

//
// AboutWindowController.swift
// NetNewsWire
//
// Created by Stuart Breckenridge on 03/10/2022.
// Copyright © 2022 Ranchero Software. All rights reserved.
//
import AppKit
import SwiftUI
import RSCore
extension NSToolbarItem.Identifier {
static let aboutGroup = NSToolbarItem.Identifier("about.toolbar.group")
}
extension NSUserInterfaceItemIdentifier {
static let aboutNetNewsWire = NSUserInterfaceItemIdentifier("about.netnewswire")
}
// MARK: - AboutWindowController
@available(macOS 12, *)
class AboutWindowController: NSWindowController, NSToolbarDelegate {
var hostingController: AboutHostingController
override init(window: NSWindow?) {
self.hostingController = AboutHostingController(rootView: AnyView(AboutNetNewsWireView()))
super.init(window: window)
let window = NSWindow(contentViewController: hostingController)
window.identifier = .aboutNetNewsWire
window.standardWindowButton(.zoomButton)?.isEnabled = false
window.titleVisibility = .hidden
self.window = window
self.hostingController.configureToolbar()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func windowDidLoad() {
super.windowDidLoad()
}
}
// MARK: - AboutHostingController
@available(macOS 12, *)
class AboutHostingController: NSHostingController<AnyView>, NSToolbarDelegate {
private lazy var segmentedControl: NSSegmentedControl = {
let control = NSSegmentedControl(labels: ["About", "Credits"],
trackingMode: .selectOne,
target: self,
action: #selector(segmentedControlSelectionChanged(_:)))
control.segmentCount = 2
control.setSelected(true, forSegment: 0)
return control
}()
override init(rootView: AnyView) {
super.init(rootView: rootView)
}
@MainActor required dynamic init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public func configureToolbar() {
let toolbar = NSToolbar(identifier: NSToolbar.Identifier("netnewswire.about.toolbar"))
toolbar.delegate = self
toolbar.autosavesConfiguration = false
toolbar.allowsUserCustomization = false
view.window?.toolbar = toolbar
view.window?.toolbarStyle = .unified
toolbar.insertItem(withItemIdentifier: .flexibleSpace, at: 0)
toolbar.insertItem(withItemIdentifier: .flexibleSpace, at: 2)
}
// MARK: NSToolbarDelegate
func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
switch itemIdentifier {
case .aboutGroup:
let toolbarItem = NSToolbarItem(itemIdentifier: .aboutGroup)
toolbarItem.view = segmentedControl
toolbarItem.autovalidates = true
return toolbarItem
default:
return nil
}
}
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return [.aboutGroup]
}
func toolbarWillAddItem(_ notification: Notification) {
//
}
func toolbarDidRemoveItem(_ notification: Notification) {
//
}
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return [.aboutGroup]
}
func toolbarSelectableItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return []
}
// MARK: - Target/Action
@objc
func segmentedControlSelectionChanged(_ sender: NSSegmentedControl) {
if sender.selectedSegment == 0 {
rootView = AnyView(AboutNetNewsWireView())
} else {
rootView = AnyView(CreditsNetNewsWireView())
}
}
}