You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.3 KiB
62 lines
2.3 KiB
6 years ago
|
// Copyright © 2015 Abhishek Banthia
|
||
|
|
||
|
import Cocoa
|
||
|
|
||
|
struct BackgroundPanelConstants {
|
||
|
static let kArrowHeight: CGFloat = 8
|
||
|
static let kCornerRadius: CGFloat = 8
|
||
|
static let kBorderWidth: CGFloat = 1
|
||
|
}
|
||
|
|
||
|
class BackgroundPanelView: NSView {
|
||
|
private var arrowX: CGFloat = -1
|
||
|
private var trackingArea: NSTrackingArea?
|
||
|
|
||
|
override func draw(_ dirtyRect: NSRect) {
|
||
|
super.draw(dirtyRect)
|
||
|
|
||
|
NSColor.clear.set()
|
||
|
bounds.fill(using: .copy)
|
||
|
|
||
|
var rect = bounds.insetBy(dx: 1, dy: 0)
|
||
|
rect.origin.y = BackgroundPanelConstants.kBorderWidth
|
||
|
rect.size.height -= (BackgroundPanelConstants.kArrowHeight + (2 * BackgroundPanelConstants.kBorderWidth))
|
||
|
|
||
|
let rectPath = NSBezierPath(roundedRect: rect,
|
||
|
xRadius: BackgroundPanelConstants.kCornerRadius,
|
||
|
yRadius: BackgroundPanelConstants.kCornerRadius)
|
||
|
|
||
|
// Append the arrow to the body if its right ege is inside
|
||
|
// the right edge of the body (taking into account the corner
|
||
|
// radius).
|
||
|
|
||
|
let curveOffset: CGFloat = 5
|
||
|
let arrowMidX = frame.midX
|
||
|
let arrowRightEdge = arrowMidX + curveOffset + BackgroundPanelConstants.kArrowHeight
|
||
|
let bodyRightEdge = rect.maxX - BackgroundPanelConstants.kCornerRadius
|
||
|
|
||
|
if arrowRightEdge < bodyRightEdge {
|
||
|
let arrowPath = NSBezierPath()
|
||
|
let xOrdinate = arrowMidX - BackgroundPanelConstants.kArrowHeight - curveOffset
|
||
|
let yOrdinate = frame.height - BackgroundPanelConstants.kArrowHeight - BackgroundPanelConstants.kBorderWidth
|
||
|
arrowPath.move(to: NSPoint(x: xOrdinate, y: yOrdinate))
|
||
|
arrowPath.relativeCurve(to: NSPoint(x: BackgroundPanelConstants.kArrowHeight + curveOffset, y: BackgroundPanelConstants.kBorderWidth), controlPoint1: NSPoint(x: curveOffset, y: 0), controlPoint2: NSPoint(x: BackgroundPanelConstants.kArrowHeight, y: BackgroundPanelConstants.kArrowHeight))
|
||
|
}
|
||
|
|
||
|
Themer.shared().mainBackgroundColor().setFill()
|
||
|
|
||
|
rectPath.lineWidth = 2 * BackgroundPanelConstants.kBorderWidth
|
||
|
rectPath.stroke()
|
||
|
rectPath.fill()
|
||
|
}
|
||
|
|
||
|
override var allowsVibrancy: Bool {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
@objc func setArrowX(value: CGFloat) {
|
||
|
arrowX = value
|
||
|
setNeedsDisplay(bounds)
|
||
|
}
|
||
|
}
|