From 324edcb391bac961b4ae90566067808947dd9098 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 12 Jul 2021 22:38:08 -0400 Subject: [PATCH 01/12] Starts towards using an in-window options panel. With the same fade in/out behaviour as the volume control. --- .../Base.lproj/Atari2600Options.xib | 148 +++++++----------- .../Documents/MachineDocument.swift | 97 +++++++++--- 2 files changed, 138 insertions(+), 107 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Options.xib b/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Options.xib index 41c6e7572..7d4caee1e 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Options.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Options.xib @@ -8,97 +8,69 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index 945c9ad21..b858c4cb0 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -49,6 +49,9 @@ class MachineDocument: /// The options panel, if any. @IBOutlet var optionsPanel: MachinePanel! + /// The options view, if any. + @IBOutlet var optionsView: NSView! + /// An action to display the options panel, if there is one. @IBAction func showOptions(_ sender: AnyObject!) { optionsPanel?.setIsVisible(true) @@ -217,9 +220,44 @@ class MachineDocument: // Attach an options panel if one is available. if let optionsPanelNibName = self.machineDescription?.optionsPanelNibName { Bundle.main.loadNibNamed(optionsPanelNibName, owner: self, topLevelObjects: nil) - self.optionsPanel.machine = machine - self.optionsPanel?.establishStoredOptions() - showOptions(self) + if let optionsPanel = self.optionsPanel { + optionsPanel.machine = machine + optionsPanel.establishStoredOptions() + showOptions(self) + } + if let optionsView = self.optionsView, let superview = self.volumeView.superview { + // Apply rounded edges. + optionsView.wantsLayer = true + optionsView.layer?.cornerRadius = 5.0 +// optionsView.translatesAutoresizingMaskIntoConstraints = false + + // Add to the superview. + superview.addSubview(optionsView) + + // Apply constraints to appear centred and above the volume view. + let centreConstraint = NSLayoutConstraint( + item: optionsView, + attribute: .centerX, + relatedBy: .equal, + toItem: self.volumeView, + attribute: .centerX, + multiplier: 1.0, + constant: 0.0 + ) + superview.addConstraint(centreConstraint) + + let verticalConstraint = NSLayoutConstraint( + item: optionsView, + attribute: .bottom, + relatedBy: .equal, + toItem: self.volumeView, + attribute: .top, + multiplier: 1.0, + constant: -8.0 // TODO: find a way to use an OS-supplied standard value here. + ) + superview.addConstraint(verticalConstraint) + + } } // Create and populate an activity display if required. @@ -713,37 +751,58 @@ class MachineDocument: // So, the workaround: make my CAAnimationDelegate something that doesn't // appear in the bridging header. fileprivate class ViewFader: NSObject, CAAnimationDelegate { - var volumeView: NSView + var views: [NSView] - init(view: NSView) { - volumeView = view + init(views: [NSView]) { + self.views = views } func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { - volumeView.isHidden = true + for view in views { + view.isHidden = true + } } } fileprivate var animationFader: ViewFader? = nil + var fadingViews: [NSView] { + get { + var views: [NSView] = [] + if let optionsView = self.optionsView { + views.append(optionsView) + } + if let volumeView = self.volumeView { + views.append(volumeView) + } + return views + } + } + internal func scanTargetViewDidShowOSMouseCursor(_ view: CSScanTargetView) { // The OS mouse cursor became visible, so show the volume controls. animationFader = nil - volumeView.layer?.removeAllAnimations() - volumeView.isHidden = false - volumeView.layer?.opacity = 1.0 + for view in self.fadingViews { + view.layer?.removeAllAnimations() + view.isHidden = false + view.layer?.opacity = 1.0 + } } internal func scanTargetViewWillHideOSMouseCursor(_ view: CSScanTargetView) { // The OS mouse cursor will be hidden, so hide the volume controls. - if !volumeView.isHidden && volumeView.layer?.animation(forKey: "opacity") == nil { - let fadeAnimation = CABasicAnimation(keyPath: "opacity") - fadeAnimation.fromValue = 1.0 - fadeAnimation.toValue = 0.0 - fadeAnimation.duration = 0.2 - animationFader = ViewFader(view: volumeView) - fadeAnimation.delegate = animationFader - volumeView.layer?.add(fadeAnimation, forKey: "opacity") - volumeView.layer?.opacity = 0.0 + let fadingViews = self.fadingViews + + if !fadingViews[0].isHidden && fadingViews[0].layer?.animation(forKey: "opacity") == nil { + for view in self.fadingViews { + let fadeAnimation = CABasicAnimation(keyPath: "opacity") + fadeAnimation.fromValue = 1.0 + fadeAnimation.toValue = 0.0 + fadeAnimation.duration = 0.2 + fadeAnimation.delegate = animationFader + view.layer?.add(fadeAnimation, forKey: "opacity") + view.layer?.opacity = 0.0 + } + animationFader = ViewFader(views: fadingViews) } } From b01561712ced2587150e0ee4302156aa82dea196 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 12 Jul 2021 22:49:42 -0400 Subject: [PATCH 02/12] Tightens spacing slightly. --- .../Base.lproj/Atari2600Options.xib | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Options.xib b/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Options.xib index 7d4caee1e..9254425b4 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Options.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Options.xib @@ -13,64 +13,65 @@ - - - + - - - + + + - + diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib b/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib index 94d298078..63074cdbb 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib @@ -1,8 +1,8 @@ - + - + @@ -13,17 +13,17 @@ - + - - - + + + - + diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib b/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib index b8918eae9..fc410f235 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib @@ -1,8 +1,7 @@ - + - - + @@ -13,17 +12,17 @@ - + - + - + diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadOptions.xib b/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadOptions.xib index e9b5be46a..055cd4113 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadOptions.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadOptions.xib @@ -1,8 +1,8 @@ - + - + @@ -13,17 +13,17 @@ - + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + diff --git a/OSBindings/Mac/Clock Signal/Documents/AppleIIOptionsPanel.swift b/OSBindings/Mac/Clock Signal/Documents/AppleIIController.swift similarity index 95% rename from OSBindings/Mac/Clock Signal/Documents/AppleIIOptionsPanel.swift rename to OSBindings/Mac/Clock Signal/Documents/AppleIIController.swift index bcb7aaff2..349e5f219 100644 --- a/OSBindings/Mac/Clock Signal/Documents/AppleIIOptionsPanel.swift +++ b/OSBindings/Mac/Clock Signal/Documents/AppleIIController.swift @@ -6,7 +6,7 @@ // Copyright 2021 Thomas Harte. All rights reserved. // -class AppleIIOptionsPanel: MachineController { +class AppleIIController: MachineController { var appleII: CSAppleII! { get { return self.machine.appleII From 524e2abc8cefffb6438756c01f0c5cdc9f94b192 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 13 Jul 2021 19:19:47 -0400 Subject: [PATCH 06/12] Adapts composite options. --- .../Base.lproj/CompositeOptions.xib | 72 +++++++++---------- 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/CompositeOptions.xib b/OSBindings/Mac/Clock Signal/Base.lproj/CompositeOptions.xib index a78f94bbc..6e2c149cd 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/CompositeOptions.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/CompositeOptions.xib @@ -8,49 +8,45 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - + From 000d99f26cf5624f975d7c7f0c7574e60cddbfa5 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 13 Jul 2021 19:26:29 -0400 Subject: [PATCH 07/12] Adapts the Macintosh options. --- .../Base.lproj/MacintoshOptions.xib | 57 +++++++++---------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib b/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib index 63074cdbb..2bf8de405 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib @@ -8,42 +8,37 @@ - + - - - - - - - - - - - - - - - - - - + + - + - - + From 3d1d15a25b28edccde1bf5bd2f45b03fcacb9228 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 13 Jul 2021 19:32:23 -0400 Subject: [PATCH 08/12] Updates the Oric options. --- .../Clock Signal/Base.lproj/OricOptions.xib | 100 +++++++++--------- 1 file changed, 48 insertions(+), 52 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/OricOptions.xib b/OSBindings/Mac/Clock Signal/Base.lproj/OricOptions.xib index 366e0b17b..f2f29e25f 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/OricOptions.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/OricOptions.xib @@ -8,63 +8,59 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + From 3c36c9072979ee3789fdd3b228051cd1cd84fc79 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 13 Jul 2021 21:17:52 -0400 Subject: [PATCH 09/12] Adapts QuickLoadCompositeOptions. --- .../Base.lproj/QuickLoadCompositeOptions.xib | 100 +++++++++--------- 1 file changed, 49 insertions(+), 51 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib b/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib index fc410f235..30c91fdce 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib @@ -1,68 +1,66 @@ + - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + From 754221d6974fe45520792df0fab5c655334aaac5 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 13 Jul 2021 21:21:02 -0400 Subject: [PATCH 10/12] Adapts QuickLoadOptions. Not that it currently seems to be used. --- .../Base.lproj/QuickLoadOptions.xib | 57 +++++++++---------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadOptions.xib b/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadOptions.xib index 055cd4113..5217e6f47 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadOptions.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/QuickLoadOptions.xib @@ -8,42 +8,37 @@ - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - + From 486bb911a95b1f2cafe2374bba246a1592651419 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 13 Jul 2021 21:26:20 -0400 Subject: [PATCH 11/12] Adapts ZX80/81 options. --- .../Clock Signal.xcodeproj/project.pbxproj | 8 +- .../Clock Signal/Base.lproj/ZX8081Options.xib | 118 +++++++++--------- ...ionsPanel.swift => ZX8081Controller.swift} | 2 +- 3 files changed, 62 insertions(+), 66 deletions(-) rename OSBindings/Mac/Clock Signal/Documents/{ZX8081OptionsPanel.swift => ZX8081Controller.swift} (97%) diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 2a6c53f80..1a434a410 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -588,7 +588,7 @@ 4BA91E1D216D85BA00F79557 /* MasterSystemVDPTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BA91E1C216D85BA00F79557 /* MasterSystemVDPTests.mm */; }; 4BAD13441FF709C700FD114A /* MSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0E61051FF34737002A9DBD /* MSX.cpp */; }; 4BAE49582032881E004BE78E /* CSZX8081.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B14978E1EE4B4D200CE2596 /* CSZX8081.mm */; }; - 4BAE495920328897004BE78E /* ZX8081OptionsPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B95FA9C1F11893B0008E395 /* ZX8081OptionsPanel.swift */; }; + 4BAE495920328897004BE78E /* ZX8081Controller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B95FA9C1F11893B0008E395 /* ZX8081Controller.swift */; }; 4BAF2B4E2004580C00480230 /* DMK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAF2B4C2004580C00480230 /* DMK.cpp */; }; 4BAF2B4F2004580C00480230 /* DMK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAF2B4C2004580C00480230 /* DMK.cpp */; }; 4BB0A65B2044FD3000FB3688 /* SN76489.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BB0A6592044FD3000FB3688 /* SN76489.cpp */; }; @@ -1563,7 +1563,7 @@ 4B92EAC91B7C112B00246143 /* 6502TimingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 6502TimingTests.swift; sourceTree = ""; }; 4B9378E222A199C600973513 /* Audio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Audio.cpp; sourceTree = ""; }; 4B9378E322A199C600973513 /* Audio.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Audio.hpp; sourceTree = ""; }; - 4B95FA9C1F11893B0008E395 /* ZX8081OptionsPanel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZX8081OptionsPanel.swift; sourceTree = ""; }; + 4B95FA9C1F11893B0008E395 /* ZX8081Controller.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZX8081Controller.swift; sourceTree = ""; }; 4B961408222760E0001A7BF2 /* Screenshot.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Screenshot.hpp; sourceTree = ""; }; 4B96F7CB263E30B00092AEE1 /* RawSectorDump.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = RawSectorDump.hpp; sourceTree = ""; }; 4B96F7CC263E33B10092AEE1 /* DSK.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DSK.cpp; sourceTree = ""; }; @@ -2850,7 +2850,7 @@ 4B8FE21F1DA19D7C0090D3CE /* Atari2600OptionsController.swift */, 4B55CE5E1C3B7D960093A61B /* MachineDocument.swift */, 4B8FE2211DA19FB20090D3CE /* MachineController.swift */, - 4B95FA9C1F11893B0008E395 /* ZX8081OptionsPanel.swift */, + 4B95FA9C1F11893B0008E395 /* ZX8081Controller.swift */, 4B08A56720D72BEF0016CE5A /* Activity.xib */, 4BC5FC2E20CDDDEE00410AA0 /* AppleIIOptions.xib */, 4B8FE2131DA19D5F0090D3CE /* Atari2600Options.xib */, @@ -5544,7 +5544,7 @@ 4B302184208A550100773308 /* DiskII.cpp in Sources */, 4BEA52631DF339D7007E74F2 /* SoundGenerator.cpp in Sources */, 4BD67DD0209BF27B00AB2146 /* Encoder.cpp in Sources */, - 4BAE495920328897004BE78E /* ZX8081OptionsPanel.swift in Sources */, + 4BAE495920328897004BE78E /* ZX8081Controller.swift in Sources */, 4B89451A201967B4007DE474 /* ConfidenceSummary.cpp in Sources */, 4BE0A3EE237BB170002AB46F /* ST.cpp in Sources */, 4B54C0C51F8D91D90050900F /* Keyboard.cpp in Sources */, diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/ZX8081Options.xib b/OSBindings/Mac/Clock Signal/Base.lproj/ZX8081Options.xib index 92ba074b8..d69666c97 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/ZX8081Options.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/ZX8081Options.xib @@ -1,77 +1,73 @@ - + - + - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + - - + diff --git a/OSBindings/Mac/Clock Signal/Documents/ZX8081OptionsPanel.swift b/OSBindings/Mac/Clock Signal/Documents/ZX8081Controller.swift similarity index 97% rename from OSBindings/Mac/Clock Signal/Documents/ZX8081OptionsPanel.swift rename to OSBindings/Mac/Clock Signal/Documents/ZX8081Controller.swift index 35974e999..8d909985e 100644 --- a/OSBindings/Mac/Clock Signal/Documents/ZX8081OptionsPanel.swift +++ b/OSBindings/Mac/Clock Signal/Documents/ZX8081Controller.swift @@ -6,7 +6,7 @@ // Copyright 2017 Thomas Harte. All rights reserved. // -class ZX8081OptionsPanel: MachineController { +class ZX8081Controller: MachineController { var zx8081: CSZX8081! { get { return self.machine.zx8081 From 174c8377678d8625404984fc40dcbaed0bffb25c Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 13 Jul 2021 21:45:07 -0400 Subject: [PATCH 12/12] Switches to a logarithmic volume dial. --- OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib | 2 +- .../Mac/Clock Signal/Documents/MachineDocument.swift | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib b/OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib index 5dbf99834..c86cff17f 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib @@ -43,7 +43,7 @@ - + diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index 2d7f5655d..6055686eb 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -127,7 +127,7 @@ class MachineDocument: override func windowControllerDidLoadNib(_ aController: NSWindowController) { super.windowControllerDidLoadNib(aController) aController.window?.contentAspectRatio = self.aspectRatio() - volumeSlider.floatValue = userDefaultsVolume() + volumeSlider.floatValue = pow(2.0, userDefaultsVolume()) volumeView.layer!.cornerRadius = 5.0 } @@ -705,8 +705,9 @@ class MachineDocument: // MARK: - Volume Control. @IBAction func setVolume(_ sender: NSSlider!) { if let machine = self.machine { - machine.setVolume(sender.floatValue) - setUserDefaultsVolume(sender.floatValue) + let linearValue = log2(sender.floatValue) + machine.setVolume(linearValue) + setUserDefaultsVolume(linearValue) } }