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.
 
 
 
 
 

59 lines
2.3 KiB

// Copyright © 2015 Abhishek Banthia
import Cocoa
struct BackgroundPanelConstants {
static let kArrowHeight: CGFloat = 4
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
}
}