diff --git a/Ample.xcodeproj/project.pbxproj b/Ample.xcodeproj/project.pbxproj index 6bfe9f8..bffc1c1 100644 --- a/Ample.xcodeproj/project.pbxproj +++ b/Ample.xcodeproj/project.pbxproj @@ -273,6 +273,20 @@ 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 */; }; + B6E6DCEB27AEE15F00E0A76E /* Ample.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DCE927AEE15F00E0A76E /* Ample.xcdatamodeld */; }; + B6E6DCEC27AEE15F00E0A76E /* Ample.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DCE927AEE15F00E0A76E /* Ample.xcdatamodeld */; }; + B6E6DCF727B0873200E0A76E /* BookmarkWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = B6E6DCF527B0873100E0A76E /* BookmarkWindow.xib */; }; + B6E6DCF827B0873200E0A76E /* BookmarkWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = B6E6DCF527B0873100E0A76E /* BookmarkWindow.xib */; }; + B6E6DCFB27B0A09300E0A76E /* BookmarkWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DCFA27B0A09300E0A76E /* BookmarkWindowController.m */; }; + B6E6DCFC27B0A09300E0A76E /* BookmarkWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DCFA27B0A09300E0A76E /* BookmarkWindowController.m */; }; + B6E6DD0127B0D17C00E0A76E /* Bookmark+CoreDataClass.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DCFF27B0D17C00E0A76E /* Bookmark+CoreDataClass.m */; }; + B6E6DD0227B0D17C00E0A76E /* Bookmark+CoreDataClass.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DCFF27B0D17C00E0A76E /* Bookmark+CoreDataClass.m */; }; + B6E6DD0327B0D17C00E0A76E /* Bookmark+CoreDataProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DD0027B0D17C00E0A76E /* Bookmark+CoreDataProperties.m */; }; + B6E6DD0427B0D17C00E0A76E /* Bookmark+CoreDataProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DD0027B0D17C00E0A76E /* Bookmark+CoreDataProperties.m */; }; + B6E6DD1327B1D71700E0A76E /* DiskImage+CoreDataClass.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DD1127B1D71700E0A76E /* DiskImage+CoreDataClass.m */; }; + B6E6DD1427B1D71700E0A76E /* DiskImage+CoreDataClass.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DD1127B1D71700E0A76E /* DiskImage+CoreDataClass.m */; }; + B6E6DD1527B1D71700E0A76E /* DiskImage+CoreDataProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DD1227B1D71700E0A76E /* DiskImage+CoreDataProperties.m */; }; + B6E6DD1627B1D71700E0A76E /* DiskImage+CoreDataProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E6DD1227B1D71700E0A76E /* DiskImage+CoreDataProperties.m */; }; B6E9A18025088B1B005E7525 /* SlotViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6E9A17F25088B1B005E7525 /* SlotViewController.m */; }; B6E9A18325088B36005E7525 /* SlotView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B6E9A18125088B36005E7525 /* SlotView.xib */; }; B6F7B538266FDA5B00624C6B /* MachineView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B6F7B536266FDA5B00624C6B /* MachineView.xib */; }; @@ -504,6 +518,20 @@ B6DE32422605482500418375 /* mac512k.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = mac512k.plist; sourceTree = ""; }; B6DE32432605482500418375 /* macse.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = macse.plist; sourceTree = ""; }; B6E4B5FA24FDE2670094A35C /* Ample Lite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Ample Lite.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + B6E6DCEA27AEE15F00E0A76E /* Ample.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Ample.xcdatamodel; sourceTree = ""; }; + B6E6DCF627B0873100E0A76E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/BookmarkWindow.xib; sourceTree = ""; }; + B6E6DCF927B0A09300E0A76E /* BookmarkWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BookmarkWindowController.h; sourceTree = ""; }; + B6E6DCFA27B0A09300E0A76E /* BookmarkWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BookmarkWindowController.m; sourceTree = ""; }; + B6E6DCFD27B0D17C00E0A76E /* Bookmark+CoreDataProperties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bookmark+CoreDataProperties.h"; sourceTree = ""; }; + B6E6DCFE27B0D17C00E0A76E /* Bookmark+CoreDataClass.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bookmark+CoreDataClass.h"; sourceTree = ""; }; + B6E6DCFF27B0D17C00E0A76E /* Bookmark+CoreDataClass.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "Bookmark+CoreDataClass.m"; sourceTree = ""; }; + B6E6DD0027B0D17C00E0A76E /* Bookmark+CoreDataProperties.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "Bookmark+CoreDataProperties.m"; sourceTree = ""; }; + B6E6DD0E27B161C400E0A76E /* Bookmark.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Bookmark.h; path = Ample/Bookmark.h; sourceTree = SOURCE_ROOT; }; + B6E6DD0F27B1D71700E0A76E /* DiskImage+CoreDataProperties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DiskImage+CoreDataProperties.h"; sourceTree = ""; }; + B6E6DD1027B1D71700E0A76E /* DiskImage+CoreDataClass.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DiskImage+CoreDataClass.h"; sourceTree = ""; }; + B6E6DD1127B1D71700E0A76E /* DiskImage+CoreDataClass.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "DiskImage+CoreDataClass.m"; sourceTree = ""; }; + B6E6DD1227B1D71700E0A76E /* DiskImage+CoreDataProperties.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "DiskImage+CoreDataProperties.m"; sourceTree = ""; }; + B6E6DD1727B1DF5F00E0A76E /* DiskImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DiskImage.h; sourceTree = ""; }; B6E9A17E25088B1B005E7525 /* SlotViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SlotViewController.h; sourceTree = ""; }; B6E9A17F25088B1B005E7525 /* SlotViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SlotViewController.m; sourceTree = ""; }; B6E9A18225088B36005E7525 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SlotView.xib; sourceTree = ""; }; @@ -711,6 +739,7 @@ B6BA257D24E99BE9005FB8FF /* Ample */ = { isa = PBXGroup; children = ( + B6E6DD0527B160D400E0A76E /* Core Data */, B6665C12265A0E3E00254939 /* AutocompleteControl.h */, B6665C13265A0E3E00254939 /* AutocompleteControl.m */, B6BA257E24E99BE9005FB8FF /* AppDelegate.h */, @@ -718,6 +747,8 @@ B63C1B8924FF4B7100511A71 /* Ample.h */, B635C09E26784D4700B23BFD /* AmpleLite.m */, B63C1B8A24FF4BF700511A71 /* Ample.m */, + B6E6DD0E27B161C400E0A76E /* Bookmark.h */, + B6E6DD1727B1DF5F00E0A76E /* DiskImage.h */, B64AF1F4250ED5E400A09B9B /* TableCellView.h */, B64AF1F5250ED5E400A09B9B /* TableCellView.m */, B6152B5425F4549F00605E6E /* Slot.h */, @@ -764,6 +795,8 @@ B6BA563A251685DA00B0C47D /* Window Controllers */ = { isa = PBXGroup; children = ( + B6E6DCF927B0A09300E0A76E /* BookmarkWindowController.h */, + B6E6DCFA27B0A09300E0A76E /* BookmarkWindowController.m */, B64AF1F0250ECB2E00A09B9B /* DiskImagesWindowController.h */, B64AF1F1250ECB2E00A09B9B /* DiskImagesWindowController.m */, B63C1B9125008A2700511A71 /* DownloadWindowController.h */, @@ -784,6 +817,7 @@ isa = PBXGroup; children = ( B6665C1A265C639900254939 /* Autocomplete.xib */, + B6E6DCF527B0873100E0A76E /* BookmarkWindow.xib */, B6E9A18125088B36005E7525 /* SlotView.xib */, B6F7B536266FDA5B00624C6B /* MachineView.xib */, B63C1B9325008A2700511A71 /* DownloadWindow.xib */, @@ -818,6 +852,22 @@ path = images; sourceTree = ""; }; + B6E6DD0527B160D400E0A76E /* Core Data */ = { + isa = PBXGroup; + children = ( + B6E6DCE927AEE15F00E0A76E /* Ample.xcdatamodeld */, + B6E6DCFE27B0D17C00E0A76E /* Bookmark+CoreDataClass.h */, + B6E6DCFF27B0D17C00E0A76E /* Bookmark+CoreDataClass.m */, + B6E6DCFD27B0D17C00E0A76E /* Bookmark+CoreDataProperties.h */, + B6E6DD0027B0D17C00E0A76E /* Bookmark+CoreDataProperties.m */, + B6E6DD1027B1D71700E0A76E /* DiskImage+CoreDataClass.h */, + B6E6DD1127B1D71700E0A76E /* DiskImage+CoreDataClass.m */, + B6E6DD0F27B1D71700E0A76E /* DiskImage+CoreDataProperties.h */, + B6E6DD1227B1D71700E0A76E /* DiskImage+CoreDataProperties.m */, + ); + path = "Core Data"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -964,6 +1014,7 @@ B6D6DE3924FAC8B500661A5F /* Preferences.xib in Resources */, B63C1F0B25B143C50016A611 /* CheatSheet.xib in Resources */, B6109A3324F5F377005CB652 /* apple2eeuk.plist in Resources */, + B6E6DCF727B0873200E0A76E /* BookmarkWindow.xib in Resources */, B6374ADB260ECB400045CA16 /* maciix.plist in Resources */, B6109A2424F5F377005CB652 /* las128ex.plist in Resources */, B618B8C42729F6690045C2D8 /* laser128o.plist in Resources */, @@ -1078,6 +1129,7 @@ B6665C1D265C639A00254939 /* Autocomplete.xib in Resources */, B6E4B5C124FDE2670094A35C /* apple1.plist in Resources */, B6E4B5C224FDE2670094A35C /* ace100.plist in Resources */, + B6E6DCF827B0873200E0A76E /* BookmarkWindow.xib in Resources */, B6374AD6260ECB400045CA16 /* maciisi.plist in Resources */, B6DE32472605482500418375 /* macclasc.plist in Resources */, B6E4B5C324FDE2670094A35C /* am64.plist in Resources */, @@ -1225,9 +1277,13 @@ files = ( B608E17F2502FE0C00D53465 /* TransparentScroller.m in Sources */, B6E9A18025088B1B005E7525 /* SlotViewController.m in Sources */, + B6E6DD1527B1D71700E0A76E /* DiskImage+CoreDataProperties.m in Sources */, B6A1A1942528EB1700DB0FD7 /* Menu.m in Sources */, + B6E6DD1327B1D71700E0A76E /* DiskImage+CoreDataClass.m in Sources */, + B6E6DD0127B0D17C00E0A76E /* Bookmark+CoreDataClass.m in Sources */, B6BA258824E99BEB005FB8FF /* main.m in Sources */, B63C1B8B24FF4BF700511A71 /* Ample.m in Sources */, + B6E6DCFB27B0A09300E0A76E /* BookmarkWindowController.m in Sources */, B6B9EA662506A5550080E70D /* EjectButton.m in Sources */, B6152B5A25F5B57E00605E6E /* Media.m in Sources */, B6152B5625F4549F00605E6E /* Slot.m in Sources */, @@ -1238,6 +1294,7 @@ B68A899026BE18E000B2C8C6 /* MidiManager.m in Sources */, B6BA258024E99BE9005FB8FF /* AppDelegate.m in Sources */, B6004DF024FB05D600D38596 /* LogWindowController.m in Sources */, + B6E6DD0327B0D17C00E0A76E /* Bookmark+CoreDataProperties.m in Sources */, B63005332666D6940014C381 /* BookmarkManager.m in Sources */, B66236A924FD9A34006CABD7 /* PreferencesWindowController.m in Sources */, B63C1F0F25B1447C0016A611 /* CheatSheetWindowController.m in Sources */, @@ -1245,6 +1302,7 @@ B6F7B53C267017A200624C6B /* NewMachineViewController.m in Sources */, B64AF1F6250ED5E400A09B9B /* TableCellView.m in Sources */, B66D0FE72611386C000902F1 /* SoftwareList.m in Sources */, + B6E6DCEB27AEE15F00E0A76E /* Ample.xcdatamodeld in Sources */, B63C1B9425008A2700511A71 /* DownloadWindowController.m in Sources */, B64AF1FA250EF6A500A09B9B /* Transformers.m in Sources */, ); @@ -1259,16 +1317,22 @@ B64AF1FB250EF6A500A09B9B /* Transformers.m in Sources */, B6E4B5B024FDE2670094A35C /* main.m in Sources */, B63C1F1025B1447C0016A611 /* CheatSheetWindowController.m in Sources */, + B6E6DD1427B1D71700E0A76E /* DiskImage+CoreDataClass.m in Sources */, B63C1B8C24FF4BF700511A71 /* Ample.m in Sources */, B64AF1F3250ECB2E00A09B9B /* DiskImagesWindowController.m in Sources */, + B6E6DCEC27AEE15F00E0A76E /* Ample.xcdatamodeld in Sources */, B6B9EA672506A5550080E70D /* EjectButton.m in Sources */, B6A1A1952528EB1700DB0FD7 /* Menu.m in Sources */, B6152B5B25F5B57E00605E6E /* Media.m in Sources */, B6E4B5B124FDE2670094A35C /* LaunchWindowController.m in Sources */, B6152B5725F4549F00605E6E /* Slot.m in Sources */, B6E4B5B324FDE2670094A35C /* MediaViewController.m in Sources */, + B6E6DCFC27B0A09300E0A76E /* BookmarkWindowController.m in Sources */, + B6E6DD1627B1D71700E0A76E /* DiskImage+CoreDataProperties.m in Sources */, B64AF1F7250ED5E400A09B9B /* TableCellView.m in Sources */, B6E4B5B424FDE2670094A35C /* FlippedView.m in Sources */, + B6E6DD0227B0D17C00E0A76E /* Bookmark+CoreDataClass.m in Sources */, + B6E6DD0427B0D17C00E0A76E /* Bookmark+CoreDataProperties.m in Sources */, B63005342666D6940014C381 /* BookmarkManager.m in Sources */, B615A9A026640A70001FBF99 /* SlotViewController.m in Sources */, B6665C15265A0E3E00254939 /* AutocompleteControl.m in Sources */, @@ -1349,6 +1413,14 @@ name = LaunchWindow.xib; sourceTree = ""; }; + B6E6DCF527B0873100E0A76E /* BookmarkWindow.xib */ = { + isa = PBXVariantGroup; + children = ( + B6E6DCF627B0873100E0A76E /* Base */, + ); + name = BookmarkWindow.xib; + sourceTree = ""; + }; B6E9A18125088B36005E7525 /* SlotView.xib */ = { isa = PBXVariantGroup; children = ( @@ -1656,6 +1728,19 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + B6E6DCE927AEE15F00E0A76E /* Ample.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + B6E6DCEA27AEE15F00E0A76E /* Ample.xcdatamodel */, + ); + currentVersion = B6E6DCEA27AEE15F00E0A76E /* Ample.xcdatamodel */; + path = Ample.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ }; rootObject = B6BA257324E99BE9005FB8FF /* Project object */; } diff --git a/Ample/Ample.h b/Ample/Ample.h index ba7e7a0..1e8ea9c 100644 --- a/Ample/Ample.h +++ b/Ample/Ample.h @@ -42,6 +42,7 @@ extern NSString *kDefaultDownloadExtension; extern NSString *kNotificationDiskImageAdded; extern NSString *kNotificationDiskImageMagicRoute; +extern NSString *kNotificationBookmarkMagicRoute; @protocol Bookmark -(BOOL)loadBookmark: (NSDictionary *)bookmark; diff --git a/Ample/Ample.m b/Ample/Ample.m index f5a2ee8..80d7709 100644 --- a/Ample/Ample.m +++ b/Ample/Ample.m @@ -138,3 +138,4 @@ NSString *kDownloadExtension = @"DownloadExtension"; NSString *kNotificationDiskImageAdded = @"Disk Image Added"; NSString *kNotificationDiskImageMagicRoute = @"Disk Image Magic Route"; +NSString *kNotificationBookmarkMagicRoute = @"Bookmark Magic Route"; diff --git a/Ample/AppDelegate.h b/Ample/AppDelegate.h index bcedb34..20990f5 100644 --- a/Ample/AppDelegate.h +++ b/Ample/AppDelegate.h @@ -11,6 +11,6 @@ @interface AppDelegate : NSObject - (IBAction)displayPreferences:(id)sender; - +- (IBAction)manageBookmarks: (id)sender; @end diff --git a/Ample/AppDelegate.m b/Ample/AppDelegate.m index fab1b8a..5c91a5a 100644 --- a/Ample/AppDelegate.m +++ b/Ample/AppDelegate.m @@ -12,6 +12,8 @@ #import "DownloadWindowController.h" #import "DiskImagesWindowController.h" #import "CheatSheetWindowController.h" +#import "BookmarkWindowController.h" + #import "Transformers.h" #import "BookmarkManager.h" @@ -28,6 +30,8 @@ NSWindowController *_downloader; NSWindowController *_diskImages; NSWindowController *_cheatSheet; + NSWindowController *_bookmarks; + } @@ -41,9 +45,7 @@ RegisterTransformers(); - BookmarkManager *bm = [BookmarkManager sharedManager]; - [bm loadBookmarks]; - [bm updateMenu]; + //BookmarkManager *bm = [BookmarkManager sharedManager]; path = [bundle pathForResource: @"Defaults" ofType: @"plist"]; dict = [NSDictionary dictionaryWithContentsOfFile: path]; @@ -53,17 +55,17 @@ [[NSUserDefaults standardUserDefaults] registerDefaults: dict]; } - - _diskImages = [DiskImagesWindowController sharedInstance]; //[DiskImagesWindowController new]; if ([self installMameComponents]) { [self displayLaunchWindow]; } - } + + + -(void)displayLaunchWindow { if (!_launcher) { @@ -146,6 +148,7 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification { // Insert code here to tear down your application + } - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { @@ -226,6 +229,13 @@ } +- (IBAction)manageBookmarks: (id)sender { + + if (!_bookmarks) { + _bookmarks = [BookmarkWindowController new]; + } + [_bookmarks showWindow: sender]; +} @end diff --git a/Ample/Base.lproj/BookmarkWindow.xib b/Ample/Base.lproj/BookmarkWindow.xib new file mode 100644 index 0000000..f95391e --- /dev/null +++ b/Ample/Base.lproj/BookmarkWindow.xib @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ample/Base.lproj/DiskImages.xib b/Ample/Base.lproj/DiskImages.xib index adb78dd..4c8adef 100644 --- a/Ample/Base.lproj/DiskImages.xib +++ b/Ample/Base.lproj/DiskImages.xib @@ -8,132 +8,17 @@ - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FilePathTransformer - - - - - - - - - - - - - - - - - FileSizeTransformer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - + @@ -156,5 +41,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FileSizeTransformer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ample/Base.lproj/DownloadWindow.xib b/Ample/Base.lproj/DownloadWindow.xib index 00aa16b..b4fdd42 100644 --- a/Ample/Base.lproj/DownloadWindow.xib +++ b/Ample/Base.lproj/DownloadWindow.xib @@ -78,6 +78,7 @@ + diff --git a/Ample/Base.lproj/LaunchWindow.xib b/Ample/Base.lproj/LaunchWindow.xib index 64428c4..03dc69c 100644 --- a/Ample/Base.lproj/LaunchWindow.xib +++ b/Ample/Base.lproj/LaunchWindow.xib @@ -9,6 +9,7 @@ + @@ -570,9 +571,29 @@ Gw + + + + + + + + + + - + diff --git a/Ample/Base.lproj/MainMenu.xib b/Ample/Base.lproj/MainMenu.xib index 68f685b..bf8d1b2 100644 --- a/Ample/Base.lproj/MainMenu.xib +++ b/Ample/Base.lproj/MainMenu.xib @@ -13,17 +13,17 @@ + + + + + - - - - - @@ -405,28 +405,34 @@ + + + + + + - - - - + - + + + + @@ -532,5 +538,6 @@ + diff --git a/Ample/Base.lproj/Preferences.xib b/Ample/Base.lproj/Preferences.xib index 6f7aca5..98157d3 100644 --- a/Ample/Base.lproj/Preferences.xib +++ b/Ample/Base.lproj/Preferences.xib @@ -49,8 +49,8 @@ - + @@ -104,11 +104,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ample/Bookmark.h b/Ample/Bookmark.h new file mode 100644 index 0000000..9ff804c --- /dev/null +++ b/Ample/Bookmark.h @@ -0,0 +1,14 @@ +// +// Bookmark.h +// Ample +// +// Created by Kelvin Sherlock on 2/7/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// + +#ifndef Bookmark_h +#define Bookmark_h + +#import "Bookmark+CoreDataClass.h" + +#endif /* Bookmark_h */ diff --git a/Ample/BookmarkManager.h b/Ample/BookmarkManager.h index 971bc33..066a310 100644 --- a/Ample/BookmarkManager.h +++ b/Ample/BookmarkManager.h @@ -7,28 +7,35 @@ // #import +#import @class NSMenu; +@class Bookmark; +@class DiskImage; NS_ASSUME_NONNULL_BEGIN @interface BookmarkManager : NSObject @property (weak) IBOutlet NSMenu *menu; +@property (readonly) NSManagedObjectContext *managedObjectContext; +(instancetype)sharedManager; --(void)loadBookmarks; --(void)updateMenu; +-(NSString *)uniqueBookmarkName: (NSString *)name; --(BOOL)validateName: (NSString *)name; +-(NSError *)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name automatic: (BOOL)automatic; --(BOOL)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name; --(NSDictionary *)loadBookmarkFromURL: (NSURL *)url; +//-(NSError *)saveDefault: (NSDictionary *)bookmark; --(BOOL)saveDefault: (NSDictionary *)bookmark; -(NSDictionary *)loadDefault; +-(NSError *)setAutomatic: (Bookmark *)bookmark; + +-(BOOL)addDiskImage: (NSObject *)pathOrURL; + + +//-(void)convertLegacyBookmarks; @end NS_ASSUME_NONNULL_END diff --git a/Ample/BookmarkManager.m b/Ample/BookmarkManager.m index 8047004..45940dd 100644 --- a/Ample/BookmarkManager.m +++ b/Ample/BookmarkManager.m @@ -9,19 +9,41 @@ #import "BookmarkManager.h" #import "Ample.h" +#import "Bookmark.h" +#import "DiskImage.h" +#import "Menu.h" + + @interface BookmarkManager () { - NSArray *_urls; + + NSPersistentStoreCoordinator *_psc; + NSManagedObjectContext *_moc; + NSManagedObjectModel *_mom; + NSPersistentStore *_store; + + NSFetchRequest *_defaultRequest; + + NSURL *_bookmarkDirectory; + NSArrayController *_items; + NSUInteger _newMenuGeneration; + NSUInteger _currentMenuGeneration; } @end +@interface BookmarkManager (MenuDelegate) +@end + @implementation BookmarkManager static BookmarkManager *singleton = nil; -(void)awakeFromNib { - if (!singleton) singleton = self; + if (!singleton) { + singleton = self; + if (!_items) [self initMenus]; + } } +(instancetype)sharedManager { @@ -31,7 +53,170 @@ static BookmarkManager *singleton = nil; -(instancetype)init { if (singleton) return singleton; - return [super init]; + + + if ((self = [super init])) { + [self initCoreData]; + + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + + [nc addObserver: self selector: @selector(willTerminate:) name: NSApplicationWillTerminateNotification object: nil]; + [nc addObserver: self selector: @selector(diskImageAdded:) name: kNotificationDiskImageAdded object: nil]; + + + _newMenuGeneration = 1; + _currentMenuGeneration = 0; + } + + + return self; +} + +-(NSManagedObjectContext *)managedObjectContext { + return _moc; +} + +-(void)initCoreData { + + NSError *error; + BOOL new = NO; + + NSBundle *bundle = [NSBundle mainBundle]; + NSURL *url = [bundle URLForResource: @"Ample" withExtension: @"momd"]; + _mom = [[NSManagedObjectModel alloc] initWithContentsOfURL: url]; + + _psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: _mom]; + + _moc = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType]; + [_moc setPersistentStoreCoordinator: _psc]; + + //[_moc setMergePolicy: [NSMergePolicy rollbackMergePolicy]]; + + url = SupportDirectory(); +#if 0 + url = [url URLByAppendingPathComponent: @"Ample.db"]; + + if (![url checkResourceIsReachableAndReturnError: &error]) + new = YES; + + + _store = [_psc addPersistentStoreWithType: NSSQLiteStoreType + configuration: nil + URL: url + options: nil + error: &error]; +#else + + url = [url URLByAppendingPathComponent: @"Ample.xml"]; + + if (![url checkResourceIsReachableAndReturnError: &error]) + new = YES; + + + _store = [_psc addPersistentStoreWithType: NSXMLStoreType + configuration: nil + URL: url + options: nil + error: &error]; + + +#endif + _defaultRequest = [Bookmark fetchRequest]; + [_defaultRequest setPredicate: [NSPredicate predicateWithFormat: @"automatic == TRUE"]]; + + if (new) { + [self convertLegacyBookmarks]; + [self convertLegacyDiskImages]; + } + +} + +-(void)willTerminate: (NSNotification *)notification { + + NSError *error; + + if (![_moc save: &error]) { + NSLog(@"%@", error); + } +} + + +-(void)convertLegacyBookmarks { + + //NSEntityDescription *e; + + //e = [NSEntityDescription entityForName: @"Bookmark" inManagedObjectContext: moc]; + + NSURL *url = [self bookmarkDirectory]; + NSFileManager *fm = [NSFileManager defaultManager]; + NSError *error = nil; + + NSArray *files = [fm contentsOfDirectoryAtURL: url + includingPropertiesForKeys: nil + options: NSDirectoryEnumerationSkipsHiddenFiles + error: &error]; + + NSDate *now = [NSDate date]; + for (NSURL *url in files) { + + + NSDictionary *dict = [NSDictionary dictionaryWithContentsOfURL: url]; + //NSData *data = [NSPropertyListSerialization dataWithPropertyList: dict format: NSPropertyListBinaryFormat_v1_0 options: 0 error: &error]; + + Bookmark *b = (Bookmark *)[NSEntityDescription insertNewObjectForEntityForName: @"Bookmark" inManagedObjectContext: _moc]; + + [b setName: [url lastPathComponent]]; + [b setDictionary: dict]; + //[b setData: data]; + [b setMachine: [dict objectForKey: @"machine"]]; + [b setCreated: now]; + } + + // default... + + url = [url URLByAppendingPathComponent: @".Default"]; + NSDictionary *dict = [NSDictionary dictionaryWithContentsOfURL: url]; + if (dict) { + //NSData *data = [NSPropertyListSerialization dataWithPropertyList: dict format: NSPropertyListBinaryFormat_v1_0 options: 0 error: &error]; + + NSString *name = [self uniqueBookmarkName: @"Default"]; + Bookmark *b = (Bookmark *)[NSEntityDescription insertNewObjectForEntityForName: @"Bookmark" inManagedObjectContext: _moc]; + + [b setName: name]; + [b setAutomatic: YES]; + [b setDictionary: dict]; + //[b setData: data]; + [b setMachine: [dict objectForKey: @"machine"]]; + [b setCreated: now]; + + } + + if (![_moc save: &error]) { + NSLog(@"%@", error); + } +} + +-(void)convertLegacyDiskImages { + + NSError *error; + NSURL *sd = SupportDirectory(); + NSURL *url = [sd URLByAppendingPathComponent: @"RecentDiskImages.plist"]; + + NSArray *array = [NSArray arrayWithContentsOfURL: url]; + if (!array) return; + + for (NSDictionary *d in array) { + + NSManagedObject *o = [NSEntityDescription insertNewObjectForEntityForName: @"DiskImage" inManagedObjectContext: _moc]; + [o setValue: [d objectForKey: @"date"] forKey: @"added"]; + [o setValue: [d objectForKey: @"date"] forKey: @"accessed"]; + [o setValue: [d objectForKey: @"path"] forKey: @"path"]; + [o setValue: [d objectForKey: @"size"] forKey: @"size"]; + } + + if (![_moc save: &error]) { + NSLog(@"%@", error); + } } -(NSURL *)bookmarkDirectory { @@ -48,45 +233,59 @@ static BookmarkManager *singleton = nil; 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"]; + NSFetchRequest *req; + NSError *error; + NSArray *array; + Bookmark *b; + + req = [Bookmark fetchRequest]; + [req setPredicate: [NSPredicate predicateWithFormat: @"automatic == TRUE"]]; + array = [_moc executeFetchRequest: req error: &error]; + + b = [array firstObject]; - 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; + return [b dictionary]; + } /* save as .Default */ --(BOOL)saveDefault: (NSDictionary *)bookmark { +-(NSError *)saveDefault: (NSDictionary *)bookmark { + return nil; + +#if 0 + /* check if it already exists */ + + NSFetchRequest *req; + NSError *error; + NSArray *array; + Bookmark *b; + NSDate *now = [NSDate date]; + BOOL ok; + + req = [[NSFetchRequest alloc] initWithEntityName: @"Default"]; + array = [_moc executeFetchRequest: req error: &error]; + + + b = [array firstObject]; + if (b) { + [b setModified: now]; + } else { + b = (Bookmark *)[NSEntityDescription insertNewObjectForEntityForName: @"Default" inManagedObjectContext: _moc]; + + [b setName: @"Default"]; + [b setCreated: now]; + } + [b setDictionary: bookmark]; + [b setMachine: [bookmark objectForKey: @"machine"]]; + + ok = [_moc save: &error]; + if (!ok) NSLog(@"%@", error); + return error; + +#if 0 NSURL *url = [self bookmarkDirectory]; url = [url URLByAppendingPathComponent: @".Default"]; @@ -99,116 +298,291 @@ static BookmarkManager *singleton = nil; ok = [bookmark writeToURL: url atomically: YES]; } return ok; +#endif +#endif } --(BOOL)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name { + +-(NSError *)setAutomatic: (Bookmark *)bookmark { + NSError *error = nil; + NSFetchRequest *req = [Bookmark fetchRequest]; + [req setPredicate: [NSPredicate predicateWithFormat: @"automatic == TRUE"]]; + + NSArray *array = [_moc executeFetchRequest: req error: &error]; + for (Bookmark *b in array) { + if (b != bookmark) [b setAutomatic: NO]; + } + [bookmark setAutomatic: YES]; + if (error) return error; + [_moc save: &error]; + return error; +} + +-(NSError *)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name automatic: (BOOL)automatic { + + NSDate *now = [NSDate date]; 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]; + BOOL ok; + Bookmark *b = (Bookmark *)[NSEntityDescription insertNewObjectForEntityForName: @"Bookmark" inManagedObjectContext: _moc]; + + [b setName: name]; + [b setDictionary: bookmark]; + [b setMachine: [bookmark objectForKey: @"machine"]]; + [b setCreated: now]; + [b setAutomatic: automatic]; + + ok = [b validateForInsert: &error]; if (!ok) { - for (unsigned i = 1 ; i < 100; ++i) { - NSString *tmp = [name stringByAppendingFormat: @" (%d)", i]; - url = [base URLByAppendingPathComponent: tmp]; - - ok = [data writeToURL: url options: NSDataWritingWithoutOverwriting error: &error]; - if (ok) { - name = tmp; - break; - } - } + // will be useful, eg "name is too long" + // keys: NSValidationErrorObject, NSLocalizedDescription, NSValidationErrorKey, NSValidationErrorValue + //NSLog(@"%@", error); + [_moc deleteObject: b]; + return error; } - 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(bookmarkMenu:) 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]; + ok = [_moc save: &error]; + if (!ok) { + //NSLog(@"%@", error); + [_moc deleteObject: b]; + error = [NSError errorWithDomain: @"Ample" code: 0 userInfo: @{ NSLocalizedDescriptionKey: @"Duplicate name" }]; + return error; } - return YES; + if (automatic) { + [self setAutomatic: b]; + } + + + return nil; } --(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; + NSSortDescriptor *s = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: YES selector: @selector(caseInsensitiveCompare:)]; - 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; + _items = [NSArrayController new]; + [_items setManagedObjectContext: _moc]; + [_items setAvoidsEmptySelection: NO]; + [_items setAutomaticallyPreparesContent: YES]; + [_items setAutomaticallyRearrangesObjects: YES]; + [_items setEntityName: @"Bookmark"]; + [_items setSortDescriptors: @[ s ]]; + + [_items fetch: nil]; } --(void)updateMenu { + +/* extract the number from a trailing " (%d)" */ +static int extract_number(NSString *s, NSInteger offset) { - NSArray *menus = [_menu itemArray]; + unichar buffer[32]; + NSInteger len = [s length] - offset; + unichar c; + int i; + int n = 0; + + if (len < 4) return -1; /* " (1)"*/ + if (len > 8) return -1; /* " (99999)" */ + + NSRange r = NSMakeRange(offset, len); + [s getCharacters: buffer range: r]; + + buffer[len] = 0; + i = 0; + if (buffer[i++] != ' ') return -1; + if (buffer[i++] != '(') return -1; + + c = buffer[i++]; + if (c < '1' || c > '9') return -1; + n = c - '0'; + + for (;;) { + c = buffer[i]; + if (c < '0' || c > '9') break; + n = n * 10 + (c - '0'); + ++i; + } + + if (buffer[i++] != ')') return -1; + if (buffer[i++] != 0) return -1; + + return n; +} + + +-(NSString *)uniqueBookmarkName: (NSString *)name { + + NSInteger length = [name length]; + + NSError *error = nil; + NSPredicate *p = [NSPredicate predicateWithFormat: @"name BEGINSWITH %@", name]; + NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName: @"Bookmark"]; + [req setPredicate: p]; + + NSArray *array = [_moc executeFetchRequest: req error: &error]; + if (![array count]) return name; + + uint64_t bits = 1; /* mark 0 as unavailable */ + NSInteger max = 0; + BOOL exact = NO; + for (Bookmark *b in array) { + NSString *s = [b name]; + if ([name isEqualToString: s]) { + exact = YES; + continue; + } + int n = extract_number(s, length); + if (n < 1) continue; + if (n > max) max = n; + if (n < 64) + bits |= (1 << n); + } + if (!exact) return name; + + if (bits == (uint64_t)-1) { + return [name stringByAppendingFormat: @" (%u)", (int)(max + 1)]; + } + +#if 1 + int ix = 0; + while (bits & 0x01) { + ++ix; + bits >>= 1; + } +#else + // this doesn't work correctly. + int ix = __builtin_ffsll(~bits); +#endif + return [name stringByAppendingFormat: @" (%u)", ix]; + + +} + + +-(BOOL)addDiskImage: (NSObject *)pathOrURL { + + NSError *error; + + NSString *path = nil; + NSURL *url = nil; + if ([pathOrURL isKindOfClass: [NSString class]]) { + path = (NSString *)pathOrURL; + } else if ([pathOrURL isKindOfClass: [NSURL class]]){ + url = (NSURL *)pathOrURL; + + path = [NSString stringWithCString: [url fileSystemRepresentation] encoding: NSUTF8StringEncoding]; + } + if (!path) return NO; + + NSFileManager *fm = [NSFileManager defaultManager]; + + + NSDictionary *attr = [fm attributesOfItemAtPath: path error: &error]; + if (error) { + NSLog(@"%@ : %@", path, error); + return NO; + } + + NSNumber *size = [attr objectForKey: NSFileSize]; + + NSDate *now = [NSDate date]; + + NSPredicate *p = [NSPredicate predicateWithFormat: @"path = %@", path]; + NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName: @"DiskImage"]; + [req setPredicate: p]; + + + NSArray *array = [_moc executeFetchRequest: req error: &error]; + BOOL found = 0; + for (NSManagedObject *o in array) { + found = YES; + [o setValue: now forKey: @"accessed"]; + } + if (found) return NO; + + DiskImage *o = [NSEntityDescription insertNewObjectForEntityForName: @"DiskImage" inManagedObjectContext: _moc]; + + + [o setPath: path]; + [o setAdded: now]; + [o setAccessed: now]; + [o setSize: [size longLongValue]]; + [o updatePath]; + + if (![_moc save: &error]) { + NSLog(@"%@", error); + [_moc deleteObject: o]; + } + + return YES; +} + +-(void)diskImageAdded: (NSNotification *)notification { + + NSURL *url = [notification object]; + if (url) [self addDiskImage: url]; +} + +static NSString *kMenuContext = @""; + +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if (context == (__bridge void * _Nullable)(kMenuContext)) { + + //NSLog(@"observeValueForKeyPath %@", keyPath); + + _newMenuGeneration++; + + return; + } + + [super observeValueForKeyPath: keyPath ofObject: object change: change context: context]; +} + +-(void)initMenus { + + if (!_items) { + [self loadBookmarks]; + [_items addObserver: self forKeyPath: @"arrangedObjects.name" options: 0 context: (__bridge void * _Nullable)(kMenuContext)]; + [_items addObserver: self forKeyPath: @"arrangedObjects.automatic" options: 0 context: (__bridge void * _Nullable)(kMenuContext)]; + } + +} + +-(IBAction)bookmarkMenu:(id)sender +{ +} + +-(void)menuNeedsUpdate:(NSMenu *)menu { + + if (_currentMenuGeneration == _newMenuGeneration) return; + _currentMenuGeneration = _newMenuGeneration; + + + 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]; + + NSArray *array = [_items arrangedObjects]; + for (Bookmark *b in array) { - NSMenuItem *item = [_menu addItemWithTitle: title action: @selector(bookmarkMenu:) keyEquivalent: @""]; - [item setRepresentedObject: url]; + NSString *title = [b name]; + NSMenuItem *item = [menu addItemWithTitle: title action: @selector(bookmarkMenu:) keyEquivalent: @""]; + [item setRepresentedObject: b]; [item setTag: 0xdeadbeef]; + if ([b automatic]) { + + [item setOnStateImage: [NSImage imageNamed: NSImageNameStatusAvailable]]; + [item setState: NSOnState]; + } + //if ([b automatic]) [item setAttributedTitle: ItalicMenuString([b name])]; + //[item setState: [b automatic] ? NSMixedState : NSOffState]; } + } @end diff --git a/Ample/BookmarkWindowController.h b/Ample/BookmarkWindowController.h new file mode 100644 index 0000000..a7c6e2b --- /dev/null +++ b/Ample/BookmarkWindowController.h @@ -0,0 +1,19 @@ +// +// BookmarkWindowController.h +// Ample +// +// Created by Kelvin Sherlock on 2/6/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface BookmarkWindowController : NSWindowController + ++(instancetype)sharedInstance; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Ample/BookmarkWindowController.m b/Ample/BookmarkWindowController.m new file mode 100644 index 0000000..bdd6102 --- /dev/null +++ b/Ample/BookmarkWindowController.m @@ -0,0 +1,170 @@ +// +// BookmarkWindowController.m +// Ample +// +// Created by Kelvin Sherlock on 2/6/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// + +#import "BookmarkWindowController.h" +#import "BookmarkManager.h" +#import "Bookmark.h" +#import "Ample.h" + + + +@interface BookmarkWindowController () +@property (strong) IBOutlet NSArrayController *arrayController; +@property (strong) IBOutlet BookmarkManager *bookmarkManager; + +@property (weak) IBOutlet NSTableView *tableView; + +@end + +@implementation BookmarkWindowController + + ++(instancetype)sharedInstance { + static BookmarkWindowController *me = nil; + if (!me) { + me = [self new]; + } + return me; +} + +-(NSString *)windowNibName { + return @"BookmarkWindow"; +} + + +- (void)windowDidLoad { + [super windowDidLoad]; + + NSSortDescriptor *s = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: YES selector: @selector(caseInsensitiveCompare:)]; + + [_arrayController setSortDescriptors: @[s]]; + +} + +-(BOOL)windowShouldClose: (NSWindow *)sender { + + NSManagedObjectContext *moc = [_arrayController managedObjectContext]; + NSError *error; + + if (![_arrayController commitEditing]) return NO; + + if ([moc save: &error]) return YES; + NSLog(@"%@", error); + +#if 0 + NSDictionary *dict = [error userInfo]; + NSArray *array = [dict objectForKey: @"conflictList"]; + for (NSConstraintConflict *c in array) { + + NSArray * arr = [c conflictingObjects]; + for (NSManagedObject *o in arr) { + + } + } +#endif + return YES; + + //[self presentError: error]; + //return NO; +} + +-(void)keyDown:(NSEvent *)event { + /* Carbon/Events.h */ + enum { + kVK_Delete = 0x33, + kVK_ForwardDelete = 0x75, + + }; + unsigned short keyCode = [event keyCode]; + + if (keyCode == kVK_Delete || keyCode == kVK_ForwardDelete) { + + // arraycontroller selected object / selected index doesn't work right. + + NSInteger row = [_tableView selectedRow]; + if (row >= 0) + [_arrayController removeObjectAtArrangedObjectIndex: row]; + + } +} + +-(Bookmark *)clickedItem { + + NSArray *array = [_arrayController arrangedObjects]; + NSInteger row = [_tableView clickedRow]; + if (row < 0 || row >= [array count]) return nil; + return [array objectAtIndex: row]; +} + +-(IBAction)doubleClick:(id)sender { + + Bookmark *b = [self clickedItem]; + if (!b) return; + + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + + [nc postNotificationName: kNotificationBookmarkMagicRoute object: b]; +} + +-(IBAction)toggleDefault:(id)sender { + NSLog(@"%@", sender); + + +} + +-(IBAction)setDefault:(id)sender { + + Bookmark *b = [self clickedItem]; + if (!b) return; + + [_bookmarkManager setAutomatic: b]; +} + +-(IBAction)clearDefault:(id)sender { + + Bookmark *b = [self clickedItem]; + if (!b) return; + + [b setAutomatic: NO]; +} + + +-(IBAction)deleteBookmark:(id)sender { + + //Bookmark *b = [self clickedItem]; + //if (!b) return; + + NSInteger row = [_tableView clickedRow]; + if (row >= 0) + [_arrayController removeObjectAtArrangedObjectIndex: row]; +} + +@end + +@implementation BookmarkWindowController (Menu) + +-(BOOL)validateMenuItem:(NSMenuItem *)menuItem { + + Bookmark *b = [self clickedItem]; + + if (!b) return NO; + SEL action = [menuItem action]; + + if (action == @selector(clearDefault:)) { + return [b automatic]; + } + + if (action == @selector(setDefault:)) { + return ![b automatic]; + } + + + return YES; +} + +@end diff --git a/Ample/Core Data/Ample.xcdatamodeld/Ample.xcdatamodel/contents b/Ample/Core Data/Ample.xcdatamodeld/Ample.xcdatamodel/contents new file mode 100644 index 0000000..03b419e --- /dev/null +++ b/Ample/Core Data/Ample.xcdatamodeld/Ample.xcdatamodel/contents @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Ample/Core Data/Bookmark+CoreDataClass.h b/Ample/Core Data/Bookmark+CoreDataClass.h new file mode 100644 index 0000000..0c7aa82 --- /dev/null +++ b/Ample/Core Data/Bookmark+CoreDataClass.h @@ -0,0 +1,25 @@ +// +// Bookmark+CoreDataClass.h +// Ample +// +// Created by Kelvin Sherlock on 2/6/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface Bookmark : NSManagedObject + +@property NSDictionary *dictionary; + ++(NSString *)uniqueName: (NSString *)name inContext: (NSManagedObjectContext *)context; + +@end + +NS_ASSUME_NONNULL_END + +#import "Bookmark+CoreDataProperties.h" diff --git a/Ample/Core Data/Bookmark+CoreDataClass.m b/Ample/Core Data/Bookmark+CoreDataClass.m new file mode 100644 index 0000000..21a2ec2 --- /dev/null +++ b/Ample/Core Data/Bookmark+CoreDataClass.m @@ -0,0 +1,175 @@ +// +// Bookmark+CoreDataClass.m +// Ample +// +// Created by Kelvin Sherlock on 2/6/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// +// + +#import "Bookmark+CoreDataClass.h" + +@implementation Bookmark + +/* extract the number from a trailing " (%d)" */ +static int extract_number(NSString *s, NSInteger offset) { + + unichar buffer[32]; + NSInteger len = [s length] - offset; + unichar c; + int i; + int n = 0; + + if (len < 4) return -1; /* " (1)"*/ + if (len > 6) return -1; /* " (999)" */ + + NSRange r = NSMakeRange(offset, len); + [s getCharacters: buffer range: r]; + + buffer[len] = 0; + i = 0; + if (buffer[i++] != ' ') return -1; + if (buffer[i++] != '(') return -1; + + c = buffer[i++]; + if (c < '1' || c > '9') return -1; + n = c - '0'; + + for (;;) { + c = buffer[i]; + if (c < '0' || c > '9') break; + n = n * 10 + (c - '0'); + ++i; + } + + if (buffer[i++] != ')') return -1; + if (buffer[i++] != 0) return -1; + + return n; +} + ++(NSString *)uniqueName: (NSString *)name inContext: (NSManagedObjectContext *)context { + + NSInteger length = [name length]; + + NSError *error = nil; + NSPredicate *p = [NSPredicate predicateWithFormat: @"name BEGINSWITH %@", name]; + NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName: @"Bookmark"]; + [req setPredicate: p]; + + NSArray *array = [context executeFetchRequest: req error: &error]; + if (![array count]) return name; + + uint64_t bits = 1; /* mark 0 as unavailable */ + NSInteger max = 0; + BOOL exact = NO; + for (Bookmark *b in array) { + NSString *s = [b name]; + if ([name isEqualToString: s]) { + exact = YES; + continue; + } + int n = extract_number(s, length); + if (n < 1) continue; + if (n > max) max = n; + if (n < 64) + bits |= (1 << n); + } + if (!exact) return name; + + if (bits == (uint64_t)-1) { + if (max == 999) return nil; + return [name stringByAppendingFormat: @" (%u)", (int)(max + 1)]; + } + +#if 1 + int ix = 0; + while (bits) { + ++ix; + bits >>= 1; + } +#else + // this doesn't work correctly. + int ix = __builtin_ffsll(~bits); +#endif + return [name stringByAppendingFormat: @" (%u)", ix]; + +} + +-(void)setDictionary:(NSDictionary *)dictionary { + + NSData *data; + NSError *error = nil; + + data = [NSPropertyListSerialization dataWithPropertyList: dictionary + format: NSPropertyListBinaryFormat_v1_0 + options: 0 + error: &error]; + + [self setData: data]; +} + +-(NSDictionary *)dictionary { + +// NSDictionary *dict; + NSData *data = [self data]; + NSError *error = nil; + + return [NSPropertyListSerialization propertyListWithData: data + options: 0 + format: nil + error: &error]; +} + + +- (NSError *)errorFromOriginalError:(NSError *)originalError error:(NSError*)secondError +{ + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + NSMutableArray *errors = [NSMutableArray arrayWithObject:secondError]; + if ([originalError code] == NSValidationMultipleErrorsError) { + [userInfo addEntriesFromDictionary:[originalError userInfo]]; + [errors addObjectsFromArray:[userInfo objectForKey:NSDetailedErrorsKey]]; + } else { + [errors addObject:originalError]; + } + [userInfo setObject:errors forKey:NSDetailedErrorsKey]; + return [NSError errorWithDomain:NSCocoaErrorDomain code:NSValidationMultipleErrorsError userInfo:userInfo]; +} + +- (BOOL)validateName:(id*)ioValue error:(NSError**)outError { + + if (!ioValue || !*ioValue) return YES; + NSString *name = *ioValue; + + NSFetchRequest *frq = [NSFetchRequest fetchRequestWithEntityName: @"Bookmark"]; + + NSPredicate *p = [NSPredicate predicateWithFormat: @"name = %@", name]; + [frq setPredicate: p]; + + NSArray * arr = [[self managedObjectContext] executeFetchRequest: frq error: nil]; + BOOL dupe = NO; + for (Bookmark *b in arr) { + if (b == self) continue; + dupe = YES; + break; + } + if (dupe && outError) { + NSDictionary *dict = @{ NSLocalizedFailureReasonErrorKey: @"duplicate name", + NSLocalizedDescriptionKey: @"duplicate name", + NSValidationKeyErrorKey: @"name", + NSValidationValueErrorKey: name, + NSValidationObjectErrorKey: self + }; + NSError *e = [NSError errorWithDomain: @"Ample" code: 1 userInfo: dict]; + + if (*outError) { + *outError = [self errorFromOriginalError: *outError error: e]; + } else { + *outError = e; + } + } + return !dupe; +} + + +@end diff --git a/Ample/Core Data/Bookmark+CoreDataProperties.h b/Ample/Core Data/Bookmark+CoreDataProperties.h new file mode 100644 index 0000000..958a38f --- /dev/null +++ b/Ample/Core Data/Bookmark+CoreDataProperties.h @@ -0,0 +1,28 @@ +// +// Bookmark+CoreDataProperties.h +// Ample +// +// Created by Kelvin Sherlock on 2/6/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// +// + +#import "Bookmark+CoreDataClass.h" + + +NS_ASSUME_NONNULL_BEGIN + +@interface Bookmark (CoreDataProperties) + ++ (NSFetchRequest *)fetchRequest; + +@property (nullable, nonatomic, copy) NSString *name; +@property (nullable, nonatomic, copy) NSString *machine; +@property (nullable, nonatomic, retain) NSData *data; +@property (nullable, nonatomic, copy) NSDate *created; +@property (nullable, nonatomic, copy) NSDate *modified; +@property (nullable, nonatomic, copy) NSString *comment; +@property (nonatomic) BOOL automatic; +@end + +NS_ASSUME_NONNULL_END diff --git a/Ample/Core Data/Bookmark+CoreDataProperties.m b/Ample/Core Data/Bookmark+CoreDataProperties.m new file mode 100644 index 0000000..8e25c8b --- /dev/null +++ b/Ample/Core Data/Bookmark+CoreDataProperties.m @@ -0,0 +1,26 @@ +// +// Bookmark+CoreDataProperties.m +// Ample +// +// Created by Kelvin Sherlock on 2/6/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// +// + +#import "Bookmark+CoreDataProperties.h" + +@implementation Bookmark (CoreDataProperties) + ++ (NSFetchRequest *)fetchRequest { + return [NSFetchRequest fetchRequestWithEntityName:@"Bookmark"]; +} + +@dynamic name; +@dynamic machine; +@dynamic data; +@dynamic created; +@dynamic modified; +@dynamic comment; +@dynamic automatic; + +@end diff --git a/Ample/Core Data/DiskImage+CoreDataClass.h b/Ample/Core Data/DiskImage+CoreDataClass.h new file mode 100644 index 0000000..a72c11e --- /dev/null +++ b/Ample/Core Data/DiskImage+CoreDataClass.h @@ -0,0 +1,21 @@ +// +// DiskImage+CoreDataClass.h +// Ample +// +// Created by Kelvin Sherlock on 2/7/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface DiskImage : NSManagedObject + +@end + +NS_ASSUME_NONNULL_END + +#import "DiskImage+CoreDataProperties.h" diff --git a/Ample/Core Data/DiskImage+CoreDataClass.m b/Ample/Core Data/DiskImage+CoreDataClass.m new file mode 100644 index 0000000..3665405 --- /dev/null +++ b/Ample/Core Data/DiskImage+CoreDataClass.m @@ -0,0 +1,14 @@ +// +// DiskImage+CoreDataClass.m +// Ample +// +// Created by Kelvin Sherlock on 2/7/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// +// + +#import "DiskImage+CoreDataClass.h" + +@implementation DiskImage + +@end diff --git a/Ample/Core Data/DiskImage+CoreDataProperties.h b/Ample/Core Data/DiskImage+CoreDataProperties.h new file mode 100644 index 0000000..ead1cc1 --- /dev/null +++ b/Ample/Core Data/DiskImage+CoreDataProperties.h @@ -0,0 +1,29 @@ +// +// DiskImage+CoreDataProperties.h +// Ample +// +// Created by Kelvin Sherlock on 2/7/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// +// + +#import "DiskImage+CoreDataClass.h" + + +NS_ASSUME_NONNULL_BEGIN + +@interface DiskImage (CoreDataProperties) + ++ (NSFetchRequest *)fetchRequest; + +@property (nullable, nonatomic, copy) NSString *path; +@property (nullable, nonatomic, copy) NSDate *added; +@property (nonatomic) int64_t size; +@property (nullable, nonatomic, copy) NSDate *accessed; +@property (nullable, nonatomic, copy) NSString *name; + +-(void)updatePath; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Ample/Core Data/DiskImage+CoreDataProperties.m b/Ample/Core Data/DiskImage+CoreDataProperties.m new file mode 100644 index 0000000..b952ee2 --- /dev/null +++ b/Ample/Core Data/DiskImage+CoreDataProperties.m @@ -0,0 +1,52 @@ +// +// DiskImage+CoreDataProperties.m +// Ample +// +// Created by Kelvin Sherlock on 2/7/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// +// + +#import "DiskImage+CoreDataProperties.h" + +#if 0 +@interface DiskImage () { + NSString *_name; +} +@end +#endif + +@implementation DiskImage (CoreDataProperties) + ++ (NSFetchRequest *)fetchRequest { + return [NSFetchRequest fetchRequestWithEntityName:@"DiskImage"]; +} + +@dynamic path; +@dynamic added; +@dynamic size; +@dynamic accessed; +@dynamic name; + +-(void)updatePath { + + NSString *path = [self primitiveValueForKey: @"path"]; + [self setName: [path lastPathComponent]]; +} + +-(void)awakeFromFetch { + [super awakeFromFetch]; + + [self updatePath]; +} + +#if 0 +-(void)awakeFromInsert { + [super awakeFromInsert]; + + NSString *path = [self primitiveValueForKey: @"path"]; + [self setName: [path lastPathComponent]]; +} +#endif + +@end diff --git a/Ample/DiskImage.h b/Ample/DiskImage.h new file mode 100644 index 0000000..73d0356 --- /dev/null +++ b/Ample/DiskImage.h @@ -0,0 +1,14 @@ +// +// DiskImage.h +// Ample +// +// Created by Kelvin Sherlock on 2/7/2022. +// Copyright © 2022 Kelvin Sherlock. All rights reserved. +// + +#ifndef DiskImage_h +#define DiskImage_h + +#import "DiskImage+CoreDataClass.h" + +#endif /* DiskImage_h */ diff --git a/Ample/DiskImagesWindowController.m b/Ample/DiskImagesWindowController.m index 80402d8..e8b2e7e 100644 --- a/Ample/DiskImagesWindowController.m +++ b/Ample/DiskImagesWindowController.m @@ -9,19 +9,18 @@ #import "DiskImagesWindowController.h" #import "TableCellView.h" #import "Ample.h" +#import "DiskImage.h" + +#import "BookmarkManager.h" @interface DiskImagesWindowController () @property (weak) IBOutlet NSTableView *tableView; @property (strong) IBOutlet NSArrayController *arrayController; -@property (strong) NSMutableArray *content; @end @implementation DiskImagesWindowController { - BOOL _dirty; NSSet *_extensions; - NSTimer *_timer; - } +(instancetype)sharedInstance { @@ -44,7 +43,7 @@ if ((self = [super init])) { - [self loadRecentDiskImages]; + //[self loadRecentDiskImages]; _extensions = [NSSet setWithObjects: @"2img", @"2mg", @"chd", @"dc", @"do", @"dsk", @"hd", @"hdv", @"image", @"nib", @"po", @"wav", @"woz", @"iso", @"raw", nil @@ -59,9 +58,6 @@ - (void)windowDidLoad { - if (!_content) - [self setContent: [NSMutableArray new]]; - [super windowDidLoad]; NSWindow *window = [self window]; [window setRestorable: YES]; @@ -75,8 +71,12 @@ [_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. + + NSSortDescriptor *s = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: YES selector: @selector(caseInsensitiveCompare:)]; + [_arrayController setSortDescriptors: @[ s ]]; } +#if 0 -(void)loadRecentDiskImages { // NSError *error; @@ -102,14 +102,16 @@ _timer = nil; [self saveFile]; } +#endif -(void)diskImageAdded: (NSNotification *)notification { NSURL *url = [notification object]; if (!url) return; - [self addFile: url]; + //[self addFile: url]; } +#if 0 -(void)markDirty { _dirty = YES; if (_timer) [_timer invalidate]; @@ -124,6 +126,7 @@ #endif } + -(void)saveFile { [_timer invalidate]; @@ -147,10 +150,11 @@ [self saveFile]; } +#endif - +#if 0 -(BOOL)addFile: (NSObject *)pathOrURL { NSString *path = nil; @@ -198,18 +202,20 @@ [NSDate new], @"date", nil]; +#if 0 @synchronized (self) { if (_arrayController) [_arrayController addObject: d]; else [_content addObject: d]; } +#endif [self markDirty]; return YES; } - --(NSMutableDictionary *)clickedItem { +#endif +-(DiskImage *)clickedItem { NSArray *array = [_arrayController arrangedObjects]; NSInteger row = [_tableView clickedRow]; @@ -218,11 +224,21 @@ } #pragma mark - IBActions +- (IBAction)filter:(id)sender { + NSString *text = [sender stringValue]; + NSPredicate *p = nil; + if ([text length]) { + p = [NSPredicate predicateWithFormat: @"name CONTAINS[cd] %@",text]; + } + + [_arrayController setFilterPredicate: p]; +} + - (IBAction)showInFinder:(id)sender { - NSMutableDictionary *item = [self clickedItem]; + DiskImage *item = [self clickedItem]; if (!item) return; - NSString *path = [item objectForKey: @"path"]; + NSString *path = [item path]; NSURL *url = [NSURL fileURLWithPath: path]; if (!url) return; @@ -233,27 +249,19 @@ - (IBAction)eject:(id)sender { - NSMutableDictionary *item = [self clickedItem]; + DiskImage *item = [self clickedItem]; if (!item) return; - @synchronized (self) { - - if (_arrayController) { - [_arrayController removeObject: item]; - } else { - [_content removeObject: item]; - } - [self markDirty]; - } - + [_arrayController removeObject: item]; } -(IBAction)doubleClick: (id)sender { - NSDictionary *d = [self clickedItem]; + DiskImage *d = [self clickedItem]; NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName: kNotificationDiskImageMagicRoute object: nil userInfo: d]; + NSDictionary *userInfo = @{ @"path": [d path] }; + [nc postNotificationName: kNotificationDiskImageMagicRoute object: nil userInfo: userInfo]; } @end @@ -265,9 +273,9 @@ id objects = [_arrayController arrangedObjects]; - NSDictionary *d = [objects objectAtIndex: row]; - - NSString *path = [d objectForKey: @"path"]; + DiskImage *d = [objects objectAtIndex: row]; + if (!d) return nil; + NSString *path = [d path]; NSURL *url = [NSURL fileURLWithPath: path]; return url; @@ -304,6 +312,8 @@ -(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation { + BookmarkManager *bm = [BookmarkManager sharedManager]; + if ([info draggingSource] == _tableView) return NO; NSPasteboard * pb = [info draggingPasteboard]; @@ -322,7 +332,9 @@ if (!s) continue; NSURL *url = [NSURL URLWithString: s]; if (!url) continue; - ok |= [self addFile: url]; + + ok |= [bm addDiskImage: url]; + //ok |= [self addFile: url]; } return ok; } diff --git a/Ample/DownloadWindowController.m b/Ample/DownloadWindowController.m index 4126184..b92bf95 100644 --- a/Ample/DownloadWindowController.m +++ b/Ample/DownloadWindowController.m @@ -81,6 +81,7 @@ enum { @interface DownloadItem : NSObject +@property NSString *value; @property NSString *name; @property NSError *error; @property NSString *pathName; @@ -208,7 +209,7 @@ enum { NSURL *url = [bundle URLForResource: @"roms" withExtension: @"plist"]; - NSDictionary *d = [NSDictionary dictionaryWithContentsOfURL: url]; + NSArray *roms = [NSArray arrayWithContentsOfURL: url]; NSURL *sd = SupportDirectory(); @@ -232,7 +233,6 @@ enum { [self initializeExtensionMenu]; - NSArray *roms = [d objectForKey: @"roms"]; [self setCurrentROM: @""]; [self setCurrentCount: 0]; [self setTotalCount: [roms count]]; @@ -241,10 +241,11 @@ enum { NSMutableArray *tmp = [NSMutableArray arrayWithCapacity: [roms count]]; unsigned ix = 0; - for (NSString *name in roms) { + for (NSDictionary *d in roms) { DownloadItem *item = [DownloadItem new]; - [item setName: name]; + [item setValue: [d objectForKey: @"value"]]; + [item setName: [d objectForKey: @"description"]]; [item setIndex: ix++]; [tmp addObject: item]; @@ -292,7 +293,7 @@ enum { } NSURLSessionDownloadTask *task; - NSString *s = [item name]; + NSString *s = [item value]; NSString *path = [s stringByAppendingPathExtension: _downloadExtension]; NSURL *url = [_downloadURL URLByAppendingPathComponent: path]; @@ -313,7 +314,7 @@ enum { for (DownloadItem *item in _items) { NSURLSessionDownloadTask *task; - NSString *s = [item name]; + NSString *s = [item value]; NSString *path = [s stringByAppendingPathExtension: _downloadExtension]; NSURL *url = [_downloadURL URLByAppendingPathComponent: path]; @@ -421,8 +422,8 @@ enum { NSFileManager *fm = [NSFileManager defaultManager]; for (DownloadItem *item in _items) { - NSString *name = [item name]; - NSString *s = [romdir stringByAppendingPathComponent: name]; + NSString *value = [item value]; + NSString *s = [romdir stringByAppendingPathComponent: value]; NSString *path; path = [s stringByAppendingPathExtension: @"zip"]; if ([fm fileExistsAtPath: path]) { diff --git a/Ample/Info.plist b/Ample/Info.plist index 96cba56..08243ac 100644 --- a/Ample/Info.plist +++ b/Ample/Info.plist @@ -58,7 +58,7 @@ NSSupportsAutomaticTermination NSSupportsSuddenTermination - + SUFeedURL https://ample.ksherlock.com/updates/appcast.xml SUPublicEDKey diff --git a/Ample/LaunchWindowController.m b/Ample/LaunchWindowController.m index 0d8cf39..04a99ed 100644 --- a/Ample/LaunchWindowController.m +++ b/Ample/LaunchWindowController.m @@ -16,6 +16,7 @@ #import "AutocompleteControl.h" #import "SoftwareList.h" #import "BookmarkManager.h" +#import "Bookmark.h" #include #include @@ -79,10 +80,13 @@ static NSString *kContextMachine = @"kContextMachine"; @property (strong) IBOutlet NSWindow *addBookmarkWindow; @property (strong) NSString *bookmarkName; +@property BOOL bookmarkDefault; @property (weak) IBOutlet NSTextField *bookmarkTextField; +@property (weak) IBOutlet NSTextField *bookmarkErrorField; @property BOOL optionKey; + @end @interface LaunchWindowController (SoftwareList) @@ -98,6 +102,8 @@ static NSString *kContextMachine = @"kContextMachine"; -(IBAction)defaultLoad:(id)sender; +-(void)bookmarkNotification: (NSNotification *)notification; + @end #define SIZEOF(x) (sizeof(x) / sizeof(x[0])) @@ -207,9 +213,9 @@ static void AddSubview(NSView *parent, NSView *child) { AddSubview(_mediaView, [_mediaController view]); AddSubview(_machineView, [_machineViewController view]); - - // can't be done until above views are set up. - [self defaultLoad: nil]; + + [_softwareListControl setMinWidth: 250]; + [_softwareListControl setHidden: YES]; NSArray *keys = @[ @@ -240,10 +246,17 @@ static void AddSubview(NSView *parent, NSView *child) { [_machineViewController addObserver: self forKeyPath: @"machine" options: 0 context: (__bridge void * _Nullable)kContextMachine]; - [_softwareListControl setMinWidth: 250]; - [_softwareListControl setHidden: YES]; + + + // can't be done until above views are set up. + [self defaultLoad: nil]; + [self buildCommandLine]; + + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + + [nc addObserver: self selector: @selector(bookmarkNotification:) name: kNotificationBookmarkMagicRoute object: nil]; } @@ -765,11 +778,14 @@ static NSString *ShellQuote(NSString *s) { -(IBAction)defaultSave:(id)sender { + #if 0 + BookmarkManager *bm = [BookmarkManager sharedManager]; NSDictionary *d = [self makeBookmark]; [bm saveDefault: d]; +#endif } -(IBAction)defaultLoad:(id)sender { @@ -790,7 +806,9 @@ static NSString *ShellQuote(NSString *s) { -(IBAction)addBookmark:(id)sender { if (!_machine) return; - + + BookmarkManager *bm = [BookmarkManager sharedManager]; + NSString *name = nil; if (_machineDescription) name = [_machineDescription objectForKey:@"description"]; if (!name) name = _machine; @@ -799,8 +817,14 @@ static NSString *ShellQuote(NSString *s) { if (_software) { name = [name stringByAppendingFormat: @" - %@", [_software title]]; } + + name = [bm uniqueBookmarkName: name]; + [self setBookmarkName: name]; + [self setBookmarkDefault: NO]; [_bookmarkTextField selectText: nil]; + [_bookmarkErrorField setStringValue: @""]; + [[self window] beginSheet: _addBookmarkWindow completionHandler: nil]; } @@ -810,19 +834,27 @@ static NSString *ShellQuote(NSString *s) { } -(IBAction)bookmarkSave:(id)sender { - - + BookmarkManager *bm = [BookmarkManager sharedManager]; +#if 0 if (![bm validateName: _bookmarkName]) { [_bookmarkTextField selectText: nil]; NSBeep(); return; } +#endif NSDictionary *d = [self makeBookmark]; + NSError *e; - [bm saveBookmark: d name: _bookmarkName]; + if (( e = [bm saveBookmark: d name: _bookmarkName automatic: _bookmarkDefault])) { + // probably a duplicate name... + [_bookmarkTextField selectText: nil]; + [_bookmarkErrorField setStringValue: [e localizedDescription]]; + NSBeep(); + return; + } [[self window] endSheet: _addBookmarkWindow]; [_addBookmarkWindow orderOut: nil]; @@ -830,14 +862,26 @@ static NSString *ShellQuote(NSString *s) { } +-(void)bookmarkNotification: (NSNotification *)notification { + + Bookmark *b = [notification object]; + NSDictionary *d = [b dictionary]; + + [self loadBookmark: d]; +} + -(IBAction)bookmarkMenu:(id)sender { +#if 0 NSURL *url = [sender representedObject]; if (!url) return; NSDictionary *d = [NSDictionary dictionaryWithContentsOfURL: url]; if (!d) return; // oops... +#endif + // represented object is a Bookmark. + NSDictionary *d = [(Bookmark *)[sender representedObject] dictionary]; [self loadBookmark: d]; } diff --git a/Ample/Media.h b/Ample/Media.h index 407acc5..4a72da1 100644 --- a/Ample/Media.h +++ b/Ample/Media.h @@ -21,6 +21,7 @@ typedef struct Media { unsigned midiin; unsigned midiout; unsigned picture; + uint64_t floppy_mask; } Media; diff --git a/Ample/Media.m b/Ample/Media.m index 4365511..22b76be 100644 --- a/Ample/Media.m +++ b/Ample/Media.m @@ -35,6 +35,12 @@ void MediaAdd(Media *dest, const Media *src) { if (!src || !dest) return; + // could merge from src media but not currently set there. + + unsigned count; + unsigned flops = dest->floppy_5_25 + dest->floppy_3_5; + + #define _(name) dest->name += src->name; _(cass); _(cdrom); @@ -47,6 +53,16 @@ void MediaAdd(Media *dest, const Media *src) { _(midiout); _(picture); #undef _ + + + if ((count = src->floppy_5_25)) { + uint64_t bits = (1 << count) - 1; + //dest->floppy_mask <<= count; + bits <<= flops; + dest->floppy_mask |= bits; + } + + } BOOL MediaEqual(const Media *lhs, const Media *rhs) { @@ -66,6 +82,8 @@ BOOL MediaEqual(const Media *lhs, const Media *rhs) { _(midiout); _(picture); + _(floppy_mask); + return YES; #undef _ } diff --git a/Ample/MediaViewController.m b/Ample/MediaViewController.m index b7b0ccf..e106c17 100644 --- a/Ample/MediaViewController.m +++ b/Ample/MediaViewController.m @@ -352,24 +352,43 @@ static_assert(SIZEOF(prefix) == CATEGORY_COUNT, "Missing item"); NSMutableArray *args = [NSMutableArray new]; - unsigned counts[CATEGORY_COUNT] = { 0 }; - + //unsigned counts[CATEGORY_COUNT] = { 0 }; + for (unsigned j = 0; j < CATEGORY_COUNT; ++j) { + uint64_t floppy_mask = _media.floppy_mask; + unsigned index = 0; + MediaCategory *cat = _data[j]; NSInteger valid = [cat validCount]; for (NSInteger i = 0; i < valid; ++i) { - counts[j]++; MediaItem *item = [cat objectAtIndex: i]; NSString *arg = [item argument]; - if (arg) { - [args addObject: [NSString stringWithFormat: @"-%s%u", prefix[j], counts[j]]]; - [args addObject: arg]; + + if (j == kIndexFloppy525) { + // assumes < 64 floppies.... + // infinite loop if no floppy device... + if (floppy_mask == 0) break; + while ((floppy_mask & 0x01) == 0) { + floppy_mask >>= 1; + ++index; + } + } else if (j == kIndexFloppy35) { + while ((floppy_mask & 0x01)) { + floppy_mask >>= 1; + ++index; + } } + + ++index; + floppy_mask >>= 1; + if (!arg) continue; + + [args addObject: [NSString stringWithFormat: @"-%s%u", prefix[j], index]]; + [args addObject: arg]; } - if (j == 0) counts[1] = counts[0]; // 3.5/5.25 } [self setArgs: args]; diff --git a/Ample/Resources/ace2200.plist b/Ample/Resources/ace2200.plist index 6b2ce50..da39a23 100644 --- a/Ample/Resources/ace2200.plist +++ b/Ample/Resources/ace2200.plist @@ -148,6 +148,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -756,6 +764,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1366,6 +1382,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -5056,6 +5080,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/apple2e.plist b/Ample/Resources/apple2e.plist index 87c9023..41988c9 100644 --- a/Ample/Resources/apple2e.plist +++ b/Ample/Resources/apple2e.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/apple2ee.plist b/Ample/Resources/apple2ee.plist index 8fba005..013750f 100644 --- a/Ample/Resources/apple2ee.plist +++ b/Ample/Resources/apple2ee.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/apple2eefr.plist b/Ample/Resources/apple2eefr.plist index 15f4848..88649be 100644 --- a/Ample/Resources/apple2eefr.plist +++ b/Ample/Resources/apple2eefr.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/apple2ees.plist b/Ample/Resources/apple2ees.plist index 3228cdb..a0d282a 100644 --- a/Ample/Resources/apple2ees.plist +++ b/Ample/Resources/apple2ees.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/apple2eeuk.plist b/Ample/Resources/apple2eeuk.plist index 650ee30..e80251a 100644 --- a/Ample/Resources/apple2eeuk.plist +++ b/Ample/Resources/apple2eeuk.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/apple2ep.plist b/Ample/Resources/apple2ep.plist index ed31d53..70e6182 100644 --- a/Ample/Resources/apple2ep.plist +++ b/Ample/Resources/apple2ep.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/apple2euk.plist b/Ample/Resources/apple2euk.plist index e314819..eca6134 100644 --- a/Ample/Resources/apple2euk.plist +++ b/Ample/Resources/apple2euk.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/apple2gs.plist b/Ample/Resources/apple2gs.plist index 58ecf02..b33d322 100644 --- a/Ample/Resources/apple2gs.plist +++ b/Ample/Resources/apple2gs.plist @@ -187,6 +187,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -708,6 +716,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1229,6 +1245,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1750,6 +1774,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2271,6 +2303,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2792,6 +2832,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3313,6 +3361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7206,6 +7262,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2uniprint diff --git a/Ample/Resources/apple2gsr0.plist b/Ample/Resources/apple2gsr0.plist index 1435921..367082d 100644 --- a/Ample/Resources/apple2gsr0.plist +++ b/Ample/Resources/apple2gsr0.plist @@ -227,6 +227,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -748,6 +756,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1269,6 +1285,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1790,6 +1814,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2311,6 +2343,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2832,6 +2872,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3353,6 +3401,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7246,6 +7302,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2uniprint diff --git a/Ample/Resources/apple2gsr1.plist b/Ample/Resources/apple2gsr1.plist index b520180..b2f2a2d 100644 --- a/Ample/Resources/apple2gsr1.plist +++ b/Ample/Resources/apple2gsr1.plist @@ -227,6 +227,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -748,6 +756,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1269,6 +1285,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1790,6 +1814,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2311,6 +2343,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2832,6 +2872,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3353,6 +3401,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7246,6 +7302,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2uniprint diff --git a/Ample/Resources/cec2000.plist b/Ample/Resources/cec2000.plist index cf0df9a..8a3a482 100644 --- a/Ample/Resources/cec2000.plist +++ b/Ample/Resources/cec2000.plist @@ -148,6 +148,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -756,6 +764,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1364,6 +1380,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1974,6 +1998,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2582,6 +2614,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -6272,6 +6312,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/cece.plist b/Ample/Resources/cece.plist index c0b8a9b..e117120 100644 --- a/Ample/Resources/cece.plist +++ b/Ample/Resources/cece.plist @@ -148,6 +148,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -756,6 +764,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1364,6 +1380,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1974,6 +1998,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2582,6 +2614,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -6272,6 +6312,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/cecg.plist b/Ample/Resources/cecg.plist index 483153d..1e25b5c 100644 --- a/Ample/Resources/cecg.plist +++ b/Ample/Resources/cecg.plist @@ -148,6 +148,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -756,6 +764,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1364,6 +1380,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1974,6 +1998,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2582,6 +2614,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -6272,6 +6312,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/ceci.plist b/Ample/Resources/ceci.plist index 6f99e19..fcfc078 100644 --- a/Ample/Resources/ceci.plist +++ b/Ample/Resources/ceci.plist @@ -148,6 +148,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -756,6 +764,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1364,6 +1380,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1974,6 +1998,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2582,6 +2614,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -6272,6 +6312,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/cecm.plist b/Ample/Resources/cecm.plist index 539878e..f90bace 100644 --- a/Ample/Resources/cecm.plist +++ b/Ample/Resources/cecm.plist @@ -148,6 +148,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -756,6 +764,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1364,6 +1380,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1974,6 +1998,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2582,6 +2614,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -6272,6 +6312,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/las128ex.plist b/Ample/Resources/las128ex.plist index fe8c638..70dc838 100644 --- a/Ample/Resources/las128ex.plist +++ b/Ample/Resources/las128ex.plist @@ -169,6 +169,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -777,6 +785,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -4682,6 +4698,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/laser128.plist b/Ample/Resources/laser128.plist index 3dab7c8..f3f3a27 100644 --- a/Ample/Resources/laser128.plist +++ b/Ample/Resources/laser128.plist @@ -169,6 +169,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -777,6 +785,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -4682,6 +4698,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/laser128o.plist b/Ample/Resources/laser128o.plist index 70590ae..c0b892d 100644 --- a/Ample/Resources/laser128o.plist +++ b/Ample/Resources/laser128o.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -4642,6 +4658,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/mprof3.plist b/Ample/Resources/mprof3.plist index dd2187f..8357790 100644 --- a/Ample/Resources/mprof3.plist +++ b/Ample/Resources/mprof3.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/prav8c.plist b/Ample/Resources/prav8c.plist index c10e639..74340a9 100644 --- a/Ample/Resources/prav8c.plist +++ b/Ample/Resources/prav8c.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/roms.plist b/Ample/Resources/roms.plist index c16aac8..d6d46bd 100644 --- a/Ample/Resources/roms.plist +++ b/Ample/Resources/roms.plist @@ -1,199 +1,1152 @@ - - roms - - a1cass - a2aevm80 - a2ap16 - a2ap16a - a2aplcrd - a2booti - a2bufgrapplerplus - a2bufgrapplerplusa - a2cffa02 - a2cffa2 - a2corvus - a2diskii - a2diskiing - a2focdrv - a2grappler - a2grapplerplus - a2hsscsi - a2iwm + + + value a2lancegs - a2memexp - a2mouse - a2parprn - a2pdromdr - a2pic - a2q68 - a2q68plus - a2ramfac - a2scsi - a2sd - a2sider1 - a2sider2 - a2ssc - a2suprterm - a2surance - a2swyft - a2thunpl - a2tmstho - a2twarp - a2ultrme - a2ulttrm - a2uniprint - a2vidtrm - a2vtc1 - a2vulcan - a2vulgld - a2vuliie - a2zipdrv - a3fdc - ace100 - ace1000 - ace2200 - ace500 - agat7 - agat7_flop - agat840k_hle - agat9 - agat9_flop - agat_fdc - albert - am100 - am64 - ap2000 - apple1 - apple2 - apple2c - apple2c0 - apple2c3 - apple2c4 - apple2cp - apple2e - apple2ee - apple2eefr - apple2ees - apple2eeuk - apple2ep - apple2euk - apple2gs - apple2gsr0 - apple2gsr0p - apple2gsr0p2 - apple2gsr1 - apple2jp - apple2p - apple3 - aprissi - basis108 - ccs7710 - cec2000 - cece - cecg - ceci - cecm - cffa1 - cga - chessmachine - cmsscsi - comx_pl80 - craft2p - d2fdc - diskii13 - dodo - egret - elppa - ex800 - hkc8800a - ie15_device + description + ///SHH Systeme LANceGS + + + value ie15kbd - ivelultr - kb_ec1841 - kb_iskr1030 - kb_pcxt83 - keytronic_pc3270 - las128e2 - las128ex - laser128 - laser128o - laser2c - lx800 - lx810l - m68705p3 - mac128k - mac2fdhd - mac512k - macclas2 - macclasc - macii - maciici - maciisi - maciivx - mackbd_m0110 - mackbd_m0110a - mackbd_m0110a_f - mackbd_m0110a_j - mackbd_m0110b - mackbd_m0110f - mackbd_m0110t - mackbd_m0120 - mackbd_m0120p - maclc - maclc2 - maclc3 - macplus - macse - macse30 - macsefd - maxxi - microeng - mockingboardd - mprof3 + description + 15WWW-97-006 Keyboard + + + value + am64 + description + AM 64 + + + value + am100 + description + AM100 + + + value + agat840k_hle + description + Agat 840K floppy card + + + value + agat_fdc + description + Agat 840K floppy controller card + + + value + agat7 + description + Agat-7 + + + value + agat7_flop + description + Agat-7 140K floppy card + + + value + agat9 + description + Agat-9 + + + value + agat9_flop + description + Agat-9 140K floppy card + + + value + albert + description + Albert + + + value + apple3 + description + Apple /// + + + value + apple2c + description + Apple //c + + + value + apple2c3 + description + Apple //c (Original Memory Expansion) + + + value + apple2c0 + description + Apple //c (UniDisk 3.5) + + + value + apple2c4 + description + Apple //c (rev 4) + + + value + apple2cp + description + Apple //c Plus + + + value + apple2e + description + Apple //e + + + value + apple2ep + description + Apple //e (Platinum) + + + value + apple2ees + description + Apple //e (Spain) + + + value + apple2euk + description + Apple //e (UK) + + + value + apple2ee + description + Apple //e (enhanced) + + + value + apple2eefr + description + Apple //e (enhanced, France) + + + value + apple2eeuk + description + Apple //e (enhanced, UK) + + + value nb_48gc + description + Apple 4*8 video card + + + value nb_824gc + description + Apple 8*24 video card + + + value + a2iwm + description + Apple Disk II IWM controller + + + value + diskii13 + description + Apple Disk II NG controller (13-sector) + + + value + a2diskiing + description + Apple Disk II NG controller (16-sector) + + + value + a2diskii + description + Apple Disk II controller + + + value + d2fdc + description + Apple Disk II floppy controller + + + value + egret + description + Apple Egret + + + value + apple1 + description + Apple I + + + value + a1cass + description + Apple I cassette board + + + value + a2superdrive + description + Apple II 3.5" Disk Controller Card + + + value + a2hsscsi + description + Apple II High-Speed SCSI Card + + + value + a2memexp + description + Apple II Memory Expansion Card + + + value + a2mouse + description + Apple II Mouse Card + + + value + a2pic + description + Apple II Parallel Interface Card + + + value + a2parprn + description + Apple II Parallel Printer Interface Card + + + value + a2scsi + description + Apple II SCSI Card + + + value + a2sd + description + Apple II SD Card + + + value + a3fdc + description + Apple III floppy controller + + + value + apple2gsr0p2 + description + Apple IIgs (ROM00 prototype 3/10/1986) + + + value + apple2gsr0p + description + Apple IIgs (ROM00 prototype 6/19/1986) + + + value + apple2gsr0 + description + Apple IIgs (ROM00) + + + value + apple2gsr1 + description + Apple IIgs (ROM01) + + + value + apple2gs + description + Apple IIgs (ROM03) + + + value nb_aenet - nb_amc3b - nb_btbug - nb_c264 - nb_image - nb_laserview - nb_m2hr - nb_m2vc + description + Apple NuBus Ethernet card + + + value + a2ssc + description + Apple Super Serial Card + + + value + apple2 + description + Apple ][ + + + value + apple2jp + description + Apple ][ J-Plus + + + value + apple2p + description + Apple ][+ + + + value + a2surance + description + Applesurance Diagnostic Controller + + + value nb_qdlink - nb_rtpd - nb_sp8s3 - nb_spdq - nb_vikbw - nb_wspt - p72 - pd3_30hr - pd3_c264 - pd3_lviw - pd3_mclr - pd3_pc16 + description + Applied Engineering Quadralink serial card + + + value + a2ramfac + description + Applied Engineering RamFactor + + + value + a2tmstho + description + Applied Engineering TimeMaster H.O. + + + value + a2twarp + description + Applied Engineering TransWarp + + + value + a2aevm80 + description + Applied Engineering Viewmaster 80 + + + value + a2vulgld + description + Applied Engineering Vulcan Gold IDE controller (IIgs version) + + + value + a2vuliie + description + Applied Engineering Vulcan IDE controller (//e version) + + + value + a2vulcan + description + Applied Engineering Vulcan IDE controller (IIgs version) + + + value + aprissi + description + Apricorn Super Serial Imager + + + value + nb_amc3b + description + Asante MC3NB Ethernet card + + + value + basis108 + description + Basis 108 + + + value + a2booti + description + Booti Card + + + value + nb_btbug + description + Brigent BootBug debugger card + + + value + ccs7710 + description + CCS Model 7710 Asynchronous Serial Interface + + + value + a2cffa02 + description + CFFA 2.0 Compact Flash (6502 firmware, www.dreher.net) + + + value + a2cffa2 + description + CFFA 2.0 Compact Flash (65C02 firmware, www.dreher.net) + + + value + cffa1 + description + CFFA Compact Flash for Apple I + + + value + cmsscsi + description + CMS SCSI II Card + + + value + comx_pl80 + description + COMX PL-80 + + + value + cec2000 + description + China Education Computer 2000 + + + value + cece + description + China Education Computer E + + + value + cecg + description + China Education Computer G + + + value + ceci + description + China Education Computer I + + + value + cecm + description + China Education Computer M + + + value + a2corvus + description + Corvus Flat Cable interface + + + value + craft2p + description + Craft II+ + + + value + dodo + description + Do-Do + + + value + kb_ec1841 + description + EC-1841 Keyboard + + + value + elppa + description + Elppa II+ + + + value + ap2000 + description + Epson ActionPrinter 2000 + + + value + ex800 + description + Epson EX-800 + + + value + lx800 + description + Epson LX-800 + + + value + lx810l + description + Epson LX-810L + + + value + a2sider1 + description + First Class Peripherals Sider 1 SASI Card + + + value + a2sider2 + description + First Class Peripherals Sider 2 SASI Card + + + value + ace100 + description + Franklin ACE 100 + + + value + ace1000 + description + Franklin ACE 1000 + + + value + ace2200 + description + Franklin ACE 2200 + + + value + ace500 + description + Franklin ACE 500 + + + value pds_hyper - pds_sefp - prav82 - prav8c - prav8m - qsound + description + GCC HyperDrive + + + value + hkc8800a + description + HKC 8800A + + + value + a2swyft + description + IAI SwyftCard + + + value + cga + description + IBM Color/Graphics Monitor Adapter + + + value + kb_pcxt83 + description + IBM PC/XT Keyboard + + + value + a2ap16 + description + IBS AP-16 80 column card + + + value + a2ap16a + description + IBS AP-16 80 column card (alt. version) + + + value + ie15_device + description + IE15 + + + value + kb_iskr1030 + description + Iskra-1030 Keyboard + + + value + ivelultr + description + Ivel Ultra + + + value + keytronic_pc3270 + description + Keytronic PC3270 + + + value + pd3_pc16 + description + Lapis ProColor Server 8*16 + + + value + laser2c + description + Laser //c + + + value + laser128 + description + Laser 128 + + + value + laser128o + description + Laser 128 (original hardware) + + + value + las128ex + description + Laser 128ex (version 4.5) + + + value + las128e2 + description + Laser 128ex2 (version 6.1) + + + value + a2suprterm + description + M&R Enterprises SUP'R'TERMINAL + + + value + mac128k + description + Macintosh 128k + + + value + mac512k + description + Macintosh 512k + + + value + macclasc + description + Macintosh Classic + + + value + macclas2 + description + Macintosh Classic II + + + value + macii + description + Macintosh II + + + value + mac2fdhd + description + Macintosh II (FDHD) + + + value + nb_m2hr + description + Macintosh II Hi-Resolution video card + + + value + nb_wspt + description + Macintosh II Portrait Video Card + + + value + nb_m2vc + description + Macintosh II Video Card + + + value + maciici + description + Macintosh IIci + + + value + maciisi + description + Macintosh IIsi + + + value + maciivx + description + Macintosh IIvx + + + value + mackbd_m0110b + description + Macintosh Keyboard (British - M0110B) + + + value + mackbd_m0110f + description + Macintosh Keyboard (French - M0110F) + + + value + mackbd_m0110t + description + Macintosh Keyboard (Italian - M0110T) + + + value + mackbd_m0110 + description + Macintosh Keyboard (U.S. - M0110) + + + value + maclc + description + Macintosh LC + + + value + maclc2 + description + Macintosh LC II + + + value + maclc3 + description + Macintosh LC III + + + value + mackbd_m0120 + description + Macintosh Numeric Keypad (English - M0120) + + + value + mackbd_m0120p + description + Macintosh Numeric Keypad (European - M0120P) + + + value + macplus + description + Macintosh Plus + + + value + mackbd_m0110a_f + description + Macintosh Plus Keyboard (French - M0110A F) + + + value + mackbd_m0110a_j + description + Macintosh Plus Keyboard (Japanese - M0110A J) + + + value + mackbd_m0110a + description + Macintosh Plus Keyboard (U.S. - M0110A) + + + value + macse + description + Macintosh SE + + + value + macsefd + description + Macintosh SE (FDHD) + + + value + macse30 + description + Macintosh SE/30 + + + value + maxxi + description + Maxxi + + + value + microeng + description + Micro Engenho + + + value + pd3_30hr + description + Micron/XCEED Technology Color 30HR + + + value + pd3_mclr + description + Micron/XCEED Technology MacroColor 30 + + + value + mprof3 + description + Microprofessor III + + + value softcard3 - space84 - spectred - swtpc8212_device - tk3000 - uniap2en - uniap2pt - uniap2ti + description + Microsoft SoftCard /// + + + value + nb_vikbw + description + Moniterm Viking video card + + + value + m68705p3 + description + Motorola MC68705P3 + + + value + p72 + description + NEC PinWriter P72 + + + value upd7220 + description + NEC uPD7220 + + + value + nb_image + description + NuBus Disk Image Pseudo-Card + + + value + a2bufgrapplerplusa + description + Orange Micro Buffered Grappler+ (rev A) Printer Interface + + + value + a2bufgrapplerplus + description + Orange Micro Buffered Grappler+ Printer Interface + + + value + a2grappler + description + Orange Micro Grappler Printer Interface + + + value + a2grapplerplus + description + Orange Micro Grappler+ Printer Interface + + + value + a2aplcrd + description + PCPI Applicard + + + value + a2focdrv + description + Parsons Engineering Focus Drive + + + value + prav82 + description + Pravetz 82 + + + value + prav8c + description + Pravetz 8C + + + value + prav8m + description + Pravetz 8M + + + value + a2pdromdr + description + ProDOS ROM Drive + + + value + qsound + description + QSound + + + value + pds_sefp + description + Radius SE Full Page Display + + + value + nb_rtpd + description + Radius Two Page Display video card + + + value + nb_c264 + description + RasterOps ColorBoard 264 video card + + + value + pd3_c264 + description + RasterOps Colorboard 264/SE30 + + + value + swtpc8212_device + description + SWTPC8212 + + + value + pd3_lviw + description + Sigma Designs L-View + + + value + nb_laserview + description + Sigma Designs LaserView video card + + + value + space84 + description + Space 84 + + + value + spectred + description + Spectrum ED + + + value + a2q68 + description + Stellation Two Q-68 + + + value + a2q68plus + description + Stellation Two Q-68 Plus + + + value + nb_spdq + description + SuperMac Spectrum PDQ video card + + + value + nb_sp8s3 + description + SuperMac Spectrum/8 Series III video card + + + value + mockingboardd + description + Sweet Micro Systems Mockingboard D + + + value + tk3000 + description + TK3000//e + + + value + chessmachine + description + Tasc ChessMachine + + + value + a2thunpl + description + ThunderWare ThunderClock Plus + + + value + uniap2pt + description + Unitron AP II (in Brazilian Portuguese) + + + value + uniap2en + description + Unitron AP II (in English) + + + value + uniap2ti + description + Unitron AP II+ (Teclado Inteligente) + + + value + a2ultrme + description + Videx UltraTerm (enhanced //e) + + + value + a2ulttrm + description + Videx UltraTerm (original) + + + value + a2uniprint + description + Videx Uniprint Printer Interface + + + value + a2vidtrm + description + Videx Videoterm 80 Column Display + + + value votrax + description + Votrax SC-01 + + + value ym2413 + description + YM2413 OPLL + + + value ym2608 + description + YM2608 OPNA + + + value zijini - - + description + Zi Jin I + + + value + a2zipdrv + description + Zip Technologies ZipDrive + + + value + a2vtc1 + description + unknown Videoterm clone + + diff --git a/Ample/Resources/spectred.plist b/Ample/Resources/spectred.plist index 1e10c4f..89a56d3 100644 --- a/Ample/Resources/spectred.plist +++ b/Ample/Resources/spectred.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/tk3000.plist b/Ample/Resources/tk3000.plist index 4f8cfea..a235089 100644 --- a/Ample/Resources/tk3000.plist +++ b/Ample/Resources/tk3000.plist @@ -129,6 +129,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -737,6 +745,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1345,6 +1361,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1953,6 +1977,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2563,6 +2595,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3173,6 +3213,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -3781,6 +3829,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -7451,6 +7507,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/Resources/zijini.plist b/Ample/Resources/zijini.plist index 8c40bca..7f73f42 100644 --- a/Ample/Resources/zijini.plist +++ b/Ample/Resources/zijini.plist @@ -148,6 +148,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -756,6 +764,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1364,6 +1380,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -1974,6 +1998,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -2582,6 +2614,14 @@ devname a2diskiing + + value + superdrive + description + Apple II 3.5" Disk Controller Card + devname + a2superdrive + value hsscsi @@ -6272,6 +6312,121 @@ + + name + a2superdrive + slots + + + name + :fdc:0 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name + :fdc:1 + options + + + value + + description + —None— + default + + + + value + 35dd + description + 3.5" DD + default + + media + + floppy_3_5 + 1 + + + + value + 35hd + description + 3.5" HD + default + + media + + floppy_3_5 + 1 + + + + value + 35sd + description + 3.5" SD + default + + media + + floppy_3_5 + 1 + + + + + + name a2surance diff --git a/Ample/SlotViewController.m b/Ample/SlotViewController.m index a5b1de8..f6550db 100644 --- a/Ample/SlotViewController.m +++ b/Ample/SlotViewController.m @@ -165,18 +165,19 @@ static unsigned RootKey = 0; -(void)rebuildMedia { - - - Media media = _machine_media; + + Media media = EmptyMedia; unsigned mask = 1; for (unsigned i = 0; i < SLOT_COUNT; ++i, mask <<= 1) { - + if (_slots_valid & mask) { MediaAdd(&media, &_slot_media[i]); } } - + // machine media last. + MediaAdd(&media, &_machine_media); + [self setMedia: media]; } diff --git a/python/mkroms.py b/python/mkroms.py index b53c76f..6239426 100644 --- a/python/mkroms.py +++ b/python/mkroms.py @@ -142,7 +142,7 @@ def build_known_roms_list(): -mnames = set() +mnames = {} rnames = set() known = build_known_roms_list() @@ -156,18 +156,24 @@ for m in machines: if st.returncode != 0: print("mame error: {}".format(m)) exit(1) + xml = st.stdout + root = ET.fromstring(xml) data = { } - xml = st.stdout - root = ET.fromstring(xml) # find machines that have a rom child for x in root.findall('machine/rom/..'): name = x.get('name') if name in EXCLUDE: continue + if name in mnames: continue + mnames[name] = x.find("description").text #if (name in known): mnames.add(name) - mnames.add(name) + # if name in mnames: + # mnames[name].append(m) + # else: + # mnames[name] = [ m ] + # mnames.add(name) # for y in x.findall('./rom'): # rnames.add(y.get('name')) @@ -180,15 +186,19 @@ for m in machines: # if full: ROMS = list(mnames) # else: ROMS = list(mnames.difference(EXCLUDE)) -ROMS = list(mnames) -ROMS.sort() +ROMS = [{ 'value': k, 'description': v} for k, v in mnames.items()]; +ROMS.sort(key=lambda x: x.get('description')) -data = {} +# data = [] # data["source"] = "https://archive.org/download/mame0.224" # data["type"] = "zip" # data["version"] = "0.224" -data["roms"] = ROMS +#data["roms"] = ROMS + +# for k in ROMS: + # data.append( { 'value': k, 'description': mnames[k] }) + # print(ROMS) with open("../Ample/Resources/roms.plist", "w") as f: - f.write(to_plist(data)) + f.write(to_plist(ROMS))