//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// import Foundation @_exported import AppKit extension NSCursor : _DefaultCustomPlaygroundQuickLookable { public var _defaultCustomPlaygroundQuickLook: PlaygroundQuickLook { return .image(image) } } internal struct _NSViewQuickLookState { static var views = Set() } extension NSView : _DefaultCustomPlaygroundQuickLookable { public var _defaultCustomPlaygroundQuickLook: PlaygroundQuickLook { // if you set NSView.needsDisplay, you can get yourself in a recursive scenario where the same view // could need to draw itself in order to get a QLObject for itself, which in turn if your code was // instrumented to log on-draw, would cause yourself to get back here and so on and so forth // until you run out of stack and crash // This code checks that we aren't trying to log the same view recursively - and if so just returns // an empty view, which is probably a safer option than crashing // FIXME: is there a way to say "cacheDisplayInRect butDoNotRedrawEvenIfISaidSo"? if _NSViewQuickLookState.views.contains(self) { return .view(NSImage()) } else { _NSViewQuickLookState.views.insert(self) let result: PlaygroundQuickLook if let b = bitmapImageRepForCachingDisplay(in: bounds) { cacheDisplay(in: bounds, to: b) result = .view(b) } else { result = .view(NSImage()) } _NSViewQuickLookState.views.remove(self) return result } } } // Overlays for variadics. public extension NSGradient { convenience init?(colorsAndLocations objects: (NSColor, CGFloat)...) { self.init( colors: objects.map { $0.0 }, atLocations: objects.map { $0.1 }, colorSpace: NSColorSpace.genericRGB) } } // Fix the ARGV type of NSApplicationMain, which nonsensically takes // argv as a const char**. public func NSApplicationMain( _ argc: Int32, _ argv: UnsafeMutablePointer?> ) -> Int32 { return argv.withMemoryRebound(to: UnsafePointer.self, capacity: Int(argc)) { __NSApplicationMain(argc, $0) } } extension NSApplication { @available(swift 4) public static func loadApplication() { __NSApplicationLoad() } } extension NSColor : _ExpressibleByColorLiteral { @nonobjc public required convenience init(_colorLiteralRed red: Float, green: Float, blue: Float, alpha: Float) { self.init(red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha: CGFloat(alpha)) } } public typealias _ColorLiteralType = NSColor extension NSImage : _ExpressibleByImageLiteral { private convenience init!(failableImageLiteral name: String) { self.init(named: .init(name)) } @nonobjc public required convenience init(imageLiteralResourceName name: String) { self.init(failableImageLiteral: name) } } public typealias _ImageLiteralType = NSImage // Numeric backed types @available(swift 4) public protocol _AppKitKitNumericRawRepresentable : RawRepresentable, Comparable where RawValue: Comparable & Numeric { } extension _AppKitKitNumericRawRepresentable { public static func <(lhs: Self, rhs: Self) -> Bool { return lhs.rawValue < rhs.rawValue } public static func +(lhs: Self, rhs: RawValue) -> Self { return Self(rawValue: lhs.rawValue + rhs)! } public static func +(lhs: RawValue, rhs: Self) -> Self { return Self(rawValue: lhs + rhs.rawValue)! } public static func -(lhs: Self, rhs: RawValue) -> Self { return Self(rawValue: lhs.rawValue - rhs)! } public static func -(lhs: Self, rhs: Self) -> RawValue { return lhs.rawValue - rhs.rawValue } public static func +=(lhs: inout Self, rhs: RawValue) { lhs = Self(rawValue: lhs.rawValue + rhs)! } public static func -=(lhs: inout Self, rhs: RawValue) { lhs = Self(rawValue: lhs.rawValue - rhs)! } } @available(swift 4) extension NSAppKitVersion : _AppKitKitNumericRawRepresentable { } @available(swift 4) extension NSLayoutConstraint.Priority : _AppKitKitNumericRawRepresentable { } @available(swift 4) extension NSStackView.VisibilityPriority : _AppKitKitNumericRawRepresentable { } @available(swift 4) extension NSToolbarItem.VisibilityPriority : _AppKitKitNumericRawRepresentable { } @available(macOS 10.12.2, *) @available(swift 4) extension NSTouchBarItem.Priority : _AppKitKitNumericRawRepresentable { } @available(swift 4) extension NSWindow.Level : _AppKitKitNumericRawRepresentable { } @available(swift 4) extension NSFont.Weight : _AppKitKitNumericRawRepresentable { }