//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// import Foundation @_exported import AppKit extension NSCursor : CustomPlaygroundQuickLookable { public var customPlaygroundQuickLook: PlaygroundQuickLook { return .image(image) } } internal struct _NSViewQuickLookState { static var views = Set() } extension NSView : CustomPlaygroundQuickLookable { public var customPlaygroundQuickLook: 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**. @_silgen_name("NSApplicationMain") public func NSApplicationMain( argc: Int32, _ argv: UnsafeMutablePointer> ) -> Int32 extension NSColor : _ColorLiteralConvertible { public required convenience init(colorLiteralRed red: Float, green: Float, blue: Float, alpha: Float) { self.init(srgbRed: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha: CGFloat(alpha)) } } public typealias _ColorLiteralType = NSColor extension NSImage : _ImageLiteralConvertible { private convenience init!(failableImageLiteral name: String) { self.init(named: name) } public required convenience init(imageLiteral name: String) { self.init(failableImageLiteral: name) } } public typealias _ImageLiteralType = NSImage