| //===----------------------------------------------------------------------===// |
| // |
| // 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 : _DefaultCustomPlaygroundQuickLookable { |
| public var _defaultCustomPlaygroundQuickLook: PlaygroundQuickLook { |
| return .image(image) |
| } |
| } |
| |
| internal struct _NSViewQuickLookState { |
| static var views = Set<NSView>() |
| } |
| |
| 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**. |
| @_silgen_name("NSApplicationMain") |
| public func NSApplicationMain( |
| _ argc: Int32, _ argv: UnsafeMutablePointer<UnsafeMutablePointer<CChar>?> |
| ) -> Int32 |
| |
| extension NSColor : _ExpressibleByColorLiteral { |
| 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 : _ExpressibleByImageLiteral { |
| private convenience init!(failableImageLiteral name: String) { |
| self.init(named: name) |
| } |
| |
| public required convenience init(imageLiteralResourceName name: String) { |
| self.init(failableImageLiteral: name) |
| } |
| } |
| |
| public typealias _ImageLiteralType = NSImage |
| |
| // Renaming shims. |
| extension NSObjectController { |
| @available(*, deprecated, renamed: "addObject(_:)") |
| @nonobjc func add(_ object: AnyObject) { |
| self.addObject(object) |
| } |
| |
| @available(*, deprecated, renamed: "removeObject(_:)") |
| @nonobjc func remove(_ object: AnyObject) { |
| self.removeObject(object) |
| } |
| } |
| |
| extension NSViewController { |
| @available(OSX 10.10, *) |
| @available(*, deprecated, renamed: "presentViewController(_:animator:)") |
| @nonobjc func present(_ viewController: NSViewController, animator: NSViewControllerPresentationAnimator) { |
| self.presentViewController(viewController, animator: animator) |
| } |
| |
| @available(OSX 10.10, *) |
| @available(*, deprecated, renamed: "dismissViewController(_:)") |
| @nonobjc func dismiss(_ viewController: NSViewController) { |
| self.dismissViewController(viewController) |
| } |
| |
| @available(OSX 10.10, *) |
| @available(*, deprecated, renamed: "presentViewControllerAsSheet(_:)") |
| @nonobjc func present(asSheet viewController: NSViewController) { |
| self.presentViewControllerAsSheet(viewController) |
| } |
| |
| @available(OSX 10.10, *) |
| @available(*, deprecated, renamed: "presentViewControllerAsModalWindow(_:)") |
| @nonobjc func present(asModalWindow viewController: NSViewController) { |
| self.presentViewControllerAsModalWindow(viewController) |
| } |
| |
| @available(OSX 10.10, *) |
| @available(*, deprecated, renamed: "presentViewController(_:asPopoverRelativeTo:of:preferredEdge:behavior:)") |
| @nonobjc func present(_ viewController: NSViewController, asPopoverRelativeTo positioningRect: NSRect, of positioningView: NSView, preferredEdge: NSRectEdge, behavior: NSPopoverBehavior) { |
| self.presentViewController(viewController, asPopoverRelativeTo: positioningRect, of: positioningView, preferredEdge: preferredEdge, behavior: behavior) |
| } |
| } |
| |
| extension NSWindowController { |
| @available(OSX 10.10, *) |
| @available(*, deprecated, renamed: "dismissController(_:)") |
| @nonobjc func dismiss(_ sender: AnyObject?) { |
| self.dismissController(sender) |
| } |
| } |