// // KMAngleIndicateView.swift // PDF Master // // Created by lizhe on 2023/11/22. // import Cocoa enum KMAngleIndicateViewStyle { case left45 case horizontal case right45 } class KMAngleIndicateView: NSView { var touchCallBack: (() -> Void)? private var gradient: NSGradient? var isSelcted: Bool = false { didSet { if isSelcted { layer?.borderWidth = 0.5 } else { layer?.borderWidth = 0 } needsDisplay = true } } var style: KMAngleIndicateViewStyle = .horizontal override func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) if isSelcted { let path = NSBezierPath(roundedRect: bounds, xRadius: 1, yRadius: 1) gradient?.draw(in: path, relativeCenterPosition: NSPoint(x: 0, y: 1)) wantsLayer = true layer?.backgroundColor = NSColor.clear.cgColor layer?.cornerRadius = 0 layer?.borderWidth = 0 layer?.borderColor = NSColor.clear.cgColor shadow = NSShadow() layer?.shadowColor = NSColor.clear.cgColor layer?.shadowOffset = CGSize(width: 0, height: 0) layer?.shadowRadius = 0 } else { wantsLayer = true layer?.backgroundColor = NSColor.white.cgColor layer?.cornerRadius = 1 layer?.borderWidth = 0.5 layer?.borderColor = NSColor.black.withAlphaComponent(0.15).cgColor shadow = NSShadow() layer?.shadowColor = NSColor.black.withAlphaComponent(0.2).cgColor layer?.shadowOffset = CGSize(width: 0, height: -1) layer?.shadowRadius = 0.5 } if let context = NSGraphicsContext.current?.cgContext { // Middle color block context.saveGState() if style == .left45 { context.translateBy(x: bounds.width / 2, y: bounds.height / 2) context.rotate(by: CGFloat.pi / 4) context.addRect(CGRect(x: -4, y: -6, width: 8, height: 12)) context.setFillColor(NSColor(calibratedRed: 117/255, green: 119/255, blue: 128/255, alpha: 1.0).cgColor) context.fillPath() } else if style == .horizontal { context.translateBy(x: bounds.width / 2, y: bounds.height / 2) context.addRect(CGRect(x: -4, y: -6, width: 8, height: 12)) context.setFillColor(NSColor(calibratedRed: 117/255, green: 119/255, blue: 128/255, alpha: 1.0).cgColor) context.fillPath() } else if style == .right45 { context.translateBy(x: bounds.width / 2, y: bounds.height / 2) context.rotate(by: -CGFloat.pi / 4) context.addRect(CGRect(x: -4, y: -6, width: 8, height: 12)) context.setFillColor(NSColor(calibratedRed: 117/255, green: 119/255, blue: 128/255, alpha: 1.0).cgColor) context.fillPath() } context.restoreGState() } } override func awakeFromNib() { super.awakeFromNib() gradient = NSGradient(starting: NSColor(calibratedRed: 237/255, green: 236/255, blue: 237/255, alpha: 1.0), ending: NSColor(calibratedRed: 210/255, green: 209/255, blue: 210/255, alpha: 1.0)) } override func mouseUp(with event: NSEvent) { if !isSelcted, let callback = touchCallBack { isSelcted = true callback() } } }