mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2024-12-22 07:34:09 +01:00
127 lines
2.7 KiB
Swift
127 lines
2.7 KiB
Swift
//
|
|
// FolderInspectorViewController.swift
|
|
// NetNewsWire
|
|
//
|
|
// Created by Brent Simmons on 1/20/18.
|
|
// Copyright © 2018 Ranchero Software. All rights reserved.
|
|
//
|
|
|
|
import AppKit
|
|
import Account
|
|
|
|
@MainActor final class FolderInspectorViewController: NSViewController, Inspector {
|
|
|
|
@IBOutlet var nameTextField: NSTextField?
|
|
@IBOutlet weak var folderImageView: NSImageView!
|
|
|
|
private var folder: Folder? {
|
|
didSet {
|
|
if folder != oldValue {
|
|
updateUI()
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: Inspector
|
|
|
|
let isFallbackInspector = false
|
|
var objects: [Any]? {
|
|
didSet {
|
|
renameFolderIfNecessary()
|
|
updateFolder()
|
|
}
|
|
}
|
|
var windowTitle: String = NSLocalizedString("Folder Inspector", comment: "Folder Inspector window title")
|
|
|
|
func canInspect(_ objects: [Any]) -> Bool {
|
|
|
|
guard let _ = singleFolder(from: objects) else {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// MARK: NSViewController
|
|
|
|
override func viewDidLoad() {
|
|
updateUI()
|
|
|
|
let image = NSImage(systemSymbolName: "folder", accessibilityDescription: nil)!
|
|
folderImageView.image = image
|
|
folderImageView.contentTintColor = NSColor.controlAccentColor
|
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(displayNameDidChange(_:)), name: .DisplayNameDidChange, object: nil)
|
|
}
|
|
|
|
override func viewDidDisappear() {
|
|
renameFolderIfNecessary()
|
|
}
|
|
|
|
// MARK: Notifications
|
|
|
|
@objc func displayNameDidChange(_ note: Notification) {
|
|
guard let updatedFolder = note.object as? Folder, updatedFolder == folder else {
|
|
return
|
|
}
|
|
updateUI()
|
|
}
|
|
}
|
|
|
|
extension FolderInspectorViewController: NSTextFieldDelegate {
|
|
|
|
func controlTextDidEndEditing(_ obj: Notification) {
|
|
renameFolderIfNecessary()
|
|
}
|
|
|
|
}
|
|
|
|
private extension FolderInspectorViewController {
|
|
|
|
func singleFolder(from objects: [Any]?) -> Folder? {
|
|
|
|
guard let objects = objects, objects.count == 1, let singleFolder = objects.first as? Folder else {
|
|
return nil
|
|
}
|
|
|
|
return singleFolder
|
|
}
|
|
|
|
func updateFolder() {
|
|
|
|
folder = singleFolder(from: objects)
|
|
}
|
|
|
|
func updateUI() {
|
|
|
|
guard let nameTextField = nameTextField else {
|
|
return
|
|
}
|
|
|
|
let name = folder?.nameForDisplay ?? ""
|
|
if nameTextField.stringValue != name {
|
|
nameTextField.stringValue = name
|
|
}
|
|
windowTitle = folder?.nameForDisplay ?? NSLocalizedString("Folder Inspector", comment: "Folder Inspector window title")
|
|
}
|
|
|
|
func renameFolderIfNecessary() {
|
|
guard let folder = folder,
|
|
let account = folder.account,
|
|
let newName = nameTextField?.stringValue,
|
|
!newName.isEmpty,
|
|
folder.nameForDisplay != newName else {
|
|
return
|
|
}
|
|
|
|
Task {
|
|
|
|
do {
|
|
try await account.renameFolder(folder, to: newName)
|
|
self.windowTitle = folder.nameForDisplay
|
|
} catch {
|
|
self.presentError(error)
|
|
}
|
|
}
|
|
}
|
|
}
|