CloverBootloader/CloverApp/Clover/Plist Editor/Views/PETableCellView.swift

158 lines
5.2 KiB
Swift

/*
* vector sigma (https://github.com/vectorsigma72)
* Copyright 2020 vector sigma All Rights Reserved.
*
* The source code contained or described herein and all documents related
* to the source code ("Material") are owned by vector sigma.
* Title to the Material remains with vector sigma or its suppliers and licensors.
* The Material is proprietary of vector sigma and is protected by worldwide copyright.
* No part of the Material may be used, copied, reproduced, modified, published,
* uploaded, posted, transmitted, distributed, or disclosed in any way without
* vector sigma's prior express written permission.
*
* No license under any patent, copyright, trade secret or other intellectual
* property right is granted to or conferred upon you by disclosure or delivery
* of the Materials, either expressly, by implication, inducement, estoppel or
* otherwise. Any license under such intellectual property rights must be
* express and approved by vector sigma in writing.
*
* Unless otherwise agreed by vector sigma in writing, you may not remove or alter
* this notice or any other notice embedded in Materials by vector sigma in any way.
*
* The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader)
* and all the users as long as the Material is used only within the
* source code and for the exclusive use of CloverBootloader, which must
* be free from any type of payment or commercial service for the license to be valid.
*/
import Cocoa
import CoreData
//MARK: PETableCellView (NSTableCellView)
@available(OSX 10.11, *)
final class PETableCellView: NSTableCellView {
@IBOutlet var addButton : NSButton!
@IBOutlet var removeButton : NSButton!
@IBOutlet var buttonsView: NSView!
@IBOutlet var buttonsViewWidthConstraint: NSLayoutConstraint!
var trackingArea: NSTrackingArea?
var scroller : NSScrollView? = nil
var outline : PEOutlineView?
var node : PENode?
var type : PETableCellViewType = .key
var field: PETextField? {
get {
return self.textField as? PETextField
}
set {
self.textField = newValue
}
}
func setup(outline: PEOutlineView, column: Int, type: PETableCellViewType) {
// actions
if type == .key {
self.addButton.ignoresMultiClick = true
self.addButton.target = self
self.addButton.action = #selector(self.addNewItem)
self.removeButton.ignoresMultiClick = true
self.removeButton.target = self
self.removeButton.action = #selector(self.removeItem)
}
self.type = type
self.outline = outline
self.field?.column = column
self.field?.delegate = self.outline?.editorVC
self.field?.outline = self.outline
self.scroller = outline.enclosingScrollView
}
@objc func reloadItemInParent(_ aNotification: Notification) {
let parent = self.node?.peparent
let ro : TagData? = parent?.tagdata
if (parent != nil) && ((ro != nil)) && (ro!.type == .Array) {
let childIndex : Int = parent!.mutableChildren.index(of: self.node!)
DispatchQueue.main.async {
self.textField?.animator().stringValue = "Item \(childIndex)"
}
}
}
override var backgroundStyle: NSView.BackgroundStyle {
didSet {
if #available(OSX 10.13, *) { /* do nothing */ } else {
if self.backgroundStyle == .light {
self.textField?.textColor = NSColor.controlTextColor
} else if self.backgroundStyle == .dark {
self.textField?.textColor = NSColor.alternateSelectedControlTextColor
}
}
}
}
@objc func addNewItem() {
if (self.node != nil) && (self.node?.parent != nil) && !(self.outline?.wrongValue)! {
self.outline?.addNewItemFromCell(node: self.node!, parent: self.node?.parent as! PENode)
self.hideButtons()
} else {
//
NSSound.beep()
self.window?.makeFirstResponder(self.outline)
}
}
@objc func removeItem() {
let parent = self.node?.parent
if (self.node != nil) && (parent != nil) && !(self.outline?.wrongValue)! {
self.outline?.removeItemFromCell(node: self.node!, parent: parent as! PENode)
} else {
NSSound.beep()
self.window?.makeFirstResponder(self.outline)
}
}
@objc func hideButtons() {
self.buttonsViewWidthConstraint.constant = 0
}
override func mouseDown(with theEvent: NSEvent) { }
override func mouseUp(with theEvent: NSEvent) { }
override func mouseEntered(with theEvent: NSEvent) {
if self.type == .key &&
self.outline?.editorVC != nil &&
self.outline!.editorVC!.isEditable &&
self.window!.isKeyWindow {
self.buttonsViewWidthConstraint.constant = 46
}
}
override func mouseExited(with event: NSEvent) {
self.hideButtons()
}
override func rightMouseDown(with event: NSEvent) { }
override func updateTrackingAreas() {
if self.type == .key {
if self.trackingArea != nil {
self.removeTrackingArea(self.trackingArea!)
}
self.trackingArea = NSTrackingArea(rect: self.bounds,
options: [.activeAlways,/*.activeInKeyWindow, */.mouseEnteredAndExited] ,
owner: self, userInfo: nil)
self.addTrackingArea(self.trackingArea!)
}
}
}