Compare commits

..

20 Commits

Author SHA1 Message Date
Kelvin Sherlock f628d99e4a load bookmark... 2021-06-04 00:21:08 -04:00
Kelvin Sherlock 0b248e6aad stringValue can't be nil. 2021-06-04 00:20:42 -04:00
Kelvin Sherlock 94aac38af4 add bookmark menu 2021-06-03 23:04:37 -04:00
Kelvin Sherlock 6215a0df12 slot view needs to know the machine. 2021-06-03 23:03:29 -04:00
Kelvin Sherlock d348c15dc5 transformer to enable/disable control based on string length. 2021-06-03 23:02:58 -04:00
Kelvin Sherlock e14336a009 shut up compiler warning. 2021-06-03 23:02:14 -04:00
Kelvin Sherlock 4baf545245 bookmark manager 2021-06-03 23:01:32 -04:00
Kelvin Sherlock 0f3e6c8307 more (untested) bookmark code 2021-05-31 23:54:29 -04:00
Kelvin Sherlock 8fdb149eb3 start of bookmarking support. Untested. 2021-05-31 16:13:43 -04:00
Kelvin Sherlock 787eac87f6 shut up warnings about content clipping.
maybe it's a 10.11 thing.  The size was chosen by interface builder.
2021-05-31 16:12:45 -04:00
Kelvin Sherlock 789d61d9f1 when launching, clear the first responder so any text fields with focus will commit. 2021-05-31 11:24:33 -04:00
Kelvin Sherlock 5ffc85f9fc 10.13+ launch wasn't. 2021-05-31 10:39:24 -04:00
Kelvin Sherlock 7b67522156 fix bitbanger / shared directory placeholders. 2021-05-30 22:22:13 -04:00
Kelvin Sherlock f14b291e60 fix auto-complete menu (remove show title setting) 2021-05-30 20:41:36 -04:00
Kelvin Sherlock 576931cd71 add interface for -share_directory (booti) and -bitbanger (null modem) 2021-05-30 18:46:46 -04:00
Kelvin Sherlock 9ed83bf316 NewSlotView -> SlotView 2021-05-30 18:19:51 -04:00
Kelvin Sherlock 751083ea26 remove old slot view controller code/nib 2021-05-30 18:14:55 -04:00
Kelvin Sherlock 1b7faf3ac4 Updates to work with 10.11 (El Capitan) and newer.
There are still a couple minor UI degradations

eg: mame cheat sheet, recent disk images window, auto complete window.

Squashed commit of the following:

commit fb115024f805da38b747fd1905573fabb7bff24e
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun May 30 18:00:13 2021 -0400

    ?

commit 8405f4df95ae8f5bc5dc33598dc0b3f8972b32cd
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun May 30 17:59:43 2021 -0400

    tintColor not present before 10.14

commit 86a6102cee4f30cac2972259ef55fda3c32b8f9a
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun May 30 17:59:19 2021 -0400

    [menu setItemArray:] apparently has problems before 10.14

commit 65227a00743fbf143c623af8a76698d57bdc4573
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun May 30 17:58:15 2021 -0400

    NSCache doesn't like null objects.

commit 8a4c3a4662647d5ee0b609bde9f3aaa5c0d99776
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun May 30 16:00:05 2021 -0400

    organize copy bundle resources.

    multiple-sized png images are converted to a single tiff (with multiple sizes).
    This is fine BUT EL capitan grabs the first image so if the @3x image is first, it will be used.

commit 44b94cdfd47117864b6529214b1c91a0c2e41327
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun May 30 15:57:37 2021 -0400

    add NewSlotViewController.m to Ample Lite.

commit 2fa1b7418783e48ca625ab3490e43cbff9e5619a
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun May 30 13:57:19 2021 -0400

    Ample Lite was missing reference to New Slot View nib.

commit 65f268e77a65f8c57019702d8f0c2b66577c5ee7
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun May 30 13:56:04 2021 -0400

    based on testing, 10.11 still has public.file-url, which is kUTTypeFileURL.  10.13 added NSURLPBoardType as a synonym.

commit cde123b16eb336b7695b444931b9e9bb9802d772
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun May 30 13:54:02 2021 -0400

    set everything to 10.11

commit e7a670efd3
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sat May 29 23:33:31 2021 -0400

    script to download SDL2.Framework

commit 9f38f2972a
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sat May 29 22:15:32 2021 -0400

    WKWebView apparently has a bug prior to 10.12 so it can't be created via a nib.

commit e18aea7249
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sat May 29 22:14:38 2021 -0400

    version checks for features not present in 10.11

commit 07dcf30f52
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Fri May 28 21:30:53 2021 -0400

    lower target to 10.11
