From 86c07ef4f5d49b4b998bded74e3cfc229fae498b Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Fri, 5 Oct 2018 20:07:03 -0700 Subject: [PATCH] Wow, the screensaver runs! --- Metaballs.xcodeproj/project.pbxproj | 8 ++--- MetaballsSaver/MetaballsSaverView.swift | 40 +++++++++++++------------ 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/Metaballs.xcodeproj/project.pbxproj b/Metaballs.xcodeproj/project.pbxproj index 696cd1d..6c0a38b 100644 --- a/Metaballs.xcodeproj/project.pbxproj +++ b/Metaballs.xcodeproj/project.pbxproj @@ -415,7 +415,7 @@ PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.MetaballsSaver; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; WRAPPER_EXTENSION = saver; }; name = Debug; @@ -434,7 +434,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.12; PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.MetaballsSaver; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; WRAPPER_EXTENSION = saver; }; name = Release; @@ -588,7 +588,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.MetaballsTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; SWIFT_VERSION = 4.2; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Metaballs.app/Contents/MacOS/Metaballs"; }; @@ -605,7 +605,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.MetaballsTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; SWIFT_VERSION = 4.2; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Metaballs.app/Contents/MacOS/Metaballs"; }; diff --git a/MetaballsSaver/MetaballsSaverView.swift b/MetaballsSaver/MetaballsSaverView.swift index 5af0ae7..dc83a52 100644 --- a/MetaballsSaver/MetaballsSaverView.swift +++ b/MetaballsSaver/MetaballsSaverView.swift @@ -10,7 +10,7 @@ import Foundation import MetalKit import ScreenSaver -public class MetaballsSaverView: ScreenSaverView, RendererDelegate { +@objc public class MetaballsSaverView: ScreenSaverView, RendererDelegate { private static func defaultParameters() -> Parameters { var p = Parameters() let defaults = UserDefaults.standard @@ -35,14 +35,30 @@ public class MetaballsSaverView: ScreenSaverView, RendererDelegate { override public init?(frame: NSRect, isPreview: Bool) { let params = MetaballsSaverView.defaultParameters() - metalView = MetalView() field = Field(parameters: params) field.size = Size(size: frame.size) + + metalView = MetalView() + metalView.isPaused = true // Don't use the Metal View's internal timer. + metalView.translatesAutoresizingMaskIntoConstraints = false + renderer = Renderer() + metalView.delegate = renderer super.init(frame: frame, isPreview: isPreview) + addSubview(metalView) + NSLayoutConstraint.activate([ + metalView.topAnchor.constraint(equalTo: topAnchor), + metalView.leftAnchor.constraint(equalTo: leftAnchor), + metalView.bottomAnchor.constraint(equalTo: bottomAnchor), + metalView.rightAnchor.constraint(equalTo: rightAnchor), + ]) + + renderer.delegate = self + animationTimeInterval = 1 / 30.0 + metalView.preferredFramesPerSecond = 30 } required public init?(coder: NSCoder) { @@ -50,23 +66,9 @@ public class MetaballsSaverView: ScreenSaverView, RendererDelegate { } override public func startAnimation() { - if metalView.superview == nil { - metalView.isPaused = true // Don't use the Metal View's internal timer. - metalView.translatesAutoresizingMaskIntoConstraints = false - addSubview(metalView) - NSLayoutConstraint.activate([ - metalView.topAnchor.constraint(equalTo: topAnchor), - metalView.leftAnchor.constraint(equalTo: leftAnchor), - metalView.bottomAnchor.constraint(equalTo: bottomAnchor), - metalView.rightAnchor.constraint(equalTo: rightAnchor), - ]) - renderer.delegate = self - } - for _ in 1...10 { addBallWithRandomRadius() } - super.startAnimation() } @@ -79,14 +81,14 @@ public class MetaballsSaverView: ScreenSaverView, RendererDelegate { } override public func draw(_ rect: NSRect) { - super.draw(rect) + metalView.draw() } - override public func hasConfigureSheet() -> Bool { + override public var hasConfigureSheet: Bool { return true } - override public func configureSheet() -> NSWindow? { + override public var configureSheet: NSWindow? { let prefs = PreferencesViewController() prefs.showsCloseButton = true let window = NSWindow(contentViewController: prefs)