Upgrade to Swift 5.1

This commit is contained in:
Sindre Sorhus 2019-09-11 21:34:41 +07:00
parent 0bd6ad734f
commit 250284d86c
9 changed files with 151 additions and 126 deletions

View file

@ -13,6 +13,8 @@ whitelist_rules:
- comma
- compiler_protocol_init
- conditional_returns_on_newline
- contains_over_filter_count
- contains_over_filter_is_empty
- contains_over_first_not_nil
- control_statement
- deployment_target
@ -21,8 +23,10 @@ whitelist_rules:
- discouraged_object_literal
- discouraged_optional_boolean
- discouraged_optional_collection
- duplicate_enum_cases
- duplicate_imports
- dynamic_inline
- empty_collection_literal
- empty_count
- empty_enum_arguments
- empty_parameters
@ -48,6 +52,7 @@ whitelist_rules:
- legacy_constant
- legacy_constructor
- legacy_hashing
- legacy_multiple
- legacy_nsgeometry_functions
- legacy_random
- literal_expression_end_indentation
@ -63,7 +68,9 @@ whitelist_rules:
- nimble_operator
- no_extension_access_modifier
- no_fallthrough_only
- no_space_in_method_call
- notification_center_detachment
- nsobject_prefer_isequal
- number_separator
- object_literal
- opening_brace
@ -76,6 +83,8 @@ whitelist_rules:
- private_unit_test
- prohibited_super_call
- protocol_property_accessors_order
- reduce_boolean
- reduce_into
- redundant_discardable_let
- redundant_nil_coalescing
- redundant_objc_attribute
@ -95,6 +104,7 @@ whitelist_rules:
- switch_case_alignment
- switch_case_on_newline
- syntactic_sugar
- todo
- toggle_bool
- trailing_closure
- trailing_comma
@ -105,7 +115,9 @@ whitelist_rules:
- unavailable_function
- unneeded_break_in_switch
- unneeded_parentheses_in_closure_argument
- unowned_variable_capture
- untyped_error_in_catch
- unused_capture_list
- unused_closure_parameter
- unused_control_flow_label
- unused_enumerated
@ -117,15 +129,13 @@ whitelist_rules:
- vertical_whitespace_closing_braces
- vertical_whitespace_opening_braces
- void_return
- weak_computed_property
- weak_delegate
- xct_specific_matcher
- xctfail_message
- yoda_condition
- todo
analyzer_rules:
- unused_declaration
- unused_import
- unused_private_declaration
force_cast: warning
force_unwrapping: warning
number_separator:
@ -134,6 +144,18 @@ object_literal:
image_literal: false
discouraged_object_literal:
color_literal: false
type_contents_order:
order:
- case
- [type_alias, associated_type, subtype]
- type_property
- type_method
- ib_outlet
- [ib_inspectable, instance_property]
- initializer
- subscript
- view_life_cycle_method
- [ib_action, other_method]
identifier_name:
max_length:
warning: 100

View file

@ -1,2 +1,2 @@
github "sindresorhus/Defaults" "v2.0.0"
github "sindresorhus/Defaults" "v3.0.0"
github "sparkle-project/Sparkle" "1.21.3"

View file

@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 51;
objectVersion = 52;
objects = {
/* Begin PBXBuildFile section */
@ -163,7 +163,7 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0820;
LastUpgradeCheck = 0930;
LastUpgradeCheck = 1100;
ORGANIZATIONNAME = "Sindre Sorhus";
TargetAttributes = {
E3FE2CBE1E726CE800C6713A = {
@ -180,10 +180,11 @@
};
};
buildConfigurationList = E3FE2CBA1E726CE800C6713A /* Build configuration list for PBXProject "Touch Bar Simulator" */;
compatibilityVersion = "Xcode 10.0";
compatibilityVersion = "Xcode 11.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = E3FE2CB61E726CE800C6713A;
@ -296,13 +297,14 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.14.4;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_COMPILATION_MODE = singlefile;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VALID_ARCHS = x86_64;
};
name = Debug;
@ -349,11 +351,12 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.14.4;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
VALID_ARCHS = x86_64;
};
name = Release;
@ -366,6 +369,7 @@
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = YG56YK5RN5;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",
@ -404,6 +408,7 @@
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = YG56YK5RN5;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",

View file

@ -4,12 +4,14 @@ import Defaults
final class AppDelegate: NSObject, NSApplicationDelegate {
lazy var window = with(TouchBarWindow()) {
$0.alphaValue = CGFloat(defaults[.windowTransparency])
$0.alphaValue = CGFloat(Defaults[.windowTransparency])
$0.setUp()
}
lazy var statusItem = with(NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)) {
$0.menu = with(NSMenu()) { $0.delegate = self }
$0.menu = with(NSMenu()) {
$0.delegate = self
}
$0.button!.image = NSImage(named: "MenuBarIcon")
$0.button!.toolTip = "Right-click or option-click for menu"
}
@ -95,7 +97,7 @@ extension AppDelegate: NSMenuDelegate {
}
private func statusItemShouldShowMenu() -> Bool {
return !NSApp.isLeftMouseDown || NSApp.isOptionKeyDown
!NSApp.isLeftMouseDown || NSApp.isOptionKeyDown
}
func menuNeedsUpdate(_ menu: NSMenu) {
@ -111,7 +113,7 @@ extension AppDelegate: NSMenuDelegate {
private func statusItemButtonClicked() {
// When the user explicitly wants the Touch Bar to appear then `dockBahavior` should be disabled.
// This is also how the macOS Dock behaves.
defaults[.dockBehavior] = false
Defaults[.dockBehavior] = false
toggleView()

View file

@ -5,7 +5,7 @@ import Defaults
extension Defaults {
@discardableResult
func observe<T: Codable, Weak: AnyObject>(
static func observe<T: Codable, Weak: AnyObject>(
_ key: Key<T>,
tiedToLifetimeOf weaklyHeldObject: Weak,
options: NSKeyValueObservingOptions = [.initial, .new, .old],
@ -40,17 +40,17 @@ extension NSMenuItem {
*/
func bindState(to key: Defaults.Key<Bool>) -> Self {
addAction { _ in
defaults[key].toggle()
Defaults[key].toggle()
}
defaults.observe(key, tiedToLifetimeOf: self) { [unowned self] change in
Defaults.observe(key, tiedToLifetimeOf: self) { [unowned self] change in
self.isChecked = change.newValue
}
return self
}
// TODO: The doc comments here are out of date
// TODO: The doc comments here are out of date.
/**
Adds an action to this menu item that sets the value of `key` in the
defaults system to `value`, and initializes this item's state based on
@ -66,10 +66,10 @@ extension NSMenuItem {
*/
func bindChecked<Value: Equatable>(to key: Defaults.Key<Value>, value: Value) -> Self {
addAction { _ in
defaults[key] = value
Defaults[key] = value
}
defaults.observe(key, tiedToLifetimeOf: self) { [unowned self] change in
Defaults.observe(key, tiedToLifetimeOf: self) { [unowned self] change in
self.isChecked = (change.newValue == value)
}
@ -91,10 +91,10 @@ extension NSSlider {
*/
func bindDoubleValue(to key: Defaults.Key<Double>) -> Self {
addAction { sender in
defaults[key] = sender.doubleValue
Defaults[key] = sender.doubleValue
}
defaults.observe(key, tiedToLifetimeOf: self) { [unowned self] change in
Defaults.observe(key, tiedToLifetimeOf: self) { [unowned self] change in
self.doubleValue = change.newValue
}

View file

@ -22,12 +22,12 @@ private final class ToolbarSliderCell: NSSliderCell {
var frame = knobRect.insetBy(dx: 0, dy: 6.5)
if let shadow = self.shadow {
// Make room on either side of the view for the shadow to spill into,
// rather than clip on the edges
// rather than clip on the edges.
frame.origin.x *= ((barRect.width - shadow.shadowBlurRadius * 2) / barRect.width)
frame.origin.x += shadow.shadowBlurRadius
}
// Make the slider grey
// Make the slider grey.
var greySliderFrame = barRect
greySliderFrame.origin.x -= 1
greySliderFrame.origin.y = barRect.origin.y + 1
@ -46,7 +46,7 @@ private final class ToolbarSliderCell: NSSliderCell {
fillColor.set()
path.fill()
// Border should not draw a shadow
// Border should not draw a shadow.
NSShadow().set()
// Border
@ -81,7 +81,7 @@ extension NSSlider {
// itself brighter for some reason.
func alwaysRedisplayOnValueChanged() -> Self {
addAction { sender in
if (defaults[.windowTransparency] - sender.doubleValue) != 0 {
if (Defaults[.windowTransparency] - sender.doubleValue) != 0 {
sender.needsDisplay = true
}
}

View file

@ -20,9 +20,7 @@ final class TouchBarView: NSView {
stop()
}
override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
return true
}
override func acceptsFirstMouse(for event: NSEvent?) -> Bool { true }
func start() {
stream = SLSDFRDisplayStreamCreate(0, .main) { status, _, frameSurface, _ in
@ -38,7 +36,7 @@ final class TouchBarView: NSView {
}
func stop() {
guard let stream = stream else {
guard let stream = self.stream else {
return
}

View file

@ -21,7 +21,7 @@ final class TouchBarWindow: NSPanel {
func reposition(window: NSWindow) {
switch self {
case .floating:
if let prevPosition = defaults[.lastFloatingPosition] {
if let prevPosition = Defaults[.lastFloatingPosition] {
window.setFrameOrigin(prevPosition)
}
case .dockedToTop:
@ -32,18 +32,22 @@ final class TouchBarWindow: NSPanel {
}
}
override var canBecomeMain: Bool { false }
override var canBecomeKey: Bool { false }
var docking: Docking = .floating {
didSet {
if oldValue == .floating && docking != .floating {
defaults[.lastFloatingPosition] = frame.origin
Defaults[.lastFloatingPosition] = frame.origin
}
if self.docking == .floating {
if docking == .floating {
dockBehavior = false
}
// Prevent the Touch Bar from momentarily becoming visible.
if self.docking == .floating || !dockBehavior {
if docking == .floating || !dockBehavior {
stopDockBehaviorTimer()
docking.dock(window: self)
setIsVisible(true)
@ -51,7 +55,7 @@ final class TouchBarWindow: NSPanel {
return
}
// When docking is set to `dockedToTop` or `dockedToBottom` dockBehavior should start
// When docking is set to `dockedToTop` or `dockedToBottom` dockBehavior should start.
if dockBehavior {
setIsVisible(false)
docking.dock(window: self)
@ -80,7 +84,14 @@ final class TouchBarWindow: NSPanel {
func startDockBehaviorTimer() {
stopDockBehaviorTimer()
dockBehaviorTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(handleDockBehavior), userInfo: nil, repeats: true)
dockBehaviorTimer = Timer.scheduledTimer(
timeInterval: 0.1,
target: self,
selector: #selector(handleDockBehavior),
userInfo: nil,
repeats: true
)
}
func stopDockBehaviorTimer() {
@ -88,23 +99,23 @@ final class TouchBarWindow: NSPanel {
dockBehaviorTimer = Timer()
}
var dockBehavior: Bool = defaults[.dockBehavior] {
var dockBehavior: Bool = Defaults[.dockBehavior] {
didSet {
defaults[.dockBehavior] = self.dockBehavior
if self.docking == .dockedToBottom || self.docking == .dockedToTop {
defaults[.lastWindowDockingWithDockBehavior] = self.docking
Defaults[.dockBehavior] = dockBehavior
if docking == .dockedToBottom || docking == .dockedToTop {
Defaults[.lastWindowDockingWithDockBehavior] = docking
}
if dockBehavior {
if self.docking == .dockedToBottom || self.docking == .dockedToTop {
self.docking = defaults[.lastWindowDockingWithDockBehavior]
if docking == .dockedToBottom || docking == .dockedToTop {
docking = Defaults[.lastWindowDockingWithDockBehavior]
startDockBehaviorTimer()
} else if self.docking == .floating {
defaults[.windowDocking] = defaults[.lastWindowDockingWithDockBehavior]
} else if docking == .floating {
Defaults[.windowDocking] = Defaults[.lastWindowDockingWithDockBehavior]
}
} else {
stopDockBehaviorTimer()
self.setIsVisible(true)
setIsVisible(true)
}
}
}
@ -119,25 +130,25 @@ final class TouchBarWindow: NSPanel {
}
var detectionRect: NSRect = .zero
if self.docking == .dockedToBottom {
if self.isVisible {
if docking == .dockedToBottom {
if isVisible {
detectionRect = CGRect(
x: 0,
y: 0,
width: visibleFrame.width,
height: self.frame.height + (screenFrame.height - visibleFrame.height - NSStatusBar.system.thickness)
height: frame.height + (screenFrame.height - visibleFrame.height - NSStatusBar.system.thickness)
)
} else {
detectionRect = CGRect(x: 0, y: 0, width: visibleFrame.width, height: 1)
}
} else if self.docking == .dockedToTop {
if self.isVisible {
} else if docking == .dockedToTop {
if isVisible {
detectionRect = CGRect(
x: 0,
// Without `+ 1`, the Touch Bar would glitch (toggling rapidly).
y: screenFrame.height - self.frame.height - NSStatusBar.system.thickness + 1,
y: screenFrame.height - frame.height - NSStatusBar.system.thickness + 1,
width: visibleFrame.width,
height: self.frame.height + NSStatusBar.system.thickness)
height: frame.height + NSStatusBar.system.thickness)
} else {
detectionRect = CGRect(
x: 0,
@ -167,7 +178,7 @@ final class TouchBarWindow: NSPanel {
showTouchBarTimer = Timer()
showAnimationDidRun = false
if self.isVisible && !dismissAnimationDidRun {
if isVisible && !dismissAnimationDidRun {
performActionWithAnimation(action: .dismiss)
dismissAnimationDidRun = true
}
@ -175,10 +186,10 @@ final class TouchBarWindow: NSPanel {
}
func moveToStartPoint() {
if self.docking == .dockedToTop {
self.moveTo(x: .center, y: .top)
} else if self.docking == .dockedToBottom {
self.moveTo(x: .center, y: .bottom)
if docking == .dockedToTop {
moveTo(x: .center, y: .top)
} else if docking == .dockedToBottom {
moveTo(x: .center, y: .bottom)
}
}
@ -187,25 +198,25 @@ final class TouchBarWindow: NSPanel {
func showTouchBarWithAnimation() {
guard
self.docking == .dockedToTop ||
self.docking == .dockedToBottom
docking == .dockedToTop ||
docking == .dockedToBottom
else {
return
}
var startOrigin: CGPoint!
let endFrame = self.frame
self.setIsVisible(true)
if self.docking == .dockedToTop {
startOrigin = CGPoint(x: self.frame.origin.x, y: self.frame.origin.y + self.frame.height)
} else if self.docking == .dockedToBottom {
startOrigin = CGPoint(x: self.frame.origin.x, y: 0 - self.frame.height)
let endFrame = frame
setIsVisible(true)
if docking == .dockedToTop {
startOrigin = CGPoint(x: frame.origin.x, y: frame.origin.y + frame.height)
} else if docking == .dockedToBottom {
startOrigin = CGPoint(x: frame.origin.x, y: 0 - frame.height)
}
self.setFrameOrigin(startOrigin)
setFrameOrigin(startOrigin)
NSAnimationContext.runAnimationGroup({ context in
context.duration = TimeInterval(0.3)
self.animator().setFrame(endFrame, display: false, animate: true)
animator().setFrame(endFrame, display: false, animate: true)
}, completionHandler: {
self.moveToStartPoint()
})
@ -213,22 +224,22 @@ final class TouchBarWindow: NSPanel {
func dismissTouchBarWithAnimation() {
guard
self.docking == .dockedToTop ||
self.docking == .dockedToBottom
docking == .dockedToTop ||
docking == .dockedToBottom
else {
return
}
var endFrame = self.frame
if self.docking == .dockedToTop {
endFrame.origin = NSPoint(x: self.frame.origin.x, y: self.frame.origin.y + self.frame.height + NSStatusBar.system.thickness)
} else if self.docking == .dockedToBottom {
endFrame.origin = NSPoint(x: self.frame.origin.x, y: 0 - self.frame.height)
var endFrame = frame
if docking == .dockedToTop {
endFrame.origin = NSPoint(x: frame.origin.x, y: frame.origin.y + frame.height + NSStatusBar.system.thickness)
} else if docking == .dockedToBottom {
endFrame.origin = NSPoint(x: frame.origin.x, y: 0 - frame.height)
}
NSAnimationContext.runAnimationGroup({ context in
context.duration = TimeInterval(0.3)
self.animator().setFrame(endFrame, display: false, animate: true)
animator().setFrame(endFrame, display: false, animate: true)
}, completionHandler: {
self.setIsVisible(false)
self.moveToStartPoint()
@ -237,38 +248,41 @@ final class TouchBarWindow: NSPanel {
func performActionWithAnimation(action: TouchBarAction) {
guard
self.docking == .dockedToTop ||
self.docking == .dockedToBottom
else {
return
docking == .dockedToTop ||
docking == .dockedToBottom
else {
return
}
var startOrigin: CGPoint!
var endFrame = self.frame
var endFrame = frame
if action == .show {
self.setIsVisible(true)
if self.docking == .dockedToTop {
startOrigin = CGPoint(x: self.frame.origin.x, y: self.frame.origin.y + self.frame.height)
} else if self.docking == .dockedToBottom {
startOrigin = CGPoint(x: self.frame.origin.x, y: 0 - self.frame.height)
setIsVisible(true)
if docking == .dockedToTop {
startOrigin = CGPoint(x: frame.origin.x, y: frame.origin.y + frame.height)
} else if docking == .dockedToBottom {
startOrigin = CGPoint(x: frame.origin.x, y: 0 - frame.height)
}
self.setFrameOrigin(startOrigin)
setFrameOrigin(startOrigin)
} else if action == .dismiss {
if self.docking == .dockedToTop {
endFrame.origin = NSPoint(x: self.frame.origin.x, y: self.frame.origin.y + self.frame.height + NSStatusBar.system.thickness)
} else if self.docking == .dockedToBottom {
endFrame.origin = NSPoint(x: self.frame.origin.x, y: 0 - self.frame.height)
if docking == .dockedToTop {
endFrame.origin = NSPoint(x: frame.origin.x, y: frame.origin.y + frame.height + NSStatusBar.system.thickness)
} else if docking == .dockedToBottom {
endFrame.origin = NSPoint(x: frame.origin.x, y: 0 - frame.height)
}
}
NSAnimationContext.runAnimationGroup({ context in
context.duration = TimeInterval(0.3)
self.animator().setFrame(endFrame, display: false, animate: true)
animator().setFrame(endFrame, display: false, animate: true)
}, completionHandler: {
if action == .dismiss {
self.setIsVisible(false)
}
self.moveToStartPoint()
})
}
@ -316,14 +330,6 @@ final class TouchBarWindow: NSPanel {
return slider
}
override var canBecomeMain: Bool {
return false
}
override var canBecomeKey: Bool {
return false
}
private var defaultsObservations: [DefaultsObservation] = []
func setUp() {
@ -337,21 +343,21 @@ final class TouchBarWindow: NSPanel {
view.addSubview(touchBarView)
// TODO: These could use the `observe` method with `tiedToLifetimeOf` so we don't have to manually invalidate them.
defaultsObservations.append(defaults.observe(.windowTransparency) { change in
defaultsObservations.append(Defaults.observe(.windowTransparency) { change in
self.alphaValue = CGFloat(change.newValue)
})
defaultsObservations.append(defaults.observe(.windowDocking) { change in
defaultsObservations.append(Defaults.observe(.windowDocking) { change in
self.docking = change.newValue
})
// TODO: We could maybe simplify this by creating another `Default` extension to bind a default to a KeyPath:
// `defaults.bind(.showOnAllDesktops, to: \.showOnAllDesktop)`
defaultsObservations.append(defaults.observe(.showOnAllDesktops) { change in
defaultsObservations.append(Defaults.observe(.showOnAllDesktops) { change in
self.showOnAllDesktops = change.newValue
})
defaultsObservations.append(defaults.observe(.dockBehavior) { change in
defaultsObservations.append(Defaults.observe(.dockBehavior) { change in
self.dockBehavior = change.newValue
})
@ -388,8 +394,8 @@ final class TouchBarWindow: NSPanel {
backing: .buffered,
defer: false
)
self.level = .assistiveTechHigh
self.level = .assistiveTechHigh
self._setPreventsActivation(true)
self.isRestorable = true
self.hidesOnDeactivate = false

View file

@ -1,7 +1,7 @@
import Cocoa
/**
Convenience function for initializing an object and modifying its properties
Convenience function for initializing an object and modifying its properties.
```
let label = with(NSTextField()) {
@ -19,8 +19,8 @@ func with<T>(_ item: T, update: (inout T) throws -> Void) rethrows -> T {
}
extension CGRect {
func adding(padding: Double) -> CGRect {
return CGRect(
func adding(padding: Double) -> Self {
Self(
x: origin.x - CGFloat(padding),
y: origin.y - CGFloat(padding),
width: width + CGFloat(padding * 2),
@ -29,10 +29,10 @@ extension CGRect {
}
/**
Returns a CGRect where `self` is centered in `rect`
Returns a `CGRect` where `self` is centered in `rect`.
*/
func centered(in rect: CGRect, xOffset: Double = 0, yOffset: Double = 0) -> CGRect {
return CGRect(
func centered(in rect: Self, xOffset: Double = 0, yOffset: Double = 0) -> Self {
Self(
x: ((rect.width - size.width) / 2) + CGFloat(xOffset),
y: ((rect.height - size.height) / 2) + CGFloat(yOffset),
width: size.width,
@ -42,9 +42,7 @@ extension CGRect {
}
extension NSWindow {
var toolbarView: NSView? {
return standardWindowButton(.closeButton)?.superview
}
var toolbarView: NSView? { standardWindowButton(.closeButton)?.superview }
}
extension NSWindow {
@ -60,6 +58,7 @@ extension NSWindow {
guard let screen = NSScreen.main else {
return
}
let visibleFrame = screen.visibleFrame
let x: CGFloat, y: CGFloat
@ -73,7 +72,7 @@ extension NSWindow {
}
switch yPositioning {
case .top:
// Defect fix: keep docked windows below menubar area
// Defect fix: keep docked windows below menubar area.
// Previously, the window would obstruct menubar clicks when the menubar was set to auto-hide.
// Now, the window stays below that area.
let menubarThickness = NSStatusBar.system.thickness
@ -96,9 +95,7 @@ extension NSView {
extension NSMenuItem {
var isChecked: Bool {
get {
return state == .on
}
get { state == .on }
set {
state = newValue ? .on : .off
}
@ -130,7 +127,7 @@ extension NSMenuItem {
final class AssociatedObject<T: Any> {
subscript(index: Any) -> T? {
get {
return objc_getAssociatedObject(index, Unmanaged.passUnretained(self).toOpaque()) as! T?
objc_getAssociatedObject(index, Unmanaged.passUnretained(self).toOpaque()) as! T?
} set {
objc_setAssociatedObject(index, Unmanaged.passUnretained(self).toOpaque(), newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
@ -179,7 +176,7 @@ extension TargetActionSender {
*/
var onAction: ((Self) -> Void)? {
get {
return (TargetActionSenderAssociatedKeys.trampoline[self] as? ActionTrampoline<Self>)?.action
(TargetActionSenderAssociatedKeys.trampoline[self] as? ActionTrampoline<Self>)?.action
}
set {
guard let newValue = newValue else {
@ -207,13 +204,8 @@ extension TargetActionSender {
}
extension NSApplication {
var isLeftMouseDown: Bool {
return currentEvent?.type == .leftMouseDown
}
var isOptionKeyDown: Bool {
return NSEvent.modifierFlags.contains(.option)
}
var isLeftMouseDown: Bool { currentEvent?.type == .leftMouseDown }
var isOptionKeyDown: Bool { NSEvent.modifierFlags.contains(.option) }
}
// TODO: Find a namespace to put this onto. I don't like free-floating functions.
@ -228,7 +220,7 @@ func pressKey(keyCode: CGKeyCode, flags: CGEventFlags = []) {
extension NSWindow.Level {
private static func level(for cgLevelKey: CGWindowLevelKey) -> NSWindow.Level {
return NSWindow.Level(rawValue: Int(CGWindowLevelForKey(cgLevelKey)))
NSWindow.Level(rawValue: Int(CGWindowLevelForKey(cgLevelKey)))
}
public static let desktop = level(for: .desktopWindow)