2021-05-30 18:00:34 -04:00
Kelvin Sherlock bfbac2cc20 adjust media view nib to match the reduced size. 2021-05-28 21:29:54 -04:00
Kelvin Sherlock 3bf2f63bf6 really make scroller background transparent. 2021-05-28 21:29:27 -04:00
33 changed files with 1623 additions and 1868 deletions
+59 -65
View File
@@ -62,6 +62,10 @@
B6152B5725F4549F00605E6E /* Slot.m in Sources */ = {isa = PBXBuildFile; fileRef = B6152B5525F4549F00605E6E /* Slot.m */; };
B6152B5A25F5B57E00605E6E /* Media.m in Sources */ = {isa = PBXBuildFile; fileRef = B6152B5925F5B57E00605E6E /* Media.m */; };
B6152B5B25F5B57E00605E6E /* Media.m in Sources */ = {isa = PBXBuildFile; fileRef = B6152B5925F5B57E00605E6E /* Media.m */; };
B615A99F26640940001FBF99 /* SlotView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B6E9A18125088B36005E7525 /* SlotView.xib */; };
B615A9A026640A70001FBF99 /* SlotViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E9A17F25088B1B005E7525 /* SlotViewController.m */; };
B63005332666D6940014C381 /* BookmarkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B63005322666D6940014C381 /* BookmarkManager.m */; };
B63005342666D6940014C381 /* BookmarkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B63005322666D6940014C381 /* BookmarkManager.m */; };
B6374AC4260EBBCF0045CA16 /* pty_shell.c in Sources */ = {isa = PBXBuildFile; fileRef = B6374AB6260EBB970045CA16 /* pty_shell.c */; };
B6374AC5260EBC5A0045CA16 /* pty_shell in CopyFiles */ = {isa = PBXBuildFile; fileRef = B6374ABD260EBBC90045CA16 /* pty_shell */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
B6374AD1260ECB400045CA16 /* macclas2.plist in Resources */ = {isa = PBXBuildFile; fileRef = B6374AC9260ECB3F0045CA16 /* macclas2.plist */; };
@@ -257,8 +261,8 @@
B6E4B5F024FDE2670094A35C /* apple2jp.plist in Resources */ = {isa = PBXBuildFile; fileRef = B61099F224F5F36F005CB652 /* apple2jp.plist */; };
B6E4B5F124FDE2670094A35C /* apple2.plist in Resources */ = {isa = PBXBuildFile; fileRef = B6109A0324F5F371005CB652 /* apple2.plist */; };
B6E4B5F224FDE2670094A35C /* prav8m.plist in Resources */ = {isa = PBXBuildFile; fileRef = B6109A0024F5F371005CB652 /* prav8m.plist */; };
B6E9A18025088B1B005E7525 /* NewSlotViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E9A17F25088B1B005E7525 /* NewSlotViewController.m */; };
B6E9A18325088B36005E7525 /* NewSlotView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B6E9A18125088B36005E7525 /* NewSlotView.xib */; };
B6E9A18025088B1B005E7525 /* SlotViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E9A17F25088B1B005E7525 /* SlotViewController.m */; };
B6E9A18325088B36005E7525 /* SlotView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B6E9A18125088B36005E7525 /* SlotView.xib */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -321,10 +325,8 @@
B6004DEF24FB05D600D38596 /* LogWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = LogWindow.xib; path = Base.lproj/LogWindow.xib; sourceTree = "<group>"; };
B608E17D2502FE0C00D53465 /* TransparentScroller.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TransparentScroller.h; sourceTree = "<group>"; };
B608E17E2502FE0C00D53465 /* TransparentScroller.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TransparentScroller.m; sourceTree = "<group>"; };
B60A6E0B24ECE23F004B7EEF /* apple2gs.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = apple2gs.plist; sourceTree = "<group>"; };
B60A6E1224EE0AE2004B7EEF /* FlippedView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FlippedView.h; sourceTree = "<group>"; };
B60A6E1324EE0AE2004B7EEF /* FlippedView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FlippedView.m; sourceTree = "<group>"; };
B61099E424F5F230005CB652 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SlotView.xib; sourceTree = "<group>"; };
B61099E624F5F230005CB652 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MediaView.xib; sourceTree = "<group>"; };
B61099EA24F5F36E005CB652 /* apple2e.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = apple2e.plist; sourceTree = "<group>"; };
B61099EB24F5F36E005CB652 /* hkc8800a.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = hkc8800a.plist; sourceTree = "<group>"; };
@@ -375,6 +377,8 @@
B6152B5525F4549F00605E6E /* Slot.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Slot.m; sourceTree = "<group>"; };
B6152B5825F5B4F100605E6E /* Media.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Media.h; sourceTree = "<group>"; };
B6152B5925F5B57E00605E6E /* Media.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Media.m; sourceTree = "<group>"; };
B63005312666D6940014C381 /* BookmarkManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BookmarkManager.h; sourceTree = "<group>"; };
B63005322666D6940014C381 /* BookmarkManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BookmarkManager.m; sourceTree = "<group>"; };
B6374AB6260EBB970045CA16 /* pty_shell.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = pty_shell.c; sourceTree = "<group>"; };
B6374ABD260EBBC90045CA16 /* pty_shell */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = pty_shell; sourceTree = BUILT_PRODUCTS_DIR; };
B6374AC9260ECB3F0045CA16 /* macclas2.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = macclas2.plist; sourceTree = "<group>"; };
@@ -419,8 +423,6 @@
B65085B625B616AC00354EC9 /* maclc2.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = maclc2.plist; sourceTree = "<group>"; };
B65085B725B616AC00354EC9 /* maclc3.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = maclc3.plist; sourceTree = "<group>"; };
B65085B825B616AC00354EC9 /* maciici.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = maciici.plist; sourceTree = "<group>"; };
B65593AF24ECB61800722E0C /* SlotViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SlotViewController.h; sourceTree = "<group>"; };
B65593B024ECB61800722E0C /* SlotViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SlotViewController.m; sourceTree = "<group>"; };
B65D718525E70BD5008C5F87 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
B66236A724FD9A34006CABD7 /* PreferencesWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PreferencesWindowController.h; sourceTree = "<group>"; };
B66236A824FD9A34006CABD7 /* PreferencesWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PreferencesWindowController.m; sourceTree = "<group>"; };
@@ -432,7 +434,6 @@
B6665C1B265C639900254939 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Autocomplete.xib; sourceTree = "<group>"; };
B66D0FE62611386B000902F1 /* SoftwareList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SoftwareList.m; sourceTree = "<group>"; };
B66D0FE926113AA8000902F1 /* SoftwareList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SoftwareList.h; sourceTree = "<group>"; };
B67BD48424EE249D0073E334 /* apple1.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = apple1.plist; sourceTree = "<group>"; };
B6841BCA251EC88E006A5C39 /* vmnet_helper.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = vmnet_helper.c; sourceTree = "<group>"; };
B6841BD0251EC913006A5C39 /* vmnet_helper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = vmnet_helper; sourceTree = BUILT_PRODUCTS_DIR; };
B6841BDD251ECC29006A5C39 /* vmnet.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vmnet.framework; path = System/Library/Frameworks/vmnet.framework; sourceTree = SDKROOT; };
@@ -475,9 +476,9 @@
B6DE32422605482500418375 /* mac512k.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = mac512k.plist; sourceTree = "<group>"; };
B6DE32432605482500418375 /* macse.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = macse.plist; sourceTree = "<group>"; };
B6E4B5FA24FDE2670094A35C /* Ample Lite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Ample Lite.app"; sourceTree = BUILT_PRODUCTS_DIR; };
B6E9A17E25088B1B005E7525 /* NewSlotViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NewSlotViewController.h; sourceTree = "<group>"; };
B6E9A17F25088B1B005E7525 /* NewSlotViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NewSlotViewController.m; sourceTree = "<group>"; };
B6E9A18225088B36005E7525 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/NewSlotView.xib; sourceTree = "<group>"; };
B6E9A17E25088B1B005E7525 /* SlotViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SlotViewController.h; sourceTree = "<group>"; };
B6E9A17F25088B1B005E7525 /* SlotViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SlotViewController.m; sourceTree = "<group>"; };
B6E9A18225088B36005E7525 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SlotView.xib; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -526,8 +527,6 @@
B649798C24EEC165008ABD20 /* Recovered References */ = {
isa = PBXGroup;
children = (
B67BD48424EE249D0073E334 /* apple1.plist */,
B60A6E0B24ECE23F004B7EEF /* apple2gs.plist */,
);
name = "Recovered References";
sourceTree = "<group>";
@@ -681,12 +680,10 @@
B6152B5525F4549F00605E6E /* Slot.m */,
B6152B5825F5B4F100605E6E /* Media.h */,
B6152B5925F5B57E00605E6E /* Media.m */,
B6E9A17E25088B1B005E7525 /* NewSlotViewController.h */,
B6E9A17F25088B1B005E7525 /* NewSlotViewController.m */,
B6E9A17E25088B1B005E7525 /* SlotViewController.h */,
B6E9A17F25088B1B005E7525 /* SlotViewController.m */,
B6A1A1932528EB1700DB0FD7 /* Menu.m */,
B6A1A1962528EB4600DB0FD7 /* Menu.h */,
B65593B024ECB61800722E0C /* SlotViewController.m */,
B65593AF24ECB61800722E0C /* SlotViewController.h */,
B64979C024EF6703008ABD20 /* MediaViewController.h */,
B64979C124EF6703008ABD20 /* MediaViewController.m */,
B64E15A724EA1D5300E8AD3D /* MachineViewController.h */,
@@ -697,6 +694,8 @@
B608E17E2502FE0C00D53465 /* TransparentScroller.m */,
B66D0FE62611386B000902F1 /* SoftwareList.m */,
B66D0FE926113AA8000902F1 /* SoftwareList.h */,
B63005312666D6940014C381 /* BookmarkManager.h */,
B63005322666D6940014C381 /* BookmarkManager.m */,
B6BA563A251685DA00B0C47D /* Window Controllers */,
B6B9EA652506A5550080E70D /* EjectButton.h */,
B6B9EA642506A5550080E70D /* EjectButton.m */,
@@ -737,7 +736,7 @@
isa = PBXGroup;
children = (
B6665C1A265C639900254939 /* Autocomplete.xib */,
B6E9A18125088B36005E7525 /* NewSlotView.xib */,
B6E9A18125088B36005E7525 /* SlotView.xib */,
B63C1B9325008A2700511A71 /* DownloadWindow.xib */,
B66236BF24FDB7A6006CABD7 /* Credits.rtf */,
B6D6DE3C24FADF8B00661A5F /* LaunchWindow.xib */,
@@ -745,7 +744,6 @@
B6BA258324E99BEB005FB8FF /* MainMenu.xib */,
B61099E524F5F230005CB652 /* MediaView.xib */,
B6D6DE3724FAC8B500661A5F /* Preferences.xib */,
B61099E324F5F230005CB652 /* SlotView.xib */,
B64AF1EC250EC35B00A09B9B /* DiskImages.xib */,
B63C1F0925B143C50016A611 /* CheatSheet.xib */,
);
@@ -892,6 +890,29 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B6DDECD62505A86E0093587A /* eject-16x16.png in Resources */,
B6DDECCC2505A86E0093587A /* eject-16x16@2x.png in Resources */,
B6DDECCE2505A86E0093587A /* eject-16x16@3x.png in Resources */,
B6DDECD02505A86E0093587A /* eject-hover-16x16.png in Resources */,
B6DDECD22505A86E0093587A /* eject-hover-16x16@2x.png in Resources */,
B6DDECD42505A86E0093587A /* eject-hover-16x16@3x.png in Resources */,
B6DE323826044C1100418375 /* caution.png in Resources */,
B6DE323626044C1100418375 /* caution@2x.png in Resources */,
B6DE323B26044DB800418375 /* caution@3x.png in Resources */,
B6DDECC025057A550093587A /* drag-handle-4x10.png in Resources */,
B6DDECC225057A550093587A /* drag-handle-4x10@2x.png in Resources */,
B6DDECC425057A550093587A /* drag-handle-4x10@3x.png in Resources */,
B6BA258224E99BEB005FB8FF /* Assets.xcassets in Resources */,
B6D6DE3E24FADF8B00661A5F /* LaunchWindow.xib in Resources */,
B6004DF124FB05D600D38596 /* LogWindow.xib in Resources */,
B6BA258524E99BEB005FB8FF /* MainMenu.xib in Resources */,
B6665C1C265C639A00254939 /* Autocomplete.xib in Resources */,
B64AF1EE250EC35B00A09B9B /* DiskImages.xib in Resources */,
B63C1B9625008A2700511A71 /* DownloadWindow.xib in Resources */,
B61099E824F5F231005CB652 /* MediaView.xib in Resources */,
B6E9A18325088B36005E7525 /* SlotView.xib in Resources */,
B6D6DE3924FAC8B500661A5F /* Preferences.xib in Resources */,
B63C1F0B25B143C50016A611 /* CheatSheet.xib in Resources */,
B6109A3324F5F377005CB652 /* apple2eeuk.plist in Resources */,
B6374ADB260ECB400045CA16 /* maciix.plist in Resources */,
B6109A2424F5F377005CB652 /* las128ex.plist in Resources */,
@@ -901,24 +922,18 @@
B6374AD9260ECB400045CA16 /* maciicx.plist in Resources */,
B6109A3F24F5F377005CB652 /* agat9.plist in Resources */,
B63C1B9D250192D800511A71 /* cece.plist in Resources */,
B6D6DE3E24FADF8B00661A5F /* LaunchWindow.xib in Resources */,
B6109A3124F5F377005CB652 /* apple1.plist in Resources */,
B6374AD3260ECB400045CA16 /* macii.plist in Resources */,
B6109A3524F5F377005CB652 /* ace100.plist in Resources */,
B65085BB25B616AC00354EC9 /* maclc3.plist in Resources */,
B6109A3424F5F377005CB652 /* am64.plist in Resources */,
B6DDECCC2505A86E0093587A /* eject-16x16@2x.png in Resources */,
B6DE32462605482500418375 /* macclasc.plist in Resources */,
B6004DF124FB05D600D38596 /* LogWindow.xib in Resources */,
B6DE32502605482500418375 /* macse.plist in Resources */,
B6BA258224E99BEB005FB8FF /* Assets.xcassets in Resources */,
B6109A1724F5F377005CB652 /* apple2e.plist in Resources */,
B6109A3C24F5F377005CB652 /* am100.plist in Resources */,
B6DDECD02505A86E0093587A /* eject-hover-16x16.png in Resources */,
B6109A2524F5F377005CB652 /* laser2c.plist in Resources */,
B6109A3D24F5F377005CB652 /* laser128.plist in Resources */,
B6109A2824F5F377005CB652 /* apple2ep.plist in Resources */,
B6DDECC225057A550093587A /* drag-handle-4x10@2x.png in Resources */,
B6109A1924F5F377005CB652 /* apple2ees.plist in Resources */,
B6DE32482605482500418375 /* mac512ke.plist in Resources */,
B6109A3924F5F377005CB652 /* prav8c.plist in Resources */,
@@ -930,65 +945,48 @@
B6109A2E24F5F377005CB652 /* apple2eefr.plist in Resources */,
B6109A2C24F5F377005CB652 /* spectred.plist in Resources */,
B6109A4124F5F377005CB652 /* apple2cp.plist in Resources */,
B6BA258524E99BEB005FB8FF /* MainMenu.xib in Resources */,
B6109A3A24F5F377005CB652 /* prav82.plist in Resources */,
B6DD1FE825B407E7004A3242 /* maclc.plist in Resources */,
B6109A2024F5F377005CB652 /* apple2euk.plist in Resources */,
B6DE324C2605482500418375 /* macplus.plist in Resources */,
B6DE323826044C1100418375 /* caution.png in Resources */,
B6109A2F24F5F377005CB652 /* uniap2ti.plist in Resources */,
B6DDECD42505A86E0093587A /* eject-hover-16x16@3x.png in Resources */,
B6DDECD62505A86E0093587A /* eject-16x16.png in Resources */,
B6109A1E24F5F377005CB652 /* apple2c.plist in Resources */,
B6109A1A24F5F377005CB652 /* microeng.plist in Resources */,
B6374AD5260ECB400045CA16 /* maciisi.plist in Resources */,
B6109A3E24F5F377005CB652 /* albert.plist in Resources */,
B6665C1C265C639A00254939 /* Autocomplete.xib in Resources */,
B66236C124FDB7A6006CABD7 /* Credits.rtf in Resources */,
B6109A4224F5F377005CB652 /* apple2p.plist in Resources */,
B65085B925B616AC00354EC9 /* maclc2.plist in Resources */,
B6109A1824F5F377005CB652 /* hkc8800a.plist in Resources */,
B6109A2324F5F377005CB652 /* apple2gsr0.plist in Resources */,
B63C1BA1250192D800511A71 /* cecg.plist in Resources */,
B6DE323626044C1100418375 /* caution@2x.png in Resources */,
B63C1BA3250192D800511A71 /* cec2000.plist in Resources */,
B6109A2624F5F377005CB652 /* mprof3.plist in Resources */,
B63C1B9F250192D800511A71 /* ceci.plist in Resources */,
B6109A3224F5F377005CB652 /* basis108.plist in Resources */,
B6DE323B26044DB800418375 /* caution@3x.png in Resources */,
B6109A4324F5F377005CB652 /* agat7.plist in Resources */,
B6DE324E2605482500418375 /* mac512k.plist in Resources */,
B6DDECC425057A550093587A /* drag-handle-4x10@3x.png in Resources */,
B6109A2B24F5F377005CB652 /* elppa.plist in Resources */,
B63C1B8E25004C6D00511A71 /* mame-data.tgz in Resources */,
B6DDECCE2505A86E0093587A /* eject-16x16@3x.png in Resources */,
B64AF1EE250EC35B00A09B9B /* DiskImages.xib in Resources */,
B6109A3B24F5F377005CB652 /* apple2gsr1.plist in Resources */,
B65085BD25B616AC00354EC9 /* maciici.plist in Resources */,
B6374AE3260ECDDD0045CA16 /* maciihmu.plist in Resources */,
B6374ADF260ECB400045CA16 /* macse30.plist in Resources */,
B63C1F1225B147E10016A611 /* CheatSheet.html in Resources */,
B63C1B9625008A2700511A71 /* DownloadWindow.xib in Resources */,
B6D6DE3B24FACF4F00661A5F /* Defaults.plist in Resources */,
B6109A2224F5F377005CB652 /* models.plist in Resources */,
B6109A4024F5F377005CB652 /* craft2p.plist in Resources */,
B6109A1B24F5F377005CB652 /* uniap2pt.plist in Resources */,
B6109A3724F5F377005CB652 /* las128e2.plist in Resources */,
B61099E824F5F231005CB652 /* MediaView.xib in Resources */,
B6374AE5260ECDDD0045CA16 /* mac2fdhd.plist in Resources */,
B63C1B90250088DD00511A71 /* roms.plist in Resources */,
B6109A2724F5F377005CB652 /* uniap2en.plist in Resources */,
B6109A2A24F5F377005CB652 /* apple3.plist in Resources */,
B6109A2124F5F377005CB652 /* apple2ee.plist in Resources */,
B63C1BA5250192D800511A71 /* cecm.plist in Resources */,
B6E9A18325088B36005E7525 /* NewSlotView.xib in Resources */,
B6DDECC025057A550093587A /* drag-handle-4x10.png in Resources */,
B6DDECD22505A86E0093587A /* eject-hover-16x16@2x.png in Resources */,
B6109A3624F5F377005CB652 /* dodo.plist in Resources */,
B6D6DE3924FAC8B500661A5F /* Preferences.xib in Resources */,
B6109A2924F5F377005CB652 /* apple2gs.plist in Resources */,
B6109A1F24F5F377005CB652 /* apple2jp.plist in Resources */,
B63C1F0B25B143C50016A611 /* CheatSheet.xib in Resources */,
B6374AD7260ECB400045CA16 /* maciivi.plist in Resources */,
B6374AD1260ECB400045CA16 /* macclas2.plist in Resources */,
B6DE324A2605482500418375 /* macsefd.plist in Resources */,
@@ -1001,7 +999,18 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B6DDECD72505A86E0093587A /* eject-16x16.png in Resources */,
B6DDECCD2505A86E0093587A /* eject-16x16@2x.png in Resources */,
B6DDECCF2505A86E0093587A /* eject-16x16@3x.png in Resources */,
B6DDECD12505A86E0093587A /* eject-hover-16x16.png in Resources */,
B6DDECD32505A86E0093587A /* eject-hover-16x16@2x.png in Resources */,
B6DDECD52505A86E0093587A /* eject-hover-16x16@3x.png in Resources */,
B6DE323926044C1100418375 /* caution.png in Resources */,
B6DE323726044C1100418375 /* caution@2x.png in Resources */,
B6DE323C26044DB800418375 /* caution@3x.png in Resources */,
B6DDECC125057A550093587A /* drag-handle-4x10.png in Resources */,
B6DDECC325057A550093587A /* drag-handle-4x10@2x.png in Resources */,
B6DDECC525057A550093587A /* drag-handle-4x10@3x.png in Resources */,
B6374AE6260ECDDD0045CA16 /* mac2fdhd.plist in Resources */,
B6374ADC260ECB400045CA16 /* maciix.plist in Resources */,
B6E4B5BC24FDE2670094A35C /* apple2eeuk.plist in Resources */,
@@ -1013,7 +1022,6 @@
B6E4B5BF24FDE2670094A35C /* agat9.plist in Resources */,
B6E4B5C024FDE2670094A35C /* LaunchWindow.xib in Resources */,
B6665C1D265C639A00254939 /* Autocomplete.xib in Resources */,
B6DE323726044C1100418375 /* caution@2x.png in Resources */,
B6E4B5C124FDE2670094A35C /* apple1.plist in Resources */,
B6E4B5C224FDE2670094A35C /* ace100.plist in Resources */,
B6374AD6260ECB400045CA16 /* maciisi.plist in Resources */,
@@ -1028,20 +1036,18 @@
B6E4B5C724FDE2670094A35C /* am100.plist in Resources */,
B6E4B5C824FDE2670094A35C /* laser2c.plist in Resources */,
B6374ADA260ECB400045CA16 /* maciicx.plist in Resources */,
B6DDECC125057A550093587A /* drag-handle-4x10.png in Resources */,
B615A99F26640940001FBF99 /* SlotView.xib in Resources */,
B63C1F0C25B143C50016A611 /* CheatSheet.xib in Resources */,
B6374AE0260ECB400045CA16 /* macse30.plist in Resources */,
B6E4B5C924FDE2670094A35C /* laser128.plist in Resources */,
B646D10C263A5DF30014C586 /* ace1000.plist in Resources */,
B6E4B5CA24FDE2670094A35C /* apple2ep.plist in Resources */,
B6DDECCD2505A86E0093587A /* eject-16x16@2x.png in Resources */,
B6E4B5CB24FDE2670094A35C /* apple2ees.plist in Resources */,
B6E4B5CC24FDE2670094A35C /* prav8c.plist in Resources */,
B6E4B5CD24FDE2670094A35C /* ivelultr.plist in Resources */,
B6E4B5CE24FDE2670094A35C /* maxxi.plist in Resources */,
B6DE324B2605482500418375 /* macsefd.plist in Resources */,
B6E4B5CF24FDE2670094A35C /* apple2eefr.plist in Resources */,
B6DE323926044C1100418375 /* caution.png in Resources */,
B6374AD8260ECB400045CA16 /* maciivi.plist in Resources */,
B6E4B5D124FDE2670094A35C /* spectred.plist in Resources */,
B63C1B9725008A2700511A71 /* DownloadWindow.xib in Resources */,
@@ -1056,22 +1062,17 @@
B6E4B5D924FDE2670094A35C /* albert.plist in Resources */,
B6E4B5DA24FDE2670094A35C /* Credits.rtf in Resources */,
B6E4B5DB24FDE2670094A35C /* apple2p.plist in Resources */,
B6DDECD12505A86E0093587A /* eject-hover-16x16.png in Resources */,
B65085BE25B616AC00354EC9 /* maciici.plist in Resources */,
B6DE32512605482500418375 /* macse.plist in Resources */,
B65085BC25B616AC00354EC9 /* maclc3.plist in Resources */,
B6DE32492605482500418375 /* mac512ke.plist in Resources */,
B6DE32452605482500418375 /* mac128k.plist in Resources */,
B63C1BA4250192D800511A71 /* cec2000.plist in Resources */,
B6DDECD32505A86E0093587A /* eject-hover-16x16@2x.png in Resources */,
B6E4B5DC24FDE2670094A35C /* hkc8800a.plist in Resources */,
B6374AE4260ECDDD0045CA16 /* maciihmu.plist in Resources */,
B6DDECC525057A550093587A /* drag-handle-4x10@3x.png in Resources */,
B6E4B5DD24FDE2670094A35C /* apple2gsr0.plist in Resources */,
B6DE323C26044DB800418375 /* caution@3x.png in Resources */,
B6E4B5DE24FDE2670094A35C /* mprof3.plist in Resources */,
B6E4B5DF24FDE2670094A35C /* basis108.plist in Resources */,
B6DDECD52505A86E0093587A /* eject-hover-16x16@3x.png in Resources */,
B6DD1FE925B407E7004A3242 /* maclc.plist in Resources */,
B6E4B5E024FDE2670094A35C /* agat7.plist in Resources */,
B6E4B5E124FDE2670094A35C /* elppa.plist in Resources */,
@@ -1093,11 +1094,9 @@
B6DE324D2605482500418375 /* macplus.plist in Resources */,
B6E4B5ED24FDE2670094A35C /* Preferences.xib in Resources */,
B6374ADE260ECB400045CA16 /* maciivx.plist in Resources */,
B6DDECD72505A86E0093587A /* eject-16x16.png in Resources */,
B6E4B5EF24FDE2670094A35C /* apple2gs.plist in Resources */,
B6E4B5F024FDE2670094A35C /* apple2jp.plist in Resources */,
B6E4B5F124FDE2670094A35C /* apple2.plist in Resources */,
B6DDECC325057A550093587A /* drag-handle-4x10@2x.png in Resources */,
B6E4B5F224FDE2670094A35C /* prav8m.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1147,7 +1146,7 @@
buildActionMask = 2147483647;
files = (
B608E17F2502FE0C00D53465 /* TransparentScroller.m in Sources */,
B6E9A18025088B1B005E7525 /* NewSlotViewController.m in Sources */,
B6E9A18025088B1B005E7525 /* SlotViewController.m in Sources */,
B6A1A1942528EB1700DB0FD7 /* Menu.m in Sources */,
B6BA258824E99BEB005FB8FF /* main.m in Sources */,
B63C1B8B24FF4BF700511A71 /* Ample.m in Sources */,
@@ -1161,6 +1160,7 @@
B60A6E1424EE0AE2004B7EEF /* FlippedView.m in Sources */,
B6BA258024E99BE9005FB8FF /* AppDelegate.m in Sources */,
B6004DF024FB05D600D38596 /* LogWindowController.m in Sources */,
B63005332666D6940014C381 /* BookmarkManager.m in Sources */,
B66236A924FD9A34006CABD7 /* PreferencesWindowController.m in Sources */,
B63C1F0F25B1447C0016A611 /* CheatSheetWindowController.m in Sources */,
B64AF1F2250ECB2E00A09B9B /* DiskImagesWindowController.m in Sources */,
@@ -1190,6 +1190,8 @@
B6E4B5B324FDE2670094A35C /* MediaViewController.m in Sources */,
B64AF1F7250ED5E400A09B9B /* TableCellView.m in Sources */,
B6E4B5B424FDE2670094A35C /* FlippedView.m in Sources */,
B63005342666D6940014C381 /* BookmarkManager.m in Sources */,
B615A9A026640A70001FBF99 /* SlotViewController.m in Sources */,
B6665C15265A0E3E00254939 /* AutocompleteControl.m in Sources */,
B6E4B5B524FDE2670094A35C /* AppDelegate.m in Sources */,
B66D0FE82611386C000902F1 /* SoftwareList.m in Sources */,
@@ -1202,14 +1204,6 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
B61099E324F5F230005CB652 /* SlotView.xib */ = {
isa = PBXVariantGroup;
children = (
B61099E424F5F230005CB652 /* Base */,
);
name = SlotView.xib;
sourceTree = "<group>";
};
B61099E524F5F230005CB652 /* MediaView.xib */ = {
isa = PBXVariantGroup;
children = (
@@ -1274,12 +1268,12 @@
name = LaunchWindow.xib;
sourceTree = "<group>";
};
B6E9A18125088B36005E7525 /* NewSlotView.xib */ = {
B6E9A18125088B36005E7525 /* SlotView.xib */ = {
isa = PBXVariantGroup;
children = (
B6E9A18225088B36005E7525 /* Base */,
);
name = NewSlotView.xib;
name = SlotView.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
@@ -1373,7 +1367,7 @@
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.11;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@@ -1425,7 +1419,7 @@
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.11;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
+9
View File
@@ -40,4 +40,13 @@ extern NSString *kDownloadExtension;
extern NSString *kDefaultDownloadURL;
extern NSString *kDefaultDownloadExtension;
@protocol Bookmark <NSObject>
-(BOOL)loadBookmark: (NSDictionary *)bookmark;
-(BOOL)saveBookmark: (NSMutableDictionary *)bookmark;
-(void)willLoadBookmark: (NSDictionary *)bookmark;
-(void)didLoadBookmark: (NSDictionary *)bookmark;
@end
#endif /* Ample_h */
+13 -3
View File
@@ -13,6 +13,7 @@
#import "DiskImagesWindowController.h"
#import "CheatSheetWindowController.h"
#import "Transformers.h"
#import "BookmarkManager.h"
#import "LogWindowController.h"
@@ -40,6 +41,10 @@
RegisterTransformers();
BookmarkManager *bm = [BookmarkManager sharedManager];
[bm loadBookmarks];
[bm updateMenu];
path = [bundle pathForResource: @"Defaults" ofType: @"plist"];
dict = [NSDictionary dictionaryWithContentsOfFile: path];
@@ -96,10 +101,15 @@
@"xfz",
path
];
[task setExecutableURL: [NSURL fileURLWithPath: @"/usr/bin/tar"]];
if (@available(macOS 10.13, *)) {
[task setExecutableURL: [NSURL fileURLWithPath: @"/usr/bin/tar"]];
[task setCurrentDirectoryURL: sd];
} else {
[task setLaunchPath: @"/usr/bin/tar"];
[task setCurrentDirectoryPath: SupportDirectoryPath()];
}
[task setArguments: argv];
[task setCurrentDirectoryURL: sd];
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));
[task setTerminationHandler: ^(NSTask *task){
+8 -4
View File
@@ -96,7 +96,7 @@ Todo --
}
-(void)setStringValue:(NSString *)stringValue {
[super setStringValue: stringValue];
[super setStringValue: stringValue ? stringValue : @""];
if (_value && [[_value menuTitle] isEqualToString: stringValue] == NO)
_value = nil;
@@ -411,8 +411,11 @@ Todo --
-(void)_init {
_backgroundColor = [NSColor windowBackgroundColor];
_selectedColor = [NSColor selectedContentBackgroundColor];
if (@available(macOS 10.14, *)) {
_selectedColor = [NSColor selectedContentBackgroundColor];
} else {
_selectedColor = [NSColor selectedTextBackgroundColor];
}
NSTrackingAreaOptions options = NSTrackingMouseMoved | NSTrackingMouseEnteredAndExited | NSTrackingInVisibleRect | NSTrackingActiveInActiveApp;
_trackingArea = [[NSTrackingArea alloc] initWithRect: NSZeroRect
options: options
@@ -800,7 +803,8 @@ static void DrawString(NSString *str, NSDictionary *attr, CGRect rect) {
-(void)drawRect:(NSRect)dirtyRect {
[[NSColor windowBackgroundColor] set];
//[[NSColor windowBackgroundColor] set];
[[NSColor clearColor] set];
NSRectFill(dirtyRect);
[self drawKnob];
}
+2 -2
View File
@@ -15,8 +15,8 @@
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" titlebarAppearsTransparent="YES" titleVisibility="hidden" id="OYW-cj-FD5" customClass="ACPanel">
<windowStyleMask key="styleMask" titled="YES" utility="YES" nonactivatingPanel="YES" fullSizeContentView="YES"/>
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" titlebarAppearsTransparent="YES" titleVisibility="hidden" id="OYW-cj-FD5" customClass="ACPanel">
<windowStyleMask key="styleMask" utility="YES" nonactivatingPanel="YES" fullSizeContentView="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="272" y="172" width="300" height="400"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
-17
View File
@@ -1,16 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<plugIn identifier="com.apple.WebKit2IBPlugin" version="15705"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="CheatSheetWindowController">
<connections>
<outlet property="_webView" destination="Yc9-xA-jWX" id="rsd-1e-HPk"/>
<outlet property="webView" destination="Yc9-xA-jWX" id="EE3-gk-f71"/>
<outlet property="window" destination="QvC-M9-y7g" id="U2v-sN-OzH"/>
</connections>
</customObject>
@@ -23,19 +19,6 @@
<view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
<rect key="frame" x="0.0" y="0.0" width="640" height="640"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<wkWebView hidden="YES" wantsLayer="YES" fixedFrame="YES" allowsLinkPreview="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yc9-xA-jWX">
<rect key="frame" x="0.0" y="0.0" width="640" height="640"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<wkWebViewConfiguration key="configuration">
<audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
<wkPreferences key="preferences" javaScriptCanOpenWindowsAutomatically="NO"/>
</wkWebViewConfiguration>
<connections>
<outlet property="navigationDelegate" destination="-2" id="1WW-1B-FdZ"/>
</connections>
</wkWebView>
</subviews>
</view>
<connections>
<outlet property="delegate" destination="-2" id="u4H-aq-RE2"/>
+136 -4
View File
@@ -8,6 +8,8 @@
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="LaunchWindowController">
<connections>
<outlet property="addBookmarkWindow" destination="yIt-hP-HBq" id="Qhx-WV-cg4"/>
<outlet property="bookmarkTextField" destination="fAl-Vn-x1w" id="GNr-j6-BiQ"/>
<outlet property="machineView" destination="oVt-eD-aaj" id="Q9V-Kr-6GN"/>
<outlet property="machineViewController" destination="RgH-d9-xl8" id="DIa-h0-6y2"/>
<outlet property="mediaController" destination="t7c-zy-czN" id="a7d-HC-TWx"/>
@@ -123,7 +125,7 @@ DQ
</connections>
</button>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hM8-FM-Agh">
<rect key="frame" x="382" y="87" width="172" height="25"/>
<rect key="frame" x="382" y="87" width="174" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Default" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="Dsm-bi-Txy" id="mBS-h4-BWC">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
@@ -239,7 +241,7 @@ DQ
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="PGK-yK-2ZK">
<rect key="frame" x="15" y="91" width="43" height="16"/>
<autoresizingMask key="autoresizingMask"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Speed" id="D9w-Mz-PXs">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -247,7 +249,7 @@ DQ
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="FE4-gG-fPb">
<rect key="frame" x="62" y="86" width="107" height="25"/>
<rect key="frame" x="62" y="86" width="109" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="100%" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" tag="1" imageScaling="proportionallyDown" inset="2" selectedItem="yoI-Ra-evu" id="M40-f0-awc">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
@@ -370,6 +372,64 @@ DQ
</subviews>
</view>
</tabViewItem>
<tabViewItem label="Paths" identifier="" id="PVN-Iw-nYG">
<view key="view" id="5qP-bQ-Id6">
<rect key="frame" x="10" y="33" width="672" height="114"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField toolTip="path or socket.address:port" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Wga-1O-bDR">
<rect key="frame" x="132" y="90" width="523" height="21"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="socket.127.0.0.1:23 or /path/to/file" drawsBackground="YES" id="6d8-LZ-wh1">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameBitBanger" id="O76-B6-FhP">
<dictionary key="options">
<string key="NSNullPlaceholder">socket.127.0.0.1:23 or /path/to/file</string>
</dictionary>
</binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="VDW-FX-9az">
<rect key="frame" x="132" y="59" width="523" height="21"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="/path/to/directory/" drawsBackground="YES" id="ykl-aj-n1L">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameShareDirectory" id="fqw-G0-t5P">
<dictionary key="options">
<string key="NSNullPlaceholder">/path/to/directory/</string>
</dictionary>
</binding>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uPk-SB-lIF">
<rect key="frame" x="15" y="92" width="71" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Bit Banger:" id="9jA-4x-Abr">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="upA-x5-LVd">
<rect key="frame" x="15" y="61" width="103" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Share Directory:" id="RmQ-pY-o5K">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</view>
</tabViewItem>
</tabViewItems>
</tabView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="J9O-xI-P5J" customClass="FlippedView">
@@ -427,8 +487,80 @@ DQ
<point key="canvasLocation" x="769" y="120.5"/>
</window>
<viewController title="Media View" nibName="MediaView" id="t7c-zy-czN" customClass="MediaViewController"/>
<viewController title="Slot View" nibName="NewSlotView" id="lyS-mc-3Tf" customClass="NewSlotViewController"/>
<viewController title="Slot View" nibName="SlotView" id="lyS-mc-3Tf" customClass="SlotViewController"/>
<customObject id="RgH-d9-xl8" customClass="MachineViewController"/>
<window title="Add Bookmark" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="yIt-hP-HBq">
<windowStyleMask key="styleMask" titled="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="462" height="116"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" wantsLayer="YES" id="WVd-g4-Tbl">
<rect key="frame" x="0.0" y="0.0" width="462" height="116"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Gho-Xy-rn4">
<rect key="frame" x="358" y="13" width="90" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Add" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Vxo-rD-aMe">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
</buttonCell>
<connections>
<action selector="bookmarkSave:" target="-2" id="wLF-LE-5RO"/>
<binding destination="-2" name="enabled" keyPath="bookmarkName" id="U5R-gU-1bE">
<dictionary key="options">
<string key="NSValueTransformerName">StringNotEmptyTransformer</string>
</dictionary>
</binding>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3sv-Kd-Ep5">
<rect key="frame" x="268" y="13" width="90" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="jaa-RY-PAg">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
Gw
</string>
</buttonCell>
<connections>
<action selector="bookmarkCancel:" target="-2" id="uWM-vs-hz7"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1fO-x7-Gft">
<rect key="frame" x="18" y="80" width="103" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Add Bookmark…" id="AZS-JR-SNt">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fAl-Vn-x1w">
<rect key="frame" x="20" y="49" width="422" height="23"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="bookmark name" drawsBackground="YES" id="Enq-2z-cle">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="-2" name="value" keyPath="bookmarkName" id="84v-el-4Uk">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
<string key="NSNullPlaceholder">bookmark name</string>
</dictionary>
</binding>
</connections>
</textField>
</subviews>
</view>
<point key="canvasLocation" x="130" y="70"/>
</window>
</objects>
<resources>
<image name="NSAppleMenuImage" width="11" height="14"/>
+21
View File
@@ -19,6 +19,11 @@
</connections>
</customObject>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="sJn-ug-xF3" customClass="BookmarkManager">
<connections>
<outlet property="menu" destination="ha0-nx-PIl" id="vTa-TU-DS1"/>
</connections>
</customObject>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="Ample" id="1Xt-HY-uBw">
@@ -389,6 +394,22 @@
</items>
</menu>
</menuItem>
<menuItem title="Bookmarks" id="vHO-2e-qJc">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Bookmarks" id="ha0-nx-PIl">
<items>
<menuItem title="Add Bookmark…" keyEquivalent="d" id="1JF-xV-zmG">
<connections>
<action selector="addBookmark:" target="-1" id="cqp-ko-BfQ"/>
</connections>
</menuItem>
<menuItem title="Manage Bookmarks…" id="isI-q6-b1V">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="gWR-Yl-mg6"/>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
+4 -5
View File
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@@ -15,13 +14,13 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="25" horizontalPageScroll="10" verticalLineScroll="25" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="nVT-kT-bWl">
<rect key="frame" x="0.0" y="0.0" width="316" height="363"/>
<clipView key="contentView" autoresizesSubviews="NO" focusRingType="none" ambiguous="YES" copiesOnScroll="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IBD-wb-pch">
<rect key="frame" x="0.0" y="0.0" width="316" height="363"/>
<rect key="frame" x="0.0" y="0.0" width="316" height="331"/>
<clipView key="contentView" autoresizesSubviews="NO" focusRingType="none" ambiguous="YES" drawsBackground="NO" copiesOnScroll="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IBD-wb-pch">
<rect key="frame" x="0.0" y="0.0" width="316" height="331"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="none" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="22" rowSizeStyle="automatic" viewBased="YES" outlineTableColumn="pBj-py-R6a" id="sIz-DD-PZQ">
<rect key="frame" x="0.0" y="0.0" width="316" height="363"/>
<rect key="frame" x="0.0" y="0.0" width="316" height="331"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="2" height="3"/>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
-236
View File
@@ -1,236 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NewSlotViewController">
<connections>
<outlet property="_popover" destination="QIT-2T-wdy" id="WUB-OS-kem"/>
<outlet property="childOutlineView" destination="uM0-Gk-crn" id="aL5-uC-O28"/>
<outlet property="outlineView" destination="Xj3-Qf-yek" id="AWE-Rg-XUM"/>
<outlet property="view" destination="D45-lv-6Fv" id="av3-OE-ph2"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="27" horizontalPageScroll="10" verticalLineScroll="27" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" id="D45-lv-6Fv">
<rect key="frame" x="0.0" y="0.0" width="316" height="386"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" autoresizesSubviews="NO" focusRingType="none" copiesOnScroll="NO" id="8x1-xN-a7c">
<rect key="frame" x="0.0" y="0.0" width="316" height="386"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="none" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="25" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="2" autoresizesOutlineColumn="YES" outlineTableColumn="u7T-p8-F2Z" id="Xj3-Qf-yek">
<rect key="frame" x="0.0" y="0.0" width="316" height="386"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn editable="NO" width="296" minWidth="40" maxWidth="1000" id="u7T-p8-F2Z">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="FM7-eO-FE4">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView identifier="MenuCell" id="1RI-9K-5qj" customClass="SlotTableCellView">
<rect key="frame" x="1" y="1" width="296" height="25"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qIF-d4-kOf">
<rect key="frame" x="0.0" y="5" width="90" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="RAM:" id="tIz-xZ-ZJH">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zQ8-o3-yBB">
<rect key="frame" x="82" y="0.0" width="199" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" autoenablesItems="NO" selectedItem="tGi-yg-GFr" id="gt4-HK-pd1">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" autoenablesItems="NO" id="KWV-nn-eiB">
<items>
<menuItem title="Item 1" state="on" id="tGi-yg-GFr"/>
<menuItem title="Item 2" id="XJr-Gb-4D4"/>
<menuItem title="Item 3" id="JeB-Fb-DeQ"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="9MH-mu-u5V"/>
</connections>
</popUpButton>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xCe-sY-sGe">
<rect key="frame" x="282" y="8" width="14" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSListViewTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="0qU-ID-kJ8">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="hamburger:" target="-2" id="5Xa-j7-Aod"/>
<binding destination="1RI-9K-5qj" name="hidden" keyPath="objectValue.selectedItem.children" id="rY2-0l-0N8">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</button>
</subviews>
<connections>
<outlet property="hamburgerButton" destination="xCe-sY-sGe" id="5Da-If-Bt4"/>
<outlet property="menuButton" destination="zQ8-o3-yBB" id="zZf-nm-tCI"/>
<outlet property="textField" destination="qIF-d4-kOf" id="zIF-4n-v1e"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="OV9-yE-OFp"/>
<outlet property="delegate" destination="-2" id="kXs-TN-3VL"/>
</connections>
</outlineView>
</subviews>
<color key="backgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="rYF-ld-adB">
<rect key="frame" x="-100" y="-100" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="4pL-Dn-e75" customClass="TransparentScroller">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
<color key="value" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</scroller>
<point key="canvasLocation" x="-100" y="154"/>
</scrollView>
<viewController id="ziL-Zf-s1k" userLabel="Popover View Controller">
<connections>
<outlet property="view" destination="uew-UQ-Q25" id="qjB-ya-gFf"/>
</connections>
</viewController>
<popover behavior="t" id="QIT-2T-wdy">
<connections>
<outlet property="contentViewController" destination="ziL-Zf-s1k" id="rj8-2U-9t0"/>
</connections>
</popover>
<customView id="uew-UQ-Q25">
<rect key="frame" x="0.0" y="0.0" width="250" height="400"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<button id="2jh-iq-DV6">
<rect key="frame" x="232" y="382" width="14" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSStopProgressFreestandingTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="Wp7-Km-kYI">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
Gw
</string>
</buttonCell>
<connections>
<action selector="performClose:" target="QIT-2T-wdy" id="Q04-24-ZOK"/>
</connections>
</button>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="27" horizontalPageScroll="10" verticalLineScroll="27" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" id="5gB-oE-Gza">
<rect key="frame" x="0.0" y="20" width="250" height="360"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<clipView key="contentView" focusRingType="none" drawsBackground="NO" copiesOnScroll="NO" id="X5e-Ka-JLr">
<rect key="frame" x="0.0" y="0.0" width="250" height="360"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="none" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="25" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" autoresizesOutlineColumn="YES" outlineTableColumn="o1K-z1-KVi" id="uM0-Gk-crn">
<rect key="frame" x="0.0" y="0.0" width="250" height="360"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="230" minWidth="40" maxWidth="1000" id="o1K-z1-KVi">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="A12-NQ-gW3">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView identifier="MenuCell" id="Mgb-8H-DmI" customClass="SlotTableCellView">
<rect key="frame" x="1" y="1" width="230" height="25"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ThL-Yz-7Kd">
<rect key="frame" x="1" y="0.0" width="229" height="25"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" autoenablesItems="NO" selectedItem="djR-rV-wzX" id="SkW-fW-gwL">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" autoenablesItems="NO" id="7Ib-TL-f6U">
<items>
<menuItem title="Item 1" state="on" id="djR-rV-wzX"/>
<menuItem title="Item 2" id="qbC-4D-6t6"/>
<menuItem title="Item 3" id="qPv-x5-zpj"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="ytA-nD-fIS"/>
</connections>
</popUpButton>
</subviews>
<connections>
<outlet property="menuButton" destination="ThL-Yz-7Kd" id="3Oc-hx-qKl"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="HXP-pH-3Lc"/>
<outlet property="delegate" destination="-2" id="nwb-IL-MsP"/>
</connections>
</outlineView>
</subviews>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Keh-oo-CPO">
<rect key="frame" x="-100" y="-100" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="wtc-gL-alh" customClass="TransparentScroller">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<point key="canvasLocation" x="-451" y="61"/>
</customView>
</objects>
<resources>
<image name="NSListViewTemplate" width="14" height="10"/>
<image name="NSStopProgressFreestandingTemplate" width="14" height="14"/>
</resources>
</document>
+218 -614
View File
@@ -8,625 +8,229 @@
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="SlotViewController">
<connections>
<outlet property="aux_menu" destination="3kq-qn-7YR" id="wic-Ry-yAf"/>
<outlet property="exp_menu" destination="San-wP-1ez" id="X7u-dM-xrI"/>
<outlet property="game_menu" destination="K8G-bZ-6mZ" id="IeQ-ZT-5F6"/>
<outlet property="modem_menu" destination="KHf-kC-BpZ" id="Qab-mA-anC"/>
<outlet property="printer_menu" destination="sTp-en-8Wd" id="zeu-LF-6mV"/>
<outlet property="ram_menu" destination="Yks-M5-vi0" id="h5y-Un-jYJ"/>
<outlet property="rs232_menu" destination="6ln-U2-0Pi" id="7CT-OE-idV"/>
<outlet property="sl0_menu" destination="Jw1-t7-YyU" id="BB5-6y-zyf"/>
<outlet property="sl1_menu" destination="bta-RS-JT4" id="cpI-db-kzX"/>
<outlet property="sl2_menu" destination="cDU-b1-x5a" id="WtL-Fo-Q1B"/>
<outlet property="sl3_menu" destination="aSh-cs-0Nn" id="24o-66-LjH"/>
<outlet property="sl4_menu" destination="kU5-cR-hPZ" id="STc-6r-nxH"/>
<outlet property="sl5_menu" destination="8z4-8f-kLU" id="cLl-Ee-LUD"/>
<outlet property="sl6_menu" destination="GLb-F4-PWe" id="ubk-pt-e1Q"/>
<outlet property="sl7_menu" destination="IV2-3M-qfw" id="s5k-4G-w4r"/>
<outlet property="view" destination="OM3-7F-wiN" id="yre-ts-aHj"/>
<outlet property="_popover" destination="QIT-2T-wdy" id="WUB-OS-kem"/>
<outlet property="childOutlineView" destination="uM0-Gk-crn" id="aL5-uC-O28"/>
<outlet property="outlineView" destination="Xj3-Qf-yek" id="AWE-Rg-XUM"/>
<outlet property="view" destination="D45-lv-6Fv" id="av3-OE-ph2"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<gridView autoresizesSubviews="NO" misplaced="YES" xPlacement="leading" yPlacement="bottom" rowAlignment="none" translatesAutoresizingMaskIntoConstraints="NO" id="OM3-7F-wiN">
<rect key="frame" x="0.0" y="0.0" width="306" height="459"/>
<rows>
<gridRow yPlacement="center" height="25" id="tHD-ui-hIL">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.ram" id="ze9-jx-lv0">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="Ccd-U2-Gx5">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl0" id="YsR-kI-yrh">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="JGU-aq-3uw">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl1" id="1io-aZ-v2G">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="gVW-Ya-phU">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl2" id="AgS-hm-ePr">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="3fP-qp-zmi">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl3" id="98U-4P-iRh">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="86u-5p-UT6">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl4" id="hsy-pm-Qjk">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="Wdg-xb-xQx">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl5" id="0QC-RB-278">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="ein-Fe-vBw">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl6" id="731-3P-DUy">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="qjB-2w-AWE">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl7" id="sew-Ds-4I9">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="EEX-dh-jwn">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.exp" id="EOZ-lS-QHF">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="OaZ-ZQ-gKK">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.aux" id="OlF-v7-JZx">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="wQi-Oz-7Ye">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.rs232" id="AeP-bn-blv">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="gr2-eY-995">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.gameio" id="x3I-Bd-9di">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="1xN-lm-s4l">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.printer" id="T9a-lH-z5K">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="25" id="M2s-qn-SIT">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.modem" id="PSe-R3-S3e">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</gridRow>
</rows>
<columns>
<gridColumn xPlacement="fill" width="100" id="zpB-Rf-dWg"/>
<gridColumn xPlacement="fill" width="200" id="6Vn-yh-FoQ"/>
</columns>
<gridCells>
<gridCell row="tHD-ui-hIL" column="zpB-Rf-dWg" id="deJ-sv-Hb7">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nHa-QG-HjJ">
<rect key="frame" x="-2" y="439" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="RAM:" id="CvY-8m-Ni9">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="tHD-ui-hIL" column="6Vn-yh-FoQ" id="dak-Ha-01u">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="16" translatesAutoresizingMaskIntoConstraints="NO" id="Yks-M5-vi0">
<rect key="frame" x="104" y="433" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="92u-m2-3yN" id="XFo-KF-ueS">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="k8O-sG-Qld">
<items>
<menuItem title="Item 1" state="on" id="92u-m2-3yN">
<attributedString key="attributedTitle"/>
</menuItem>
<menuItem title="Item 2" id="dPG-tR-M4A"/>
<menuItem title="Item 3" id="q2n-oZ-46s"/>
</items>
</menu>
</popUpButtonCell>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="27" horizontalPageScroll="10" verticalLineScroll="27" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" id="D45-lv-6Fv">
<rect key="frame" x="0.0" y="0.0" width="316" height="386"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" autoresizesSubviews="NO" focusRingType="none" drawsBackground="NO" copiesOnScroll="NO" id="8x1-xN-a7c">
<rect key="frame" x="0.0" y="0.0" width="316" height="386"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="none" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="25" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="2" autoresizesOutlineColumn="YES" outlineTableColumn="u7T-p8-F2Z" id="Xj3-Qf-yek">
<rect key="frame" x="0.0" y="0.0" width="316" height="386"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn editable="NO" width="296" minWidth="40" maxWidth="1000" id="u7T-p8-F2Z">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="FM7-eO-FE4">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView identifier="MenuCell" id="1RI-9K-5qj" customClass="SlotTableCellView">
<rect key="frame" x="1" y="1" width="296" height="25"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qIF-d4-kOf">
<rect key="frame" x="0.0" y="5" width="90" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="RAM:" id="tIz-xZ-ZJH">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zQ8-o3-yBB">
<rect key="frame" x="82" y="0.0" width="199" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" autoenablesItems="NO" selectedItem="tGi-yg-GFr" id="gt4-HK-pd1">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" autoenablesItems="NO" id="KWV-nn-eiB">
<items>
<menuItem title="Item 1" state="on" id="tGi-yg-GFr"/>
<menuItem title="Item 2" id="XJr-Gb-4D4"/>
<menuItem title="Item 3" id="JeB-Fb-DeQ"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="9MH-mu-u5V"/>
</connections>
</popUpButton>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xCe-sY-sGe">
<rect key="frame" x="282" y="8" width="14" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSListViewTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="0qU-ID-kJ8">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="hamburger:" target="-2" id="5Xa-j7-Aod"/>
<binding destination="1RI-9K-5qj" name="hidden" keyPath="objectValue.selectedItem.children" id="rY2-0l-0N8">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</button>
</subviews>
<connections>
<outlet property="hamburgerButton" destination="xCe-sY-sGe" id="5Da-If-Bt4"/>
<outlet property="menuButton" destination="zQ8-o3-yBB" id="zZf-nm-tCI"/>
<outlet property="textField" destination="qIF-d4-kOf" id="zIF-4n-v1e"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<action selector="memoryMenuChanged:" target="-2" id="m1Q-Xj-z22"/>
<binding destination="-2" name="content" keyPath="machine.ram" id="UCD-j5-7Bh"/>
<outlet property="dataSource" destination="-2" id="OV9-yE-OFp"/>
<outlet property="delegate" destination="-2" id="kXs-TN-3VL"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="Ccd-U2-Gx5" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="QI6-Cz-URX">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="v8c-Rp-Mnt">
<rect key="frame" x="-2" y="408" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 0:" id="EF7-NX-RMW">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="Ccd-U2-Gx5" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="0KQ-Qt-8KP">
<popUpButton key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Jw1-t7-YyU">
<rect key="frame" x="104" y="402" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="8Iv-mH-mEI" id="47g-IO-4Xt">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="nrR-Tr-UaW">
<items>
<menuItem title="Item 1" state="on" id="8Iv-mH-mEI"/>
<menuItem title="Item 2" id="Prr-6W-NWp"/>
<menuItem title="Item 3" id="xz3-bi-5IM"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="wPZ-cY-9Ir"/>
<binding destination="-2" name="content" keyPath="machine.sl0" id="2aW-3q-Mvt"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="JGU-aq-3uw" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="Y1R-Ob-g2b">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0gP-wH-DVr">
<rect key="frame" x="-2" y="377" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 1:" id="bfg-tf-E34">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="JGU-aq-3uw" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="v8q-Rj-E4q">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="1" translatesAutoresizingMaskIntoConstraints="NO" id="bta-RS-JT4">
<rect key="frame" x="104" y="371" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="dXO-at-nGw" id="kNn-6b-ysf">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="4ah-BI-RD5">
<items>
<menuItem title="Item 1" state="on" id="dXO-at-nGw"/>
<menuItem title="Item 2" id="UZY-8b-qmE"/>
<menuItem title="Item 3" id="zxA-OM-BIY"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="hl3-N2-89k"/>
<binding destination="-2" name="content" keyPath="machine.sl1" id="wQI-oy-SYz"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="gVW-Ya-phU" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="tpv-Yc-qii">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="EHZ-ol-QVz">
<rect key="frame" x="-2" y="346" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 2:" id="FlL-pN-rn7">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="gVW-Ya-phU" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="OzN-rM-Pgi">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="2" translatesAutoresizingMaskIntoConstraints="NO" id="cDU-b1-x5a">
<rect key="frame" x="104" y="340" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="vCY-qF-aB3" id="jvL-SH-nvG">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="Hp6-Gt-pVV">
<items>
<menuItem title="Item 1" state="on" id="vCY-qF-aB3"/>
<menuItem title="Item 2" id="pbR-nc-itb"/>
<menuItem title="Item 3" id="L8Z-vH-OCa"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="T5w-C4-Ohq"/>
<binding destination="-2" name="content" keyPath="machine.sl2" id="uXQ-0A-98q"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="3fP-qp-zmi" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="LbW-TT-AQ7">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zGs-8d-L0S">
<rect key="frame" x="-2" y="315" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 3:" id="KZK-h8-8cw">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="3fP-qp-zmi" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="h8H-TB-p2z">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="3" translatesAutoresizingMaskIntoConstraints="NO" id="aSh-cs-0Nn">
<rect key="frame" x="104" y="309" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="2yS-4z-8OR" id="HaE-TD-5Wx">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="zka-z5-hPa">
<items>
<menuItem title="Item 1" state="on" id="2yS-4z-8OR"/>
<menuItem title="Item 2" id="q4H-Fz-zVr"/>
<menuItem title="Item 3" id="HtQ-6y-S25"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="5uS-La-5cM"/>
<binding destination="-2" name="content" keyPath="machine.sl3" id="YgU-fX-fPC"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="86u-5p-UT6" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="hJR-nJ-yYi">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zsX-jd-6ba">
<rect key="frame" x="-2" y="284" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 4:" id="WXv-RF-e7f">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="86u-5p-UT6" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="dHu-cL-FyO">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="4" translatesAutoresizingMaskIntoConstraints="NO" id="kU5-cR-hPZ">
<rect key="frame" x="104" y="278" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="NaS-CV-XQm" id="rOP-eY-UKe">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="Iwv-z3-oJb">
<items>
<menuItem title="Item 1" state="on" id="NaS-CV-XQm"/>
<menuItem title="Item 2" id="ovb-SG-Eg4"/>
<menuItem title="Item 3" id="GVh-L4-3Cp"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="I35-wl-YdH"/>
<binding destination="-2" name="content" keyPath="machine.sl4" id="yfx-hj-6Ly"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="Wdg-xb-xQx" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="dsM-t5-8ng">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ANg-c1-hGf">
<rect key="frame" x="-2" y="253" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 5:" id="EhN-EV-65V">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="Wdg-xb-xQx" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="ffm-pA-jjo">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="5" translatesAutoresizingMaskIntoConstraints="NO" id="8z4-8f-kLU">
<rect key="frame" x="104" y="247" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="gH7-4J-xsg" id="cmc-Gf-Slp">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="Cma-00-qCY">
<items>
<menuItem title="Item 1" state="on" id="gH7-4J-xsg"/>
<menuItem title="Item 2" id="meM-WH-GgP"/>
<menuItem title="Item 3" id="ILg-Ld-9Ri"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="jSe-j9-QUW"/>
<binding destination="-2" name="content" keyPath="machine.sl5" id="Uo1-Rg-wko"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="ein-Fe-vBw" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="PSw-Jx-eS2">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Cr1-RK-Z7V">
<rect key="frame" x="-2" y="222" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 6:" id="uzy-th-5Yc">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="ein-Fe-vBw" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="FsV-vO-KAs">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="6" translatesAutoresizingMaskIntoConstraints="NO" id="GLb-F4-PWe">
<rect key="frame" x="104" y="216" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="VaX-M9-Op0" id="CjU-rC-HUT">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="3xq-Hn-icN">
<items>
<menuItem title="Item 1" state="on" id="VaX-M9-Op0"/>
<menuItem title="Item 2" id="Fhy-5D-e6z"/>
<menuItem title="Item 3" id="9jw-LA-666"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="yZO-kH-P6Q"/>
<binding destination="-2" name="content" keyPath="machine.sl6" id="0ze-xJ-DNX"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="qjB-2w-AWE" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="1WE-Mm-0O3">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Ia-XB-C6D">
<rect key="frame" x="-2" y="191" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 7:" id="32J-6e-nRV">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="qjB-2w-AWE" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="Yvr-uR-Hr5">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="7" translatesAutoresizingMaskIntoConstraints="NO" id="IV2-3M-qfw">
<rect key="frame" x="104" y="185" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="8nb-Bq-4R4" id="nKb-Ar-bCb">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="R2a-Mg-LsY">
<items>
<menuItem title="Item 1" state="on" id="8nb-Bq-4R4"/>
<menuItem title="Item 2" id="rFT-bC-KE9"/>
<menuItem title="Item 3" id="4jB-gp-lYT"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="llh-ab-ayK"/>
<binding destination="-2" name="content" keyPath="machine.sl7" id="hT6-pS-WmL"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="EEX-dh-jwn" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="iRl-IX-FSD">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Avf-lX-f2Q">
<rect key="frame" x="-2" y="160" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Expansion:" id="PEU-OV-910">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="EEX-dh-jwn" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="Ehv-aA-Llc">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="8" translatesAutoresizingMaskIntoConstraints="NO" id="San-wP-1ez">
<rect key="frame" x="104" y="154" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="jtv-Qx-oVD" id="42u-b4-3kx">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="1hM-MS-UEz">
<items>
<menuItem title="Item 1" state="on" id="jtv-Qx-oVD"/>
<menuItem title="Item 2" id="UeB-A1-nyv"/>
<menuItem title="Item 3" id="GyZ-dv-MS4"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="fi5-WL-lQa"/>
<binding destination="-2" name="content" keyPath="machine.exp" id="C88-Gb-QTE"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="OaZ-ZQ-gKK" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="wRB-Wh-7kG">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="EMz-7i-H38">
<rect key="frame" x="-2" y="129" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Auxiliary:" id="SoV-Qy-h2g">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="OaZ-ZQ-gKK" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="bx6-Rc-x2V">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="9" translatesAutoresizingMaskIntoConstraints="NO" id="3kq-qn-7YR">
<rect key="frame" x="104" y="123" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="vWX-Cb-ldP" id="NqP-Uq-Knv">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="7Ef-KS-ulj">
<items>
<menuItem title="Item 1" state="on" id="vWX-Cb-ldP"/>
<menuItem title="Item 2" id="Yg1-xZ-vXq"/>
<menuItem title="Item 3" id="BwC-w9-hBy"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="uvt-uD-Adn"/>
<binding destination="-2" name="content" keyPath="machine.aux" id="KA7-7x-qeJ"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="wQi-Oz-7Ye" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="KoQ-xV-fQu">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="JAG-sJ-u2B">
<rect key="frame" x="-2" y="98" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="RS 232:" id="iG2-rY-VDv">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="wQi-Oz-7Ye" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="zWk-jd-i0V">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="10" translatesAutoresizingMaskIntoConstraints="NO" id="6ln-U2-0Pi">
<rect key="frame" x="104" y="92" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="uu3-rr-iD8" id="daT-eX-4Vu">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="fMw-mh-Qfi">
<items>
<menuItem title="Item 1" state="on" id="uu3-rr-iD8"/>
<menuItem title="Item 2" id="f1r-MS-itp"/>
<menuItem title="Item 3" id="WhP-Di-CHP"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="gmZ-pW-35n"/>
<binding destination="-2" name="content" keyPath="machine.rs232" id="LxA-8b-jb4"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="gr2-eY-995" column="zpB-Rf-dWg" id="xIE-bJ-mzr">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Svb-pu-WPf">
<rect key="frame" x="-2" y="67" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Game I/O:" id="2Gc-mV-zCZ">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="gr2-eY-995" column="6Vn-yh-FoQ" id="nhy-Gp-GLL">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="11" translatesAutoresizingMaskIntoConstraints="NO" id="K8G-bZ-6mZ">
<rect key="frame" x="104" y="61" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="GOm-Tf-6qc" id="Mig-Nu-gZB">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="faU-zS-LgN">
<items>
<menuItem title="Item 1" state="on" id="GOm-Tf-6qc"/>
<menuItem title="Item 2" id="XgG-U0-2G7"/>
<menuItem title="Item 3" id="4Ea-aE-sB1"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="o53-71-xuf"/>
<binding destination="-2" name="content" keyPath="machine.gameio" id="tJw-AS-RUz"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="1xN-lm-s4l" column="zpB-Rf-dWg" id="vPV-KN-NNp">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="31K-iE-RCe">
<rect key="frame" x="-2" y="36" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Printer:" id="QZI-H7-i8m">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="1xN-lm-s4l" column="6Vn-yh-FoQ" id="KRc-Z8-drK">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="12" translatesAutoresizingMaskIntoConstraints="NO" id="sTp-en-8Wd">
<rect key="frame" x="104" y="30" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="TU9-ed-ofw" id="1OL-aw-xNL">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="MSP-Iu-ix3">
<items>
<menuItem title="Item 1" state="on" id="TU9-ed-ofw"/>
<menuItem title="Item 2" id="7wI-Tn-rE0"/>
<menuItem title="Item 3" id="bQc-pc-ccM"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="Fxc-YB-SF9"/>
<binding destination="-2" name="content" keyPath="machine.printer" id="3l1-Hn-v47"/>
</connections>
</popUpButton>
</gridCell>
<gridCell row="M2s-qn-SIT" column="zpB-Rf-dWg" id="8R2-aA-mLq">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MH0-Nk-5Py">
<rect key="frame" x="-2" y="5" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Modem:" id="HQq-VN-Ju9">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="M2s-qn-SIT" column="6Vn-yh-FoQ" id="idI-pW-e7v">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="13" translatesAutoresizingMaskIntoConstraints="NO" id="KHf-kC-BpZ">
<rect key="frame" x="104" y="-1" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="CxO-3g-va1" id="jDr-6p-C7y">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="lxi-Z0-ya6">
<items>
<menuItem title="Item 1" state="on" id="CxO-3g-va1"/>
<menuItem title="Item 2" id="OpR-vy-iL5"/>
<menuItem title="Item 3" id="xvH-9B-ge5"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="pHW-GG-2VQ"/>
<binding destination="-2" name="content" keyPath="machine.modem" id="hFa-pj-NnN"/>
</connections>
</popUpButton>
</gridCell>
</gridCells>
<point key="canvasLocation" x="268" y="71"/>
</gridView>
<userDefaultsController representsSharedInstance="YES" id="ZGN-Cx-9po"/>
</outlineView>
</subviews>
<color key="backgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="rYF-ld-adB">
<rect key="frame" x="-100" y="-100" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="4pL-Dn-e75" customClass="TransparentScroller">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
<color key="value" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</scroller>
<point key="canvasLocation" x="-100" y="154"/>
</scrollView>
<viewController id="ziL-Zf-s1k" userLabel="Popover View Controller">
<connections>
<outlet property="view" destination="uew-UQ-Q25" id="qjB-ya-gFf"/>
</connections>
</viewController>
<popover behavior="t" id="QIT-2T-wdy">
<connections>
<outlet property="contentViewController" destination="ziL-Zf-s1k" id="rj8-2U-9t0"/>
</connections>
</popover>
<customView id="uew-UQ-Q25">
<rect key="frame" x="0.0" y="0.0" width="250" height="400"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<button id="2jh-iq-DV6">
<rect key="frame" x="232" y="382" width="14" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSStopProgressFreestandingTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="Wp7-Km-kYI">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
Gw
</string>
</buttonCell>
<connections>
<action selector="performClose:" target="QIT-2T-wdy" id="Q04-24-ZOK"/>
</connections>
</button>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="27" horizontalPageScroll="10" verticalLineScroll="27" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" id="5gB-oE-Gza">
<rect key="frame" x="0.0" y="20" width="250" height="360"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<clipView key="contentView" focusRingType="none" drawsBackground="NO" copiesOnScroll="NO" id="X5e-Ka-JLr">
<rect key="frame" x="0.0" y="0.0" width="250" height="360"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="none" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="25" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" autoresizesOutlineColumn="YES" outlineTableColumn="o1K-z1-KVi" id="uM0-Gk-crn">
<rect key="frame" x="0.0" y="0.0" width="250" height="360"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="230" minWidth="40" maxWidth="1000" id="o1K-z1-KVi">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="A12-NQ-gW3">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView identifier="MenuCell" id="Mgb-8H-DmI" customClass="SlotTableCellView">
<rect key="frame" x="1" y="1" width="230" height="25"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ThL-Yz-7Kd">
<rect key="frame" x="1" y="0.0" width="229" height="25"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" autoenablesItems="NO" selectedItem="djR-rV-wzX" id="SkW-fW-gwL">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" autoenablesItems="NO" id="7Ib-TL-f6U">
<items>
<menuItem title="Item 1" state="on" id="djR-rV-wzX"/>
<menuItem title="Item 2" id="qbC-4D-6t6"/>
<menuItem title="Item 3" id="qPv-x5-zpj"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="ytA-nD-fIS"/>
</connections>
</popUpButton>
</subviews>
<connections>
<outlet property="menuButton" destination="ThL-Yz-7Kd" id="3Oc-hx-qKl"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="HXP-pH-3Lc"/>
<outlet property="delegate" destination="-2" id="nwb-IL-MsP"/>
</connections>
</outlineView>
</subviews>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Keh-oo-CPO">
<rect key="frame" x="-100" y="-100" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="wtc-gL-alh" customClass="TransparentScroller">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<point key="canvasLocation" x="-451" y="61"/>
</customView>
</objects>
<resources>
<image name="NSListViewTemplate" width="14" height="10"/>
<image name="NSStopProgressFreestandingTemplate" width="14" height="14"/>
</resources>
</document>
+34
View File
@@ -0,0 +1,34 @@
//
// BookmarkManager.h
// Ample
//
// Created by Kelvin Sherlock on 6/1/2021.
// Copyright © 2021 Kelvin Sherlock. All rights reserved.
//
#import <Foundation/Foundation.h>
@class NSMenu;
NS_ASSUME_NONNULL_BEGIN
@interface BookmarkManager : NSObject
@property (weak) IBOutlet NSMenu *menu;
+(instancetype)sharedManager;
-(void)loadBookmarks;
-(void)updateMenu;
-(BOOL)validateName: (NSString *)name;
-(BOOL)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name;
-(NSDictionary *)loadBookmarkFromURL: (NSURL *)url;
-(BOOL)saveDefault: (NSDictionary *)bookmark;
-(NSDictionary *)loadDefault;
@end
NS_ASSUME_NONNULL_END
+214
View File
@@ -0,0 +1,214 @@
//
// BookmarkManager.m
// Ample
//
// Created by Kelvin Sherlock on 6/1/2021.
// Copyright © 2021 Kelvin Sherlock. All rights reserved.
//
#import "BookmarkManager.h"
#import "Ample.h"
@interface BookmarkManager () {
NSArray<NSURL *> *_urls;
NSURL *_bookmarkDirectory;
}
@end
@implementation BookmarkManager
static BookmarkManager *singleton = nil;
-(void)awakeFromNib {
if (!singleton) singleton = self;
}
+(instancetype)sharedManager {
if (!singleton) singleton = [BookmarkManager new];
return singleton;
}
-(instancetype)init {
if (singleton) return singleton;
return [super init];
}
-(NSURL *)bookmarkDirectory {
if (_bookmarkDirectory) return _bookmarkDirectory;
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *url = SupportDirectory();
url = [url URLByAppendingPathComponent: @"Bookmarks"];
NSError *error = nil;
[fm createDirectoryAtURL: url withIntermediateDirectories: YES attributes: nil error: &error];
if (error) NSLog(@"%@", error);
_bookmarkDirectory = url;
return url;
}
/* disallow leading .
* disallow : or / characters.
*/
-(BOOL)validateName: (NSString *)name {
enum { kMaxLength = 128 };
unichar buffer[kMaxLength];
NSUInteger length = [name length];
if (length == 0 || length > kMaxLength) return NO;
[name getCharacters: buffer range: NSMakeRange(0, length)];
if (buffer[0] == '.') return NO;
for (unsigned i = 0; i < length; ++i) {
unichar c = buffer[i];
if (c == ':' || c == '/') return NO;
}
return YES;
}
-(NSDictionary *)loadDefault {
NSURL *url = [self bookmarkDirectory];
url = [url URLByAppendingPathComponent: @".Default"];
NSDictionary *d;
if (@available(macOS 10.13, *)) {
NSError *error = nil;
d = [NSDictionary dictionaryWithContentsOfURL: url error: &error];
if (!d) NSLog(@"Error loading %@: %@", url, error);
} else {
d = [NSDictionary dictionaryWithContentsOfURL: url];
if (!d) NSLog(@"Error loading %@", url);
}
return d;
}
/* save as .Default */
-(BOOL)saveDefault: (NSDictionary *)bookmark {
NSURL *url = [self bookmarkDirectory];
url = [url URLByAppendingPathComponent: @".Default"];
NSError *error = nil;
BOOL ok = NO;
if (@available(macOS 10.13, *)) {
ok = [bookmark writeToURL: url error: &error];
if (!ok) NSLog(@"%@", error);
} else {
ok = [bookmark writeToURL: url atomically: YES];
}
return ok;
}
-(BOOL)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name {
NSError *error;
NSData *data = [NSPropertyListSerialization dataWithPropertyList: bookmark
format: NSPropertyListXMLFormat_v1_0
options: 0
error: &error];
NSURL *base = [self bookmarkDirectory];
NSURL *url = [base URLByAppendingPathComponent: name];
BOOL ok = [data writeToURL: url options: NSDataWritingWithoutOverwriting error: &error];
if (!ok) {
for (unsigned i = 1 ; i < 100; ++i) {
NSString *tmp = [name stringByAppendingFormat: @"(%d)", i];
[base URLByAppendingPathComponent: tmp];
ok = [data writeToURL: url options: NSDataWritingWithoutOverwriting error: &error];
if (ok) {
name = tmp;
break;
}
}
}
if (!ok) return NO;
if (!_menu) return YES; // ?
NSUInteger ix = [_urls indexOfObjectPassingTest: ^BOOL(NSURL *object, NSUInteger index, BOOL *stop){
NSString *path = [object lastPathComponent];
return [name caseInsensitiveCompare: path] == NSOrderedAscending;
}];
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle: name action: @selector(loadBookmark:) keyEquivalent: @""];
[item setRepresentedObject: url];
if (ix == NSNotFound) {
_urls = [_urls arrayByAddingObject: url];
[_menu addItem: item];
} else {
NSInteger n = [_menu numberOfItems];
[_menu insertItem: item atIndex: n - [_urls count] + ix];
NSMutableArray *tmp = [_urls mutableCopy];
[tmp insertObject: url atIndex: ix];
}
return YES;
}
-(NSDictionary *)loadBookmarkFromURL: (NSURL *)url {
NSDictionary *d;
if (@available(macOS 10.13, *)) {
NSError *error = nil;
d = [NSDictionary dictionaryWithContentsOfURL: url error: &error];
if (!d) NSLog(@"Error loading %@: %@", url, error);
} else {
d = [NSDictionary dictionaryWithContentsOfURL: url];
if (!d) NSLog(@"Error loading %@", url);
}
return d;
}
-(void)loadBookmarks {
NSURL *url = [self bookmarkDirectory];
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = nil;
NSArray *files = [fm contentsOfDirectoryAtURL: url
includingPropertiesForKeys: nil
options: NSDirectoryEnumerationSkipsHiddenFiles
error: &error];
// bleh, has to create 2 new NSStrings for every comparison
files = [files sortedArrayUsingComparator: ^(NSURL *a, NSURL *b){
NSString *aa = [a lastPathComponent];
NSString *bb = [b lastPathComponent];
return [aa caseInsensitiveCompare: bb];
}];
_urls = files;
}
-(void)updateMenu {
NSArray *menus = [_menu itemArray];
for (NSMenuItem *item in [menus reverseObjectEnumerator]) {
if ([item tag] == 0xdeadbeef) [_menu removeItem: item];
}
for (NSURL *url in _urls) {
NSString *title = [url lastPathComponent]; // [[url lastPathComponent] stringByDeletingPathExtension];
NSMenuItem *item = [_menu addItemWithTitle: title action: @selector(loadBookmark:) keyEquivalent: @""];
[item setRepresentedObject: url];
[item setTag: 0xdeadbeef];
}
}
@end
+14
View File
@@ -27,6 +27,20 @@
- (void)windowDidLoad {
[super windowDidLoad];
if (!_webView) {
WKWebView *webView;
NSWindow *window = [self window];
CGRect frame = [[window contentView] frame];
webView = [WKWebView new];
[webView setFrame: frame];
[webView setNavigationDelegate: self];
[[window contentView]addSubview: webView];
_webView = webView;
}
[_webView setHidden: YES];
NSBundle *bundle = [NSBundle mainBundle];
NSURL *url = [bundle URLForResource: @"CheatSheet" withExtension: @"html"];
+21 -4
View File
@@ -67,8 +67,11 @@
[window setRestorable: YES];
[window setRestorationClass: [self class]];
[_tableView registerForDraggedTypes: @[NSPasteboardTypeFileURL]];
if (@available(macOS 10.13, *)) {
[_tableView registerForDraggedTypes: @[NSPasteboardTypeFileURL]];
} else {
[_tableView registerForDraggedTypes: @[ (NSString *)kUTTypeFileURL ]];
}
[_tableView setDraggingSourceOperationMask: NSDragOperationCopy forLocal: NO]; // enable drag/drop to othr apps.
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
@@ -95,6 +98,11 @@
[nc addObserver: self selector: @selector(willTerminate:) name: NSApplicationWillTerminateNotification object: nil];
}
-(void)timerCallback: (NSTimer *)timer {
_timer = nil;
[self saveFile];
}
-(void)diskImageAdded: (NSNotification *)notification {
NSURL *url = [notification object];
@@ -105,11 +113,15 @@
-(void)markDirty {
_dirty = YES;
if (_timer) [_timer invalidate];
_timer = [NSTimer scheduledTimerWithTimeInterval: 5 * 60 target: self selector: @selector(timerCallback:) userInfo: nil repeats: NO];
#if 0
// 10.12+
_timer = [NSTimer scheduledTimerWithTimeInterval: 5 * 60 repeats: NO block: ^(NSTimer *t) {
self->_timer = nil;
[self saveFile];
}];
#endif
}
-(void)saveFile {
@@ -306,11 +318,16 @@
for (NSPasteboardItem *item in [pb pasteboardItems]) {
// need to convert from a string to a url back to a file in case it's a file id url?
NSString *s = [item stringForType: NSPasteboardTypeFileURL];
NSString *s;
if (@available(macOS 10.13, *)) {
s = [item stringForType: NSPasteboardTypeFileURL];
} else {
// El Capitan still has kUTTypeFileURL aka public.file-url but doesn't have NSPasteboardTypeFileURL
s = [item stringForType: (NSString *)kUTTypeFileURL];
}
if (!s) continue;
NSURL *url = [NSURL URLWithString: s];
if (!url) continue;
ok |= [self addFile: url];
}
return ok;
+191 -23
View File
@@ -9,12 +9,13 @@
#import "Ample.h"
#import "LaunchWindowController.h"
#import "MediaViewController.h"
#import "NewSlotViewController.h"
#import "SlotViewController.h"
#import "MachineViewController.h"
#import "LogWindowController.h"
#import "AutocompleteControl.h"
#import "SoftwareList.h"
#import "BookmarkManager.h"
#include <sys/stat.h>
#include <wctype.h>
@@ -23,9 +24,11 @@ static NSString *kMyContext = @"kMyContext";
static NSString *kContextMachine = @"kContextMachine";
@interface LaunchWindowController ()
@interface LaunchWindowController () {
BOOL _loadingBookmark;
}
@property (strong) IBOutlet MediaViewController *mediaController;
@property (strong) IBOutlet NewSlotViewController *slotController;
@property (strong) IBOutlet SlotViewController *slotController;
@property (strong) IBOutlet MachineViewController *machineViewController;
@property (weak) IBOutlet NSView *machineView;
@@ -41,6 +44,7 @@ static NSString *kContextMachine = @"kContextMachine";
@property BOOL mameSquarePixels;
@property BOOL mameMouse;
@property BOOL mameSamples;
@property BOOL mameBGFX;
@property BOOL mameAVI;
@property BOOL mameWAV;
@@ -50,10 +54,10 @@ static NSString *kContextMachine = @"kContextMachine";
@property NSString *mameWAVPath;
@property NSString *mameVGMPath;
@property NSString *mameShareDirectory;
@property NSString *mameBitBanger;
@property NSInteger mameSpeed;
@property BOOL mameBGFX;
@property NSInteger mameBackend;
@property NSInteger mameEffects;
@@ -63,6 +67,12 @@ static NSString *kContextMachine = @"kContextMachine";
@property (weak) IBOutlet AutocompleteControl *softwareListControl;
@property SoftwareSet *softwareSet;
@property Software *software;
@property (strong) IBOutlet NSWindow *addBookmarkWindow;
@property (strong) NSString *bookmarkName;
@property (weak) IBOutlet NSTextField *bookmarkTextField;
@end
@interface LaunchWindowController (SoftwareList)
@@ -71,6 +81,30 @@ static NSString *kContextMachine = @"kContextMachine";
@end
@interface LaunchWindowController (Bookmark)
-(IBAction)addBookmark:(id)sender;
@end
static NSString *BackendStrings[] = {
@"",
@"metal",
@"opengl",
};
static NSString *EffectsStrings[] = {
@"-",
@"unfiltered",
@"hlsl",
@"crt-geom",
@"crt-geom-deluxe",
@"lcd-grid",
};
@implementation LaunchWindowController
-(NSString *)windowNibName {
@@ -96,14 +130,15 @@ static NSString *kContextMachine = @"kContextMachine";
NSArray *keys = @[
@"mameMachine", @"mameSquarePixels", @"mameWindowMode",
//@"mameMachine", // - handled
@"mameSquarePixels", @"mameWindowMode",
@"mameMouse", @"mameSamples",
@"mameDebug",
@"mameSpeed",
@"mameAVI", @"mameAVIPath",
@"mameWAV", @"mameWAVPath",
@"mameVGM", @"mameVGMPath",
@"mameShareDirectory",
@"mameShareDirectory", @"mameBitBanger",
@"mameBGFX", @"mameBackend", @"mameEffects",
@"software",
];
@@ -131,8 +166,11 @@ static NSString *kContextMachine = @"kContextMachine";
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
if (context == (__bridge void *)kMyContext) {
if (_loadingBookmark) return;
[self buildCommandLine];
} else if (context == (__bridge void *)kContextMachine) {
if (_loadingBookmark) return;
NSString *machine = [_machineViewController machine];
[self setMameMachine: machine];
[_slotController setMachine: machine];
@@ -297,7 +335,6 @@ static NSString *ShellQuote(NSString *s) {
[argv addObject: _mameMachine];
if (_software) {
// todo -- need to include source as well.
NSString *name = [_software name];
if (![_softwareSet nameIsUnique: name])
name = [_software fullName];
@@ -364,25 +401,12 @@ static NSString *ShellQuote(NSString *s) {
if (_mameBGFX) {
if (_mameBackend) {
static NSString *Names[] = {
@"-",
@"metal",
@"opengl",
};
[argv addObject: @"-bgfx_backend"];
[argv addObject: Names[_mameBackend]];
[argv addObject: BackendStrings[_mameBackend]];
}
if (_mameEffects) {
static NSString *Names[] = {
@"-",
@"unfiltered",
@"hlsl",
@"crt-geom",
@"crt-geom-deluxe",
@"lcd-grid",
};
[argv addObject: @"-bgfx_screen_chains"];
[argv addObject: Names[_mameEffects]];
[argv addObject: EffectsStrings[_mameEffects]];
}
} else {
@@ -437,6 +461,10 @@ static NSString *ShellQuote(NSString *s) {
[argv addObject: _mameShareDirectory];
}
if (_mameBitBanger && [_mameBitBanger length]) {
[argv addObject: @"-bitbanger"];
[argv addObject: _mameBitBanger];
}
[self setCommandLine: JoinArguments(argv, nil)];
[self setArgs: argv];
@@ -448,13 +476,19 @@ static NSString *ShellQuote(NSString *s) {
if (cmd == @selector(exportShellScript:)) {
return [_args count] ? YES : NO;
}
return [super validateMenuItem: menuItem];
if (cmd == @selector(addBookmark:)) {
return _mameMachine ? YES : NO;
}
return YES;
//return [super validateMenuItem: menuItem]; // not implemented?
}
# pragma mark - IBActions
- (IBAction)launchAction:(id)sender {
[[self window] makeFirstResponder: nil]; // in case text is being edited...
if (![_args count]) return;
[LogWindowController controllerForArgs: _args];
@@ -535,3 +569,137 @@ static NSString *ShellQuote(NSString *s) {
}
@end
@implementation LaunchWindowController (Bookmark)
-(IBAction)addBookmark:(id)sender {
if (!_mameMachine) return;
NSString *name = _mameMachine;
if (_software) {
name = [name stringByAppendingFormat: @" - %@", [_software title]];
}
[self setBookmarkName: name];
[_bookmarkTextField selectText: nil];
[[self window] beginSheet: _addBookmarkWindow completionHandler: nil];
}
-(IBAction)bookmarkCancel:(id)sender {
[[self window] endSheet: _addBookmarkWindow];
[_addBookmarkWindow orderOut: nil];
}
-(IBAction)bookmarkSave:(id)sender {
BookmarkManager *bm = [BookmarkManager sharedManager];
if (![bm validateName: _bookmarkName]) {
[_bookmarkTextField selectText: nil];
NSBeep();
return;
}
//NSLog(@"%@", _bookmarkName);
NSDictionary *d = [self makeBookmark];
//NSLog(@"%@", d);
[bm saveBookmark: d name: _bookmarkName];
[[self window] endSheet: _addBookmarkWindow];
[_addBookmarkWindow orderOut: nil];
[self setBookmarkName: nil];
}
-(IBAction)loadBookmark:(id)sender {
NSURL *url = [sender representedObject];
if (!url) return;
NSDictionary *d = [NSDictionary dictionaryWithContentsOfURL: url];
if (!d) return; // oops...
NSString *machine = [d objectForKey: @"machine"];
if (!machine) return;
_loadingBookmark = YES;
[_machineViewController willLoadBookmark: d];
[_slotController willLoadBookmark: d];
[_mediaController willLoadBookmark: d];
[self setMameMachine: machine];
[self updateSoftwareList];
[_softwareListControl setStringValue: [d objectForKey: @"software"]];
[_machineViewController loadBookmark: d];
[_slotController loadBookmark: d];
[_mediaController loadBookmark: d];
[_machineViewController didLoadBookmark: d];
[_slotController didLoadBookmark: d];
[_mediaController didLoadBookmark: d];
_loadingBookmark = NO;
[self buildCommandLine];
}
-(NSDictionary *)makeBookmark {
[[self window] makeFirstResponder: nil];
NSMutableDictionary *dict = [NSMutableDictionary new];
[dict setObject: _mameMachine forKey: @"machine"];
[dict setObject: @232 forKey: @"version"];
[_machineViewController saveBookmark: dict];
[_slotController saveBookmark: dict];
[_mediaController saveBookmark: dict];
// Boolean values
#undef _
#define _(v,k) [dict setObject: v ? (NSObject *)kCFBooleanTrue : (NSObject *)kCFBooleanFalse forKey: k]
_(_mameDebug, @"debug");
_(_mameSquarePixels, @"squarePixels");
_(_mameMouse, @"mouse");
_(_mameSamples, @"samples");
_(_mameBGFX, @"bgfx");
// numeric values
#undef _
#define _(v,k) [dict setObject: @(v) forKey: k]
_(_mameWindowMode, @"windowMode");
_(_mameSpeed, @"speed");
// String values
#undef _
#define _(v,k) [dict setObject: v forKey: k]
if (_mameAVI && [_mameAVIPath length]) _(_mameAVIPath, @"AVIPath");
if (_mameWAV && [_mameWAVPath length]) _(_mameWAVPath, @"WAVPath");
if (_mameVGM && [_mameVGMPath length]) _(_mameVGMPath, @"VGMPath");
if ([_mameShareDirectory length]) _(_mameShareDirectory, @"shareDirectory");
if ([_mameBitBanger length]) _(_mameBitBanger, @"shareDirectory");
if (_software) _([_software fullName], @"software");
if (_mameBackend) _(BackendStrings[_mameBackend], @"backend");
if (_mameEffects) _(EffectsStrings[_mameEffects], @"effects");
return dict;
#undef _
}
@end
+43 -9
View File
@@ -53,9 +53,16 @@ static NSMutableSet *LogWindows;
}
NSTask *task = [NSTask new];
[task setExecutableURL: url];
if (@available(macOS 10.13, *)) {
[task setExecutableURL: url];
[task setCurrentDirectoryURL: MameWorkingDirectory()];
} else {
[task setLaunchPath: MamePath()];
[task setCurrentDirectoryPath: MameWorkingDirectoryPath()];
}
[task setArguments: args];
[task setCurrentDirectoryURL: MameWorkingDirectory()];
return [LogWindowController controllerForTask: task];
}
@@ -79,25 +86,51 @@ static NSMutableSet *LogWindows;
}
}
-(void)appendAttributedString: (NSAttributedString *)string {
if ([string length]) {
[[_textView textStorage] appendAttributedString: string];
}
}
-(NSError *)runTask: (NSTask *)task {
if (_task) return nil;
NSError *error = nil;
NSPipe *pipe = [NSPipe pipe];
// window not yet loaded until [self window] called.
const char *path = [[task executableURL] fileSystemRepresentation];
// if (cp) [self appendString: [NSString stringWithFormat: @"MAME path: %s", cp]];
const char *wd = [[task currentDirectoryURL] fileSystemRepresentation];
// if (cp) [self appendString: [NSString stringWithFormat: @"Working Directory: %s", cp]];
const char *path = nil;
const char *wd = nil;
[task setStandardError: pipe];
[task setStandardOutput: pipe];
[task launchAndReturnError: &error];
if (@available(macOS 10.13, *)) {
NSError *error = nil;
path = [[task executableURL] fileSystemRepresentation];
wd = [[task currentDirectoryURL] fileSystemRepresentation];
[task launchAndReturnError: &error];
if (error) {
NSLog(@"NSTask error. Path = %s error = %@", path, error);
return error;
}
} else {
path = [[task launchPath] fileSystemRepresentation];
wd = [[task currentDirectoryPath] fileSystemRepresentation];
@try {
[task launch];
} @catch (NSException *exception) {
NSLog(@"NSTask exception. Path = %s exception = %@", path, exception);
return nil; // ?
}
}
#if 0
if (error) {
// NSURL *url = [task executableURL];
// NSString *path = [NSString stringWithCString: [url fileSystemRepresentation] encoding: NSUTF8StringEncoding];
@@ -106,6 +139,7 @@ static NSMutableSet *LogWindows;
// [self appendString: [error description]];
return error;
}
#endif
_task = task;
NSString *title = [NSString stringWithFormat: @"Ample Log - %u", [task processIdentifier]];
[[self window] setTitle: title];
+5
View File
@@ -8,6 +8,7 @@
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "Ample.h"
NS_ASSUME_NONNULL_BEGIN
@@ -17,4 +18,8 @@ NS_ASSUME_NONNULL_BEGIN
@end
@interface MachineViewController (Bookmark) <Bookmark>
@end
NS_ASSUME_NONNULL_END
+62
View File
@@ -110,5 +110,67 @@
return [data count];
}
@end
@implementation MachineViewController (Bookmark)
-(BOOL)loadBookmark: (NSDictionary *)bookmark {
NSBrowser *browser = (NSBrowser *)[self view];
NSString *machine = [bookmark objectForKey: @"machine"];
NSIndexPath *path = nil;
NSUInteger ix[2] = {0, 0 };
for (NSDictionary *d in _data) {
NSArray *children = [d objectForKey: @"children"];
for (NSDictionary *dd in children) {
NSString *value = [dd objectForKey: @"value"];
if ([machine isEqualToString: value]) {
path = [NSIndexPath indexPathWithIndexes: ix length: 2];
[browser selectRow: ix[0] inColumn: 0];
[browser selectRow: ix[1] inColumn: 1];
//[browser setSelectionIndexPath: path];
return YES;
}
++ix[1];
}
ix[1] = 0;
// check parent after.
NSString *value = [d objectForKey: @"value"];
if ([machine isEqualToString: value]) {
path = [NSIndexPath indexPathWithIndexes: ix length: 1];
[browser selectRow: ix[0] inColumn: 0];
// "setSelectionIndexPath: is not supported for browsers with matrix delegates."
//[browser setSelectionIndexPath: path];
return YES;
}
++ix[0];
}
NSLog(@"MachineViewController: Unable to find %@", machine);
return NO;
}
-(BOOL)saveBookmark: (NSMutableDictionary *)bookmark {
// machine saved in parent.
return YES;
}
-(void)willLoadBookmark:(NSDictionary *)bookmark {
}
-(void)didLoadBookmark:(NSDictionary *)bookmark {
}
@end
+3 -1
View File
@@ -8,6 +8,7 @@
#import <Cocoa/Cocoa.h>
#import "Media.h"
#import "Ample.h"
NS_ASSUME_NONNULL_BEGIN
@@ -20,8 +21,9 @@ NS_ASSUME_NONNULL_BEGIN
- (IBAction)ejectAction:(id)sender;
- (IBAction)pathAction:(id)sender;
@end
//-(void)setMedia: (NSDictionary *)media;
@interface MediaViewController (Bookmark) <Bookmark>
@end
+122 -5
View File
@@ -222,15 +222,20 @@
[pc bind: @"enabled" toObject: self withKeyPath: @"valid" options: options];
[button unbind: @"enabled"];
[button unbind: @"contentTintColor"];
t = [NSValueTransformer valueTransformerForName: NSIsNotNilTransformerName];
options = @{ NSValueTransformerBindingOption: t};
[button bind: @"enabled" toObject: self withKeyPath: @"url" options: options];
t = [NSValueTransformer valueTransformerForName: @"ValidColorTransformer"];
options = @{ NSValueTransformerBindingOption: t};
[button bind: @"contentTintColor" toObject: self withKeyPath: @"valid" options: options];
if (@available(macOS 10.14, *)) {
[button unbind: @"contentTintColor"];
t = [NSValueTransformer valueTransformerForName: @"ValidColorTransformer"];
options = @{ NSValueTransformerBindingOption: t};
[button bind: @"contentTintColor" toObject: self withKeyPath: @"valid" options: options];
} else {
// El Capitan TODO...
}
#if 0
NSColor *tintColor = nil;
if (!_valid) tintColor = [NSColor systemRedColor];
@@ -257,6 +262,8 @@
MediaCategory *_data[CATEGORY_COUNT];
NSArray *_root;
Media _media;
BOOL _loadingBookmark;
}
@end
@@ -371,6 +378,28 @@ x = media.name; cat = _data[index]; delta |= [cat setItemCount: x]
}
}
-(void)resetDiskImages {
BOOL delta = NO;
for (unsigned j = 0; j < CATEGORY_COUNT; ++j) {
MediaCategory *cat = _data[j];
NSInteger count = [cat count];
for (NSInteger i = 0; i < count; ++i) {
MediaItem *item = [cat objectAtIndex: i];
NSURL *url = [item url];
if (!url) continue;
[item setUrl: nil];
delta = YES;
}
}
if (delta) {
[self rebuildRoot];
[self rebuildArgs];
}
}
static NSString *kDragType = @"private.ample.media";
- (void)viewDidLoad {
@@ -636,4 +665,92 @@ static NSString *kDragType = @"private.ample.media";
[self rebuildArgs];
}
@end
@implementation MediaViewController (Bookmark)
-(BOOL)loadBookmark: (NSDictionary *)bookmark {
#if 0
// hmmm... should rely on machine/slots to set media
// so it doesn't go out of sync after an update.
NSDictionary *d = [bookmark objectForKey: @"media"];
Media m = EmptyMedia;
if (d) m = MediaFromDictionary(d);
[self setMedia: m];
#endif
// reset all media
[self resetDiskImages];
// if order of indexes change, would need to do a version check.
NSArray *media = [bookmark objectForKey: @"media"];
unsigned ix = 0;
for (NSArray *a in media) {
if (ix >= CATEGORY_COUNT) {
NSLog(@"MediaViewController: too many categories.");
break;
}
MediaCategory *cat = _data[ix++];
NSInteger count = [cat count];
unsigned i = 0;
for (NSString *path in a) {
if (i >= count) {
NSLog(@"MediaViewController: too many files.");
break; //
}
MediaItem *item = [cat objectAtIndex: i++];
NSURL *url = nil;
if ([path length])
url = [NSURL fileURLWithPath: path];
[item setUrl: url];
}
}
// add will load bookmark / did load bookmark to block all the rebuilding ?
[self rebuildRoot];
[self rebuildArgs];
return YES;
}
-(BOOL)saveBookmark: (NSMutableDictionary *)bookmark {
NSMutableArray *media = [NSMutableArray arrayWithCapacity: CATEGORY_COUNT];
for (unsigned ix = 0; ix < CATEGORY_COUNT; ++ix) {
MediaCategory *cat = _data[ix];
NSInteger count = [cat validCount];
NSMutableArray *array = [NSMutableArray new];
for (NSInteger i = 0; i < count; ++i) {
MediaItem *item = [cat objectAtIndex: i];
NSURL *url = [item url];
NSString *s = @"";
if (url)
s = [NSString stringWithCString: [url fileSystemRepresentation] encoding: NSUTF8StringEncoding];
[array addObject: s];
}
[media addObject: array];
}
[bookmark setObject: media forKey: @"media"];
return YES;
}
-(void)willLoadBookmark:(NSDictionary *)bookmark {
_loadingBookmark = YES;
}
-(void)didLoadBookmark:(NSDictionary *)bookmark {
_loadingBookmark = NO;
}
@end
-29
View File
@@ -1,29 +0,0 @@
//
// NewSlotViewController.h
// Ample
//
// Created by Kelvin Sherlock on 9/9/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "Media.h"
NS_ASSUME_NONNULL_BEGIN
@interface NewSlotViewController : NSViewController
@property NSArray *args;
@property Media media;
@property NSSize resolution;
@property (nonatomic) NSString *machine;
@end
@interface NewSlotViewController (OutlineView) <NSOutlineViewDelegate, NSOutlineViewDataSource>
@end
NS_ASSUME_NONNULL_END
-342
View File
@@ -1,342 +0,0 @@
//
// NewSlotViewController.m
// Ample
//
// Created by Kelvin Sherlock on 9/9/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "Ample.h"
#import "NewSlotViewController.h"
#import "Menu.h"
#import "Slot.h"
#import "Media.h"
#import <objc/runtime.h>
/* number of slot types. bitmask used so should be < sizeof(unsigned *8) */
#define SLOT_COUNT 22
static_assert(SLOT_COUNT <= sizeof(unsigned) * 8, "too many slot types");
#define SIZEOF(x) (sizeof(x) / sizeof(x[0]))
static unsigned RootKey = 0;
@interface NewSlotViewController ()
@property (weak) IBOutlet NSOutlineView *outlineView;
@property (weak) IBOutlet NSOutlineView *childOutlineView;
@end
@implementation NewSlotViewController {
NSArray *_root;
unsigned _slots_explicit;
unsigned _slots_valid;
unsigned _slots_default;
Slot *_slot_object[SLOT_COUNT];
NSString *_slot_value[SLOT_COUNT]; // when explicitely set.
Media _slot_media[SLOT_COUNT];
Media _machine_media;
NSDictionary *_machine_data;
IBOutlet NSPopover *_popover;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do view setup here.
_root = @[];
objc_setAssociatedObject(_outlineView, &RootKey, _root, OBJC_ASSOCIATION_RETAIN);
//[_outlineView setIndentationPerLevel: 2.0];
}
-(void)resetMachine {
_root = @[];
objc_setAssociatedObject(_outlineView, &RootKey, _root, OBJC_ASSOCIATION_RETAIN);
[_outlineView reloadData];
_slots_valid = 0;
_slots_explicit = 0;
_slots_default = 0;
_machine_media = EmptyMedia;
_machine_data = nil;
for (unsigned i = 0; i < SLOT_COUNT; ++i) {
_slot_media[i] = EmptyMedia;
_slot_object[i] = nil;
_slot_value[i] = nil;
}
[self setResolution: NSMakeSize(0, 0)];
[self setArgs: @[]];
[self setMedia: EmptyMedia];
}
-(void)loadMachine {
NSDictionary *d = MameMachine(_machine);
if (!d) {
[self resetMachine];
return;
}
NSArray *r = [d objectForKey: @"resolution"];
NSSize res = NSMakeSize(0, 0);
if (r) {
res.width = [(NSNumber *)[r objectAtIndex: 0 /*@"width"*/] doubleValue];
res.height = [(NSNumber *)[r objectAtIndex: 1 /*@"height"*/] doubleValue];
}
[self setResolution: res];
_slots_valid = 0;
//_slots_explicit = 0;
_slots_default = 0;
_machine_media = MediaFromDictionary([d objectForKey: @"media"]);
_machine_data = d;
for (unsigned i = 0; i < SLOT_COUNT; ++i) {
_slot_media[i] = EmptyMedia;
_slot_object[i] = nil;
}
extern NSArray *BuildSlots(NSString *name, NSDictionary *data);
_root = BuildSlots(_machine, d);
objc_setAssociatedObject(_outlineView, &RootKey, _root, OBJC_ASSOCIATION_RETAIN);
for (Slot *item in _root) {
NSInteger index = [item index];
if (index < 0) continue;
unsigned mask = 1 << index;
_slots_valid |= mask;
if ([item defaultIndex] >= 0)
_slots_default |= mask;
if (_slot_value[index])
[item selectValue: _slot_value[index]];
_slot_media[index] = [item selectedMedia];
_slot_object[index] = item;
}
[_outlineView reloadData];
[self rebuildMedia];
[self rebuildArgs];
}
-(void)setMachine: (NSString *)machine {
if (_machine == machine) return;
if (_machine && machine && [machine compare: _machine] == NSOrderedSame) return;
_machine = machine;
if (!machine) {
[self resetMachine];
return;
}
[self loadMachine];
}
-(void)rebuildMedia {
Media media = _machine_media;
unsigned mask = 1;
for (unsigned i = 0; i < SLOT_COUNT; ++i, mask <<= 1) {
if (_slots_valid & mask) {
MediaAdd(&media, &_slot_media[i]);
}
}
[self setMedia: media];
}
-(void)rebuildArgs {
NSMutableArray *args = [NSMutableArray new];
for (Slot *item in _root) {
NSArray *x = [item args];
if (x) [args addObjectsFromArray: x];
}
[self setArgs: args];
}
- (IBAction)menuChanged:(NSPopUpButton *)sender {
BOOL direct = YES;
NSInteger index = [sender tag];
if (index < 0) return; //
if (index >= 0 && index < SLOT_COUNT) {
direct = YES;
} else {
direct = NO;
index &= ~0x10000;
}
if (index >= SLOT_COUNT) return; //
unsigned mask = 1 << index;
// index 0 = ram = special case...
SlotOption *o = [[sender selectedItem] representedObject];
Slot *item = _slot_object[index];
if (direct) {
_slots_explicit |= mask;
_slot_value[index] = [o value];
//_slots_default &= ~mask;
}
Media media = [item selectedMedia];
if (!MediaEqual(&media, &_slot_media[index])) {
_slot_media[index] = media;
[self rebuildMedia];
}
// needs to reload children if expanded.
#ifdef SLOT_TREE
if (direct) {
BOOL rc = ([_outlineView isItemExpanded: item]);
[_outlineView reloadItem: item reloadChildren: rc];
}
#endif
[self rebuildArgs];
}
- (IBAction)hamburger:(id)sender {
#if 0
if ([_popover isShown]) {
[_popover close];
}
#endif
NSInteger index = [sender tag];
if (index < 0 || index >= SLOT_COUNT) return;
Slot *item = _slot_object[index];
NSArray *children = [item selectedChildren];
objc_setAssociatedObject(_childOutlineView, &RootKey, children, OBJC_ASSOCIATION_RETAIN);
if (!children) return;
[_childOutlineView reloadData];
NSSize size = [_popover contentSize];
if (size.width < 200) size.width = 250;
size = [_childOutlineView sizeThatFits: size];
size.height += 40;
[_popover setContentSize: size];
[_popover showRelativeToRect: [sender bounds]
ofView: sender
preferredEdge: NSRectEdgeMaxY];
}
-(IBAction)resetSlots:(id)sender {
_slots_explicit = 0;
for (unsigned i = 0; i < SLOT_COUNT; ++i) {
_slot_media[i] = EmptyMedia;
_slot_value[i] = nil;
}
for (Slot *item in _root) {
[item reset];
// if children, reset them too...
NSInteger index = [item index];
if (index < 0) continue;
_slot_media[index] = [item selectedMedia];
}
#ifdef SLOT_TREE
[_outlineView reloadData];
#endif
[self rebuildMedia];
[self rebuildArgs];
}
@end
@implementation NewSlotViewController (OutlineView)
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
NSArray *root = objc_getAssociatedObject(outlineView, &RootKey);
if (!item) return [root count];
#ifdef SLOT_TREE
NSArray *tmp = [(Slot *)item selectedChildren];
return [tmp count];
#endif
return 0;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
NSArray *root = objc_getAssociatedObject(outlineView, &RootKey);
if (!item) return [root objectAtIndex: index];
#ifdef SLOT_TREE
NSArray *tmp = [(Slot *)item selectedChildren];
return [tmp objectAtIndex: index];
#endif
return nil;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
#ifdef SLOT_TREE
if (!item) return NO;
NSArray *tmp = [(Slot *)item selectedChildren];
return [tmp count] > 0;
#else
return NO;
#endif
}
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(Slot *)item {
SlotTableCellView *v = [outlineView makeViewWithIdentifier: @"MenuCell" owner: self];
[item prepareView: v];
return v;
}
@end
+2 -1
View File
@@ -27,7 +27,8 @@
@property (readonly) SlotOption *selectedItem;
-(NSArray *)args;
-(NSArray *)serialize;
-(NSDictionary *)serialize;
-(void)reserialize: (NSDictionary *)dict;
-(void)reset;
-(void)prepareView: (SlotTableCellView *)view;
+61 -11
View File
@@ -60,7 +60,10 @@ static NSArray *DeepCopyArray(NSArray *src) {
-(void)setKeyPath: (NSString *)path;
-(void)buildArgs: (NSMutableArray *)args;
-(void)buildMedia: (Media *)media;
-(void)buildSerial: (NSMutableArray *)array;
-(void)buildSerial: (NSMutableDictionary *)array;
-(void)reserialize: (NSDictionary *)dict;
//-(BOOL)loadDeviceSlots: (NSDictionary *)devices;
@@ -138,15 +141,47 @@ static NSDictionary *IndexMap = nil;
return rv;
}
-(NSArray *)serialize {
-(NSDictionary *)serialize {
if (_selectedIndex < 0) return nil;
NSMutableArray *array = [NSMutableArray new];
NSMutableDictionary *d = [NSMutableDictionary new];
SlotOption *option = [_options objectAtIndex: _selectedIndex];
[option buildSerial: array];
return array;
[option buildSerial: d];
//if (![d count]) return nil; //?
return d;
}
-(void)reserialize: (NSDictionary *)dict {
// { 'sl3' : 'uthernet' }
// special case for smartport since the name isn't used.
if (_index == kSMARTPORT) {
SlotOption *option = [_options objectAtIndex: _selectedIndex];
[option reserialize: dict];
return;
}
NSString *value = [dict objectForKey: _name];
if (!value) {
//[self reset];
return;
}
// find it...
BOOL found = NO;
unsigned ix = 0;
for (SlotOption *option in _options) {
if ([value isEqualToString: [option value]]) {
[self setSelectedIndex: ix];
[option reserialize: dict];
found = YES;
break;
}
++ix;
}
}
-(Media)selectedMedia {
if (_selectedIndex < 0) return EmptyMedia;
@@ -323,12 +358,15 @@ static NSDictionary *IndexMap = nil;
[button unbind: @"selectedIndex"];
NSMenu *menu = [button menu];
NSArray *menuItems = [self menuItems];
// [menu setItemArray: ] doesn't work prior to 10.14, apparently.
[menu removeAllItems];
if (_index == kSMARTPORT) {
[menu setItemArray: @[]];
//[menu setItemArray: @[]];
[button setHidden: YES];
} else {
[menu setItemArray: menuItems];
//[menu setItemArray: menuItems];
for (NSMenuItem *x in menuItems) [menu addItem: x];
[button bind: @"selectedIndex" toObject: self withKeyPath: @"selectedIndex" options: nil];
[button setHidden: NO];
}
@@ -454,14 +492,26 @@ https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyVa
}
}
-(void)reserialize: (NSDictionary *)dict {
#if 0
NSString *value = [dict objectForKey: _keyPath];
if (value) {
// don't need to do anything since set by slot.
}
#endif
for (Slot *s in _children) {
[s reserialize: dict];
}
}
-(void)buildSerial: (NSMutableArray *)array {
-(void)buildSerial: (NSMutableDictionary *)dict {
if (!_default)
[array addObject: _keyPath];
[dict setObject: _value forKey: _keyPath];
for (Slot *s in _children)
[[s selectedItem] buildSerial: array];
[[s selectedItem] buildSerial: dict];
}
+15 -32
View File
@@ -2,49 +2,32 @@
// SlotViewController.h
// Ample
//
// Created by Kelvin Sherlock on 8/18/2020.
// Created by Kelvin Sherlock on 9/9/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "Media.h"
#import "Ample.h"
NS_ASSUME_NONNULL_BEGIN
@interface SlotViewController : NSViewController
@property (nonatomic) NSString *model;
@property (nonatomic) NSDictionary *machine;
@property NSString *memory;
@property NSUInteger memoryBytes;
@property NSString *sl0;
@property NSString *sl1;
@property NSString *sl2;
@property NSString *sl3;
@property NSString *sl4;
@property NSString *sl5;
@property NSString *sl6;
@property NSString *sl7;
@property NSString *rs232;
@property NSString *aux;
@property NSString *exp;
@property NSString *gameio;
@property NSString *printer;
@property NSString *modem;
@property NSSize resolution;
@property NSArray *args;
@property NSDictionary *media;
@property Media media;
@property NSSize resolution;
@property (nonatomic) NSString *machine;
//-(void)setMachine: (NSDictionary *)machine;
- (IBAction)menuChanged:(id)sender;
- (IBAction)memoryMenuChanged:(id)sender;
-(IBAction)resetSlots: (id)sender;
@end
@interface SlotViewController (OutlineView) <NSOutlineViewDelegate, NSOutlineViewDataSource>
@end
@interface SlotViewController (Bookmark) <Bookmark>
@end
NS_ASSUME_NONNULL_END
+319 -459
View File
@@ -2,337 +2,97 @@
// SlotViewController.m
// Ample
//
// Created by Kelvin Sherlock on 8/18/2020.
// Created by Kelvin Sherlock on 9/9/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "Ample.h"
#import "SlotViewController.h"
#import "Menu.h"
#import "Slot.h"
#import "Media.h"
const unsigned kMemoryMask = 1 << 16;
@interface SlotViewController () {
#import <objc/runtime.h>
/* number of slot types. bitmask used so should be < sizeof(unsigned *8) */
#define SLOT_COUNT 22
static_assert(SLOT_COUNT <= sizeof(unsigned) * 8, "too many slot types");
#define SIZEOF(x) (sizeof(x) / sizeof(x[0]))
static unsigned RootKey = 0;
@interface SlotViewController ()
@property (weak) IBOutlet NSOutlineView *outlineView;
@property (weak) IBOutlet NSOutlineView *childOutlineView;
@end
@implementation SlotViewController {
NSArray *_root;
unsigned _slots_explicit;
unsigned _slots_valid;
unsigned _slots_default;
Slot *_slot_object[SLOT_COUNT];
NSString *_slot_value[SLOT_COUNT]; // when explicitely set.
Media _slot_media[SLOT_COUNT];
Media _machine_media;
NSDictionary *_slot_object[14];
NSDictionary *_slot_media[14];
NSDictionary *_machine_media;
NSDictionary *_machine_data;
IBOutlet NSPopover *_popover;
BOOL _loadingBookmark;
}
@property (weak) IBOutlet NSPopUpButton *ram_menu;
@property (weak) IBOutlet NSPopUpButton *sl0_menu;
@property (weak) IBOutlet NSPopUpButton *sl1_menu;
@property (weak) IBOutlet NSPopUpButton *sl2_menu;
@property (weak) IBOutlet NSPopUpButton *sl3_menu;
@property (weak) IBOutlet NSPopUpButton *sl4_menu;
@property (weak) IBOutlet NSPopUpButton *sl5_menu;
@property (weak) IBOutlet NSPopUpButton *sl6_menu;
@property (weak) IBOutlet NSPopUpButton *sl7_menu;
@property (weak) IBOutlet NSPopUpButton *exp_menu;
@property (weak) IBOutlet NSPopUpButton *aux_menu;
@property (weak) IBOutlet NSPopUpButton *rs232_menu;
@property (weak) IBOutlet NSPopUpButton *game_menu;
@property (weak) IBOutlet NSPopUpButton *printer_menu;
@property (weak) IBOutlet NSPopUpButton *modem_menu;
@end
@implementation SlotViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do view setup here.
//[self setModel: @"apple2gs"];
}
-(void)reset {
}
_root = @[];
objc_setAssociatedObject(_outlineView, &RootKey, _root, OBJC_ASSOCIATION_RETAIN);
-(void)setModel:(NSString *)model {
if (model == _model) return;
if ([model isEqualToString: _model]) return;
_model = model;
[self loadMachine: model];
//[_outlineView setIndentationPerLevel: 2.0];
}
-(void)resetMachine {
[self setMachine: @{}];
#if 0
[self setSl0: @""];
[self setSl1: @""];
[self setSl2: @""];
[self setSl3: @""];
[self setSl4: @""];
[self setSl5: @""];
[self setSl6: @""];
[self setSl7: @""];
_root = @[];
objc_setAssociatedObject(_outlineView, &RootKey, _root, OBJC_ASSOCIATION_RETAIN);
[_outlineView reloadData];
[self setRs232: @""];
[self setAux: @""];
[self setExp: @""];
[self setGameio: @""];
[self setPrinter: @""];
[self setModem: @""];
[self setMemory: @""];
[self setMemoryBytes: 0];
#endif
[self setResolution: NSMakeSize(0, 0)];
_slots_default = 0;
//_slots_explicit = 0;
_slots_valid = 0;
_machine_media = nil;
_slots_explicit = 0;
_slots_default = 0;
_machine_media = EmptyMedia;
_machine_data = nil;
[self setArgs: @[]];
[self setMedia: @{}];
#if 0
// retain for later?
for (unsigned i = 0; i < 14; ++i) {
_slot_media[i] = nil;
for (unsigned i = 0; i < SLOT_COUNT; ++i) {
_slot_media[i] = EmptyMedia;
_slot_object[i] = nil;
_slot_value[i] = nil;
}
#endif
[self setResolution: NSMakeSize(0, 0)];
[self setArgs: @[]];
[self setMedia: EmptyMedia];
}
static NSFont *ItalicMenuFont(void) {
NSFont *font = [NSFont menuFontOfSize: 0];
NSFontDescriptor *fd = [font fontDescriptor];
NSFontDescriptor *fd2 = [fd fontDescriptorWithSymbolicTraits: NSFontDescriptorTraitItalic];
return [NSFont fontWithDescriptor: fd2 size: [font pointSize]];
}
// entry 0 is None/Empty for slots, but populated for RAM.
static int SetDefaultMenu(NSArray *items, NSPopUpButton *button) {
static NSDictionary *attr = nil;
if (!attr) {
attr = @{
NSFontAttributeName: ItalicMenuFont()
};
}
unsigned ix = 0;
-(void)loadMachine {
for (NSDictionary *d in items) {
BOOL def = [(NSNumber *)[d objectForKey: @"default"] boolValue];
if (!def) {
++ix;
continue;
}
NSMenuItem *item = [button itemAtIndex: ix];
NSString *title = [d objectForKey: @"description"];
NSAttributedString *t = [[NSAttributedString alloc] initWithString: title attributes: attr];
[item setAttributedTitle: t];
return ix;
}
return 0;
}
static void DeactivateMenus(NSArray *items, NSPopUpButton *button) {
NSDictionary *d = MameMachine(_machine);
[button setAutoenablesItems: NO];
unsigned ix = 0;
for (NSDictionary *d in items) {
BOOL value = [(NSNumber *)[d objectForKey: @"disabled"] boolValue];
if (value) {
NSMenuItem *item = [button itemAtIndex: ix];
[item setEnabled: NO];
}
++ix;
}
}
-(void)syncMemory {
int ix = 0;
NSArray *items = [_machine objectForKey: @"ram"];
unsigned default_index = SetDefaultMenu(items, _ram_menu);
_slots_valid |= kMemoryMask;
_slots_default &= ~kMemoryMask;
if (default_index) _slots_default |= kMemoryMask;
if (_slots_explicit & kMemoryMask) {
// if ram was explicitly set, try to keep it.
for (NSDictionary *d in items) {
unsigned size = [(NSNumber *)[d objectForKey: @"intValue"] unsignedIntValue];
if (size == _memoryBytes) {
[_ram_menu selectItemAtIndex: ix];
[self setMemory: [d objectForKey: @"value"]];
return;
}
++ix;
}
}
_slots_explicit &= ~kMemoryMask;
if (default_index) {
NSDictionary *d = [items objectAtIndex: default_index];
[_ram_menu selectItemAtIndex: default_index];
[self setMemory: [d objectForKey: @"value"]];
[self setMemoryBytes: [(NSNumber *)[d objectForKey: @"intValue"] unsignedIntValue]];
} else {
[self setMemoryBytes: 0];
[self setMemory: @""];
[_ram_menu selectItemAtIndex: 0];
}
}
-(void)resetMemory {
NSArray *items = [_machine objectForKey: @"ram"];
if (![items count]) return;
unsigned ix = 0;
for (NSDictionary *d in items) {
BOOL def = [(NSNumber *)[d objectForKey: @"default"] boolValue];
if (!def) {
++ix;
continue;
}
// ram should always have a default.
[_ram_menu selectItemAtIndex: ix];
[self setMemory: [d objectForKey: @"description"]];
_slots_default |= kMemoryMask;
return;
}
// just in case
[_ram_menu selectItemAtIndex: 0];
}
-(void)syncSlot: (NSString *)slot button: (NSPopUpButton *)button index: (unsigned)index {
NSString *value = [self valueForKey: slot];
NSArray *items = [_machine objectForKey: slot];
unsigned mask = 1 << index;
_slots_default &= ~mask;
_slots_valid &= ~mask;
if (![items count]) {
//[self setValue: @"" forKey: slot]; // retain for later.
//_slots_explicit &= ~mask;
return;
}
_slots_valid |= mask;
DeactivateMenus(items, button);
unsigned default_index = SetDefaultMenu(items, button);
if (default_index) _slots_default |= mask;
if (_slots_explicit & mask) {
int ix = 0;
for (NSDictionary *d in items) {
if ([value isEqualToString: [d objectForKey: @"value"]]) {
[button selectItemAtIndex: ix];
_slot_object[index] = d;
_slot_media[index] = [d objectForKey: @"media"];
return;
}
++ix;
}
}
_slots_explicit &= ~mask;
if (default_index) {
NSDictionary *d = [items objectAtIndex: default_index];
[button selectItemAtIndex: default_index];
[self setValue: [d objectForKey: @"value"] forKey: slot];
_slot_object[index] = d;
_slot_media[index] = [d objectForKey: @"media"];
} else {
[button selectItemAtIndex: 0];
[self setValue: @"" forKey: slot];
_slot_object[index] = nil;
_slot_media[index] = nil;
}
}
-(void)resetSlot: (NSString *)slot button: (NSPopUpButton *)button index: (unsigned)index {
NSArray *items = [_machine objectForKey: slot];
if (![items count]) return;
unsigned ix = 0;
for (NSDictionary *d in items) {
BOOL def = [(NSNumber *)[d objectForKey: @"default"] boolValue];
if (!def) {
++ix;
continue;
}
[button selectItemAtIndex: ix];
[self setValue: [d objectForKey: @"value"] forKey: slot];
_slot_object[index] = d;
_slot_media[index] = [d objectForKey: @"media"];
_slots_default |= (1 << index);
return;
}
// just in case
NSDictionary *d = [items firstObject];
[button selectItemAtIndex: 0];
[self setValue: [d objectForKey: @"value"] forKey: slot];
_slot_object[index] = d;
_slot_media[index] = [d objectForKey: @"media"];
}
-(void)syncSlots {
[self syncMemory];
[self syncSlot: @"sl0" button: _sl0_menu index: 0];
[self syncSlot: @"sl1" button: _sl1_menu index: 1];
[self syncSlot: @"sl2" button: _sl2_menu index: 2];
[self syncSlot: @"sl3" button: _sl3_menu index: 3];
[self syncSlot: @"sl4" button: _sl4_menu index: 4];
[self syncSlot: @"sl5" button: _sl5_menu index: 5];
[self syncSlot: @"sl6" button: _sl6_menu index: 6];
[self syncSlot: @"sl7" button: _sl7_menu index: 7];
[self syncSlot: @"exp" button: _exp_menu index: 8];
[self syncSlot: @"aux" button: _aux_menu index: 9];
[self syncSlot: @"rs232" button: _rs232_menu index: 10];
[self syncSlot: @"gameio" button: _game_menu index: 11];
[self syncSlot: @"printer" button: _printer_menu index: 12];
[self syncSlot: @"modem" button: _modem_menu index: 13];
}
-(void)loadMachine: (NSString *)model {
if (!model) {
[self resetMachine];
return;
}
NSBundle *bundle = [NSBundle mainBundle];
NSURL *url= [bundle URLForResource: model withExtension: @"plist"];
NSDictionary *d = [NSDictionary dictionaryWithContentsOfURL: url];
if (!d) {
[self resetMachine];
@@ -347,193 +107,293 @@ static void DeactivateMenus(NSArray *items, NSPopUpButton *button) {
}
[self setResolution: res];
_machine_media = [d objectForKey: @"media"];
// n.b. - does content binding propogate immediately?
[self setMachine: d];
[self syncSlots];
[self rebuildArgs];
[self rebuildMedia];
}
static NSString *SlotNames[] = {
@"sl0", @"sl1", @"sl2", @"sl3",
@"sl4", @"sl5", @"sl6", @"sl7",
@"exp", @"aux", @"rs232",
@"gameio", @"printer", @"modem",
};
unsigned SlotCount = 14;
- (IBAction)menuChanged:(NSPopUpButton *)sender {
NSInteger tag = [sender tag];
// NSInteger ix = [sender indexOfSelectedItem];
NSString *key = SlotNames[tag];
_slots_explicit |= (1 << tag);
NSDictionary *o = [[sender selectedItem] representedObject];
[self setValue: [o objectForKey: @"value"] forKey: key];
_slot_object[tag] = o;
NSDictionary *newMedia = [o objectForKey: @"media"];
NSDictionary *oldMedia = _slot_media[tag];
if (newMedia != oldMedia) {
_slot_media[tag] = newMedia;
[self rebuildMedia];
}
[self rebuildArgs];
}
- (IBAction)memoryMenuChanged:(NSPopUpButton *)sender {
//
NSDictionary *o = [[sender selectedItem] representedObject];
NSString *title = [o objectForKey: @"description"];
[self setMemory: title];
[self setMemoryBytes: [(NSNumber *)[o objectForKey: @"value"] unsignedIntValue]];
_slots_explicit |= kMemoryMask;
// if pull-down menu
if ([sender pullsDown])
[sender setTitle: title];
[self rebuildArgs];
}
-(IBAction)resetSlots:(id)sender {
/* reset slots to default */
_slots_explicit = 0;
_slots_valid = 0;
//_slots_explicit = 0;
_slots_default = 0;
for (unsigned i = 0 ; i < SlotCount; ++i) {
[self setValue: @"" forKey: SlotNames[i]];
_slot_media[i] = nil;
_machine_media = MediaFromDictionary([d objectForKey: @"media"]);
_machine_data = d;
for (unsigned i = 0; i < SLOT_COUNT; ++i) {
_slot_media[i] = EmptyMedia;
_slot_object[i] = nil;
}
_memory = @"";
_memoryBytes = 0;
[self resetMemory];
[self resetSlot: @"sl0" button: _sl0_menu index: 0];
[self resetSlot: @"sl1" button: _sl1_menu index: 1];
[self resetSlot: @"sl2" button: _sl2_menu index: 2];
[self resetSlot: @"sl3" button: _sl3_menu index: 3];
[self resetSlot: @"sl4" button: _sl4_menu index: 4];
[self resetSlot: @"sl5" button: _sl5_menu index: 5];
[self resetSlot: @"sl6" button: _sl6_menu index: 6];
[self resetSlot: @"sl7" button: _sl7_menu index: 7];
[self resetSlot: @"exp" button: _exp_menu index: 8];
[self resetSlot: @"aux" button: _aux_menu index: 9];
[self resetSlot: @"rs232" button: _rs232_menu index: 10];
[self resetSlot: @"gameio" button: _game_menu index: 11];
[self resetSlot: @"printer" button: _printer_menu index: 12];
[self resetSlot: @"modem" button: _modem_menu index: 13];
[self rebuildArgs];
[self rebuildMedia];
}
static BOOL should_add_arg(unsigned slot, unsigned valid_slots, unsigned explicit_slots, unsigned default_slots, NSString *value) {
extern NSArray *BuildSlots(NSString *name, NSDictionary *data);
_root = BuildSlots(_machine, d);
objc_setAssociatedObject(_outlineView, &RootKey, _root, OBJC_ASSOCIATION_RETAIN);
unsigned mask = 1 << slot;
if (~valid_slots & mask) return NO;
for (Slot *item in _root) {
NSInteger index = [item index];
if (index < 0) continue;
unsigned mask = 1 << index;
if (default_slots & mask) {
if (explicit_slots & mask)
return YES;
return NO;
_slots_valid |= mask;
if ([item defaultIndex] >= 0)
_slots_default |= mask;
if (_slot_value[index])
[item selectValue: _slot_value[index]];
_slot_media[index] = [item selectedMedia];
_slot_object[index] = item;
}
[_outlineView reloadData];
if (!_loadingBookmark) {
[self rebuildMedia];
[self rebuildArgs];
}
return [value length];
}
-(void)rebuildArgs {
NSMutableArray *args = [NSMutableArray new];
/* if there IS a default card for the slot and nothing is selected, need to -sl0 "" it. */
-(void)setMachine: (NSString *)machine {
if (_machine == machine) return;
if (_machine && machine && [machine compare: _machine] == NSOrderedSame) return;
_machine = machine;
#define _(ix, a, b) \
if (should_add_arg(ix, _slots_valid, _slots_explicit, _slots_default, a)) { \
[args addObject: b]; [args addObject: a]; \
} \
_(16, _memory, @"-ramsize")
_(0, _sl0, @"-sl0")
_(1, _sl1, @"-sl1")
_(2, _sl2, @"-sl2")
_(3, _sl3, @"-sl3")
_(4, _sl4, @"-sl4")
_(5, _sl5, @"-sl5")
_(6, _sl6, @"-sl6")
_(7, _sl7, @"-sl7")
_(8, _exp, @"-exp")
_(9, _aux, @"-aux")
_(10, _rs232, @"-rs232")
_(11, _gameio, @"-gameio")
_(12, _printer, @"-printer")
_(13, _modem, @"-modem")
#undef _
[self setArgs: args];
if (!machine) {
[self resetMachine];
return;
}
[self loadMachine];
}
-(void)rebuildMedia {
#define _(var, o) var += [[o objectForKey: @ # var ] unsignedIntValue]
unsigned cass = 0;
unsigned cdrm = 0;
unsigned hard = 0;
unsigned flop_5_25 = 0;
unsigned flop_3_5 = 0;
Media media = _machine_media;
unsigned mask = 1;
for (unsigned i = 0; i < 14; ++i, mask <<= 1) {
for (unsigned i = 0; i < SLOT_COUNT; ++i, mask <<= 1) {
if (_slots_valid & mask) {
NSDictionary *tmp = _slot_media[i];
if (tmp) {
_(cass, tmp);
_(cdrm, tmp);
_(hard, tmp);
_(flop_5_25, tmp);
_(flop_3_5, tmp);
}
MediaAdd(&media, &_slot_media[i]);
}
}
NSDictionary *tmp = _machine_media;
if (tmp) {
_(cass, tmp);
_(cdrm, tmp);
_(hard, tmp);
_(flop_5_25, tmp);
_(flop_3_5, tmp);
[self setMedia: media];
}
-(void)rebuildArgs {
NSMutableArray *args = [NSMutableArray new];
for (Slot *item in _root) {
NSArray *x = [item args];
if (x) [args addObjectsFromArray: x];
}
[self setArgs: args];
}
- (IBAction)menuChanged:(NSPopUpButton *)sender {
BOOL direct = YES;
NSInteger index = [sender tag];
if (index < 0) return; //
if (index >= 0 && index < SLOT_COUNT) {
direct = YES;
} else {
direct = NO;
index &= ~0x10000;
}
if (index >= SLOT_COUNT) return; //
unsigned mask = 1 << index;
// index 0 = ram = special case...
SlotOption *o = [[sender selectedItem] representedObject];
Slot *item = _slot_object[index];
if (direct) {
_slots_explicit |= mask;
_slot_value[index] = [o value];
//_slots_default &= ~mask;
}
[self setMedia: @{
@"cass": @(cass),
@"cdrm": @(cdrm),
@"hard": @(hard),
@"flop_5_25": @(flop_5_25),
@"flop_3_5": @(flop_3_5),
}];
Media media = [item selectedMedia];
if (!MediaEqual(&media, &_slot_media[index])) {
_slot_media[index] = media;
[self rebuildMedia];
}
// needs to reload children if expanded.
#ifdef SLOT_TREE
if (direct) {
BOOL rc = ([_outlineView isItemExpanded: item]);
[_outlineView reloadItem: item reloadChildren: rc];
}
#endif
[self rebuildArgs];
}
- (IBAction)hamburger:(id)sender {
#if 0
if ([_popover isShown]) {
[_popover close];
}
#endif
NSInteger index = [sender tag];
if (index < 0 || index >= SLOT_COUNT) return;
Slot *item = _slot_object[index];
NSArray *children = [item selectedChildren];
objc_setAssociatedObject(_childOutlineView, &RootKey, children, OBJC_ASSOCIATION_RETAIN);
if (!children) return;
[_childOutlineView reloadData];
NSSize size = [_popover contentSize];
if (size.width < 200) size.width = 250;
size = [_childOutlineView sizeThatFits: size];
size.height += 40;
[_popover setContentSize: size];
[_popover showRelativeToRect: [sender bounds]
ofView: sender
preferredEdge: NSRectEdgeMaxY];
}
-(IBAction)resetSlots:(id)sender {
_slots_explicit = 0;
for (unsigned i = 0; i < SLOT_COUNT; ++i) {
_slot_media[i] = EmptyMedia;
_slot_value[i] = nil;
}
for (Slot *item in _root) {
[item reset];
// if children, reset them too...
NSInteger index = [item index];
if (index < 0) continue;
_slot_media[index] = [item selectedMedia];
}
#ifdef SLOT_TREE
[_outlineView reloadData];
#endif
if (!_loadingBookmark) {
[self rebuildMedia];
[self rebuildArgs];
}
}
@end
@implementation SlotViewController (OutlineView)
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
NSArray *root = objc_getAssociatedObject(outlineView, &RootKey);
if (!item) return [root count];
#ifdef SLOT_TREE
NSArray *tmp = [(Slot *)item selectedChildren];
return [tmp count];
#endif
return 0;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
NSArray *root = objc_getAssociatedObject(outlineView, &RootKey);
if (!item) return [root objectAtIndex: index];
#ifdef SLOT_TREE
NSArray *tmp = [(Slot *)item selectedChildren];
return [tmp objectAtIndex: index];
#endif
return nil;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
#ifdef SLOT_TREE
if (!item) return NO;
NSArray *tmp = [(Slot *)item selectedChildren];
return [tmp count] > 0;
#else
return NO;
#endif
}
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(Slot *)item {
SlotTableCellView *v = [outlineView makeViewWithIdentifier: @"MenuCell" owner: self];
[item prepareView: v];
return v;
}
@end
@implementation SlotViewController (Bookmark)
-(BOOL)loadBookmark: (NSDictionary *)bookmark {
NSDictionary *dict = [bookmark objectForKey: @"slots"];
[self setMachine: [bookmark objectForKey: @"machine"]];
[self resetSlots: nil];
for (Slot *item in _root) {
[item reserialize: dict];
NSInteger index = [item index];
if (index >= 0 && index < SLOT_COUNT) {
unsigned mask = 1 << index;
if ([item defaultIndex] != [item selectedIndex])
_slots_explicit |= mask; // grrr.
_slot_media[index] = [item selectedMedia];
_slot_value[index] = [[item selectedItem] value];
}
++index;
}
[self rebuildMedia];
[self rebuildArgs];
return YES;
}
-(BOOL)saveBookmark: (NSMutableDictionary *)bookmark {
NSMutableDictionary *slots = [NSMutableDictionary new];
for (Slot *item in _root) {
NSDictionary *d = [item serialize];
[slots addEntriesFromDictionary: d];
}
[bookmark setObject: slots forKey: @"slots"];
return YES;
}
-(void)willLoadBookmark:(NSDictionary *)bookmark {
_loadingBookmark = YES;
}
-(void)didLoadBookmark:(NSDictionary *)bookmark {
_loadingBookmark = NO;
}
@end
+2 -2
View File
@@ -367,7 +367,7 @@ NSArray<SoftwareList *> *SoftwareListForMachine(NSString *machine) {
NSLog(@"SoftwareListForMachine: %@ %@: %@", machine, xml, error);
continue;
}
[cache setObject: sw forKey: xml];
if (sw) [cache setObject: sw forKey: xml];
}
if (filter) {
sw = [sw filter: filter];
@@ -479,7 +479,7 @@ NSArray<SoftwareList *> *SoftwareListForMachine(NSString *machine) {
NSLog(@"SoftwareListForMachine: %@ %@: %@", machine, xml, error);
continue;
}
[cache setObject: sw forKey: xml];
if (sw) [cache setObject: sw forKey: xml];
}
if (filter) {
sw = [sw filter: filter];
+2
View File
@@ -28,11 +28,13 @@
-(void)viewDidMoveToSuperview {
return;
#if 0
if (_trackingRect) {
[self removeTrackingRect: _trackingRect];
}
NSRect rect = [_dragHandle frame];
_trackingRect = [self addTrackingRect: rect owner: self userData: NULL assumeInside:NO];
#endif
}
-(void)mouseEntered:(NSEvent *)event {
+3
View File
@@ -21,5 +21,8 @@ NS_ASSUME_NONNULL_BEGIN
@interface ValidColorTransformer : NSValueTransformer
@end
@interface StringNotEmptyTransformer : NSValueTransformer
@end
NS_ASSUME_NONNULL_END
+19
View File
@@ -73,6 +73,21 @@
@end
@implementation StringNotEmptyTransformer
+ (BOOL)allowsReverseTransformation {
return NO;
}
+ (Class)transformedValueClass {
return [NSNumber class];
}
- (id)transformedValue:(id)value {
NSUInteger length = [(NSString *)value length];
return [NSNumber numberWithBool: length ? YES : NO];
}
@end
void RegisterTransformers(void) {
@@ -85,4 +100,8 @@ void RegisterTransformers(void) {
t = [ValidColorTransformer new];
[NSValueTransformer setValueTransformer: t forName: @"ValidColorTransformer"];
t = [StringNotEmptyTransformer new];
[NSValueTransformer setValueTransformer: t forName: @"StringNotEmptyTransformer"];
}
+5
View File
@@ -12,11 +12,16 @@
- (void)drawRect:(NSRect)dirtyRect {
//[super drawRect:dirtyRect];
[[NSColor clearColor] set];
NSRectFill(dirtyRect);
#if 0
NSColor *color = _backgroundColor;
if (color) {
[color setFill];
NSRectFill(dirtyRect);
}
#endif
[self drawKnob];
}
+16
View File
@@ -0,0 +1,16 @@
#!/bin/sh
DMG=SDL2-2.0.14.dmg
URL=https://www.libsdl.org/release/SDL2-2.0.14.dmg
FRAMEWORK=SDL2.framework
if [ -e $FRAMEWORK ] ; then exit 0 ; fi
if [ ! -e $DMG ] ; then curl -OL $URL ; fi
hdiutil attach $DMG -noverify -nobrowse -mountpoint /Volumes/sdl_disk_image
# cp -r /sdl_disk_image/$FRAMEWORK ./
ditto /Volumes/sdl_disk_image/$FRAMEWORK $FRAMEWORK
hdiutil detach /Volumes/sdl_disk_image