diff --git a/Ample.xcodeproj/project.pbxproj b/Ample.xcodeproj/project.pbxproj index c9b292c..4258401 100644 --- a/Ample.xcodeproj/project.pbxproj +++ b/Ample.xcodeproj/project.pbxproj @@ -125,7 +125,6 @@ B64AF1F7250ED5E400A09B9B /* TableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = B64AF1F5250ED5E400A09B9B /* TableCellView.m */; }; B64AF1FA250EF6A500A09B9B /* Transformers.m in Sources */ = {isa = PBXBuildFile; fileRef = B64AF1F9250EF6A500A09B9B /* Transformers.m */; }; B64AF1FB250EF6A500A09B9B /* Transformers.m in Sources */ = {isa = PBXBuildFile; fileRef = B64AF1F9250EF6A500A09B9B /* Transformers.m */; }; - B64E15A924EA1D5300E8AD3D /* MachineViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B64E15A824EA1D5300E8AD3D /* MachineViewController.m */; }; B65085B925B616AC00354EC9 /* maclc2.plist in Resources */ = {isa = PBXBuildFile; fileRef = B65085B625B616AC00354EC9 /* maclc2.plist */; }; B65085BA25B616AC00354EC9 /* maclc2.plist in Resources */ = {isa = PBXBuildFile; fileRef = B65085B625B616AC00354EC9 /* maclc2.plist */; }; B65085BB25B616AC00354EC9 /* maclc3.plist in Resources */ = {isa = PBXBuildFile; fileRef = B65085B725B616AC00354EC9 /* maclc3.plist */; }; @@ -202,7 +201,6 @@ B6E08076252574690075F4E1 /* vmnet_helper in CopyFiles */ = {isa = PBXBuildFile; fileRef = B6841BD0251EC913006A5C39 /* vmnet_helper */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; B6E4B5B024FDE2670094A35C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B6BA258724E99BEB005FB8FF /* main.m */; }; B6E4B5B124FDE2670094A35C /* LaunchWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6D6DE4024FADFAC00661A5F /* LaunchWindowController.m */; }; - B6E4B5B224FDE2670094A35C /* MachineViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B64E15A824EA1D5300E8AD3D /* MachineViewController.m */; }; B6E4B5B324FDE2670094A35C /* MediaViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B64979C124EF6703008ABD20 /* MediaViewController.m */; }; B6E4B5B424FDE2670094A35C /* FlippedView.m in Sources */ = {isa = PBXBuildFile; fileRef = B60A6E1324EE0AE2004B7EEF /* FlippedView.m */; }; B6E4B5B524FDE2670094A35C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B6BA257F24E99BE9005FB8FF /* AppDelegate.m */; }; @@ -263,6 +261,10 @@ B6E4B5F224FDE2670094A35C /* prav8m.plist in Resources */ = {isa = PBXBuildFile; fileRef = B6109A0024F5F371005CB652 /* prav8m.plist */; }; 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 */; }; + B6F7B539266FDA5B00624C6B /* MachineView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B6F7B536266FDA5B00624C6B /* MachineView.xib */; }; + B6F7B53C267017A200624C6B /* NewMachineViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6F7B53B267017A200624C6B /* NewMachineViewController.m */; }; + B6F7B53D267017A200624C6B /* NewMachineViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6F7B53B267017A200624C6B /* NewMachineViewController.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -479,6 +481,9 @@ 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 = ""; }; + B6F7B537266FDA5B00624C6B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MachineView.xib; sourceTree = ""; }; + B6F7B53A267017A200624C6B /* NewMachineViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NewMachineViewController.h; sourceTree = ""; }; + B6F7B53B267017A200624C6B /* NewMachineViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NewMachineViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -696,6 +701,8 @@ B66D0FE926113AA8000902F1 /* SoftwareList.h */, B63005312666D6940014C381 /* BookmarkManager.h */, B63005322666D6940014C381 /* BookmarkManager.m */, + B6F7B53A267017A200624C6B /* NewMachineViewController.h */, + B6F7B53B267017A200624C6B /* NewMachineViewController.m */, B6BA563A251685DA00B0C47D /* Window Controllers */, B6B9EA652506A5550080E70D /* EjectButton.h */, B6B9EA642506A5550080E70D /* EjectButton.m */, @@ -737,6 +744,7 @@ children = ( B6665C1A265C639900254939 /* Autocomplete.xib */, B6E9A18125088B36005E7525 /* SlotView.xib */, + B6F7B536266FDA5B00624C6B /* MachineView.xib */, B63C1B9325008A2700511A71 /* DownloadWindow.xib */, B66236BF24FDB7A6006CABD7 /* Credits.rtf */, B6D6DE3C24FADF8B00661A5F /* LaunchWindow.xib */, @@ -934,6 +942,7 @@ B6109A2524F5F377005CB652 /* laser2c.plist in Resources */, B6109A3D24F5F377005CB652 /* laser128.plist in Resources */, B6109A2824F5F377005CB652 /* apple2ep.plist in Resources */, + B6F7B538266FDA5B00624C6B /* MachineView.xib in Resources */, B6109A1924F5F377005CB652 /* apple2ees.plist in Resources */, B6DE32482605482500418375 /* mac512ke.plist in Resources */, B6109A3924F5F377005CB652 /* prav8c.plist in Resources */, @@ -1079,6 +1088,7 @@ B6E4B5E224FDE2670094A35C /* apple2gsr1.plist in Resources */, B6E4B5E324FDE2670094A35C /* Defaults.plist in Resources */, B6E4B5E424FDE2670094A35C /* models.plist in Resources */, + B6F7B539266FDA5B00624C6B /* MachineView.xib in Resources */, B63C1BA9250192E600511A71 /* zijini.plist in Resources */, B6E4B5E524FDE2670094A35C /* craft2p.plist in Resources */, B6E4B5E624FDE2670094A35C /* uniap2pt.plist in Resources */, @@ -1155,7 +1165,6 @@ B6152B5625F4549F00605E6E /* Slot.m in Sources */, B6D6DE4124FADFAC00661A5F /* LaunchWindowController.m in Sources */, B6665C14265A0E3E00254939 /* AutocompleteControl.m in Sources */, - B64E15A924EA1D5300E8AD3D /* MachineViewController.m in Sources */, B64979C224EF6703008ABD20 /* MediaViewController.m in Sources */, B60A6E1424EE0AE2004B7EEF /* FlippedView.m in Sources */, B6BA258024E99BE9005FB8FF /* AppDelegate.m in Sources */, @@ -1164,6 +1173,7 @@ B66236A924FD9A34006CABD7 /* PreferencesWindowController.m in Sources */, B63C1F0F25B1447C0016A611 /* CheatSheetWindowController.m in Sources */, B64AF1F2250ECB2E00A09B9B /* DiskImagesWindowController.m in Sources */, + B6F7B53C267017A200624C6B /* NewMachineViewController.m in Sources */, B64AF1F6250ED5E400A09B9B /* TableCellView.m in Sources */, B66D0FE72611386C000902F1 /* SoftwareList.m in Sources */, B63C1B9425008A2700511A71 /* DownloadWindowController.m in Sources */, @@ -1186,7 +1196,6 @@ B6152B5B25F5B57E00605E6E /* Media.m in Sources */, B6E4B5B124FDE2670094A35C /* LaunchWindowController.m in Sources */, B6152B5725F4549F00605E6E /* Slot.m in Sources */, - B6E4B5B224FDE2670094A35C /* MachineViewController.m in Sources */, B6E4B5B324FDE2670094A35C /* MediaViewController.m in Sources */, B64AF1F7250ED5E400A09B9B /* TableCellView.m in Sources */, B6E4B5B424FDE2670094A35C /* FlippedView.m in Sources */, @@ -1194,6 +1203,7 @@ B615A9A026640A70001FBF99 /* SlotViewController.m in Sources */, B6665C15265A0E3E00254939 /* AutocompleteControl.m in Sources */, B6E4B5B524FDE2670094A35C /* AppDelegate.m in Sources */, + B6F7B53D267017A200624C6B /* NewMachineViewController.m in Sources */, B66D0FE82611386C000902F1 /* SoftwareList.m in Sources */, B6E4B5B624FDE2670094A35C /* LogWindowController.m in Sources */, B6E4B5B724FDE2670094A35C /* PreferencesWindowController.m in Sources */, @@ -1276,6 +1286,14 @@ name = SlotView.xib; sourceTree = ""; }; + B6F7B536266FDA5B00624C6B /* MachineView.xib */ = { + isa = PBXVariantGroup; + children = ( + B6F7B537266FDA5B00624C6B /* Base */, + ); + name = MachineView.xib; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/Ample/Base.lproj/LaunchWindow.xib b/Ample/Base.lproj/LaunchWindow.xib index 7c7f03d..9592a45 100644 --- a/Ample/Base.lproj/LaunchWindow.xib +++ b/Ample/Base.lproj/LaunchWindow.xib @@ -11,7 +11,7 @@ - + @@ -24,19 +24,15 @@ - + - + - - - - - - + + - - + + @@ -439,23 +435,23 @@ DQ - + - - + + - + - + - - + + @@ -477,8 +473,8 @@ DQ - - + + @@ -488,13 +484,20 @@ DQ + + + + + + + + - + - @@ -567,6 +570,7 @@ Gw + diff --git a/Ample/Base.lproj/MachineView.xib b/Ample/Base.lproj/MachineView.xib new file mode 100644 index 0000000..7965111 --- /dev/null +++ b/Ample/Base.lproj/MachineView.xib @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ample/LaunchWindowController.m b/Ample/LaunchWindowController.m index 9da68c6..da8d5d9 100644 --- a/Ample/LaunchWindowController.m +++ b/Ample/LaunchWindowController.m @@ -10,7 +10,7 @@ #import "LaunchWindowController.h" #import "MediaViewController.h" #import "SlotViewController.h" -#import "MachineViewController.h" +#import "NewMachineViewController.h" #import "LogWindowController.h" #import "AutocompleteControl.h" @@ -29,7 +29,7 @@ static NSString *kContextMachine = @"kContextMachine"; } @property (strong) IBOutlet MediaViewController *mediaController; @property (strong) IBOutlet SlotViewController *slotController; -@property (strong) IBOutlet MachineViewController *machineViewController; +@property (strong) IBOutlet NewMachineViewController *machineViewController; @property (weak) IBOutlet NSView *machineView; @property (weak) IBOutlet NSView *slotView; diff --git a/Ample/NewMachineViewController.h b/Ample/NewMachineViewController.h new file mode 100644 index 0000000..a47e0a4 --- /dev/null +++ b/Ample/NewMachineViewController.h @@ -0,0 +1,28 @@ +// +// NewMachineViewController.h +// Ample +// +// Created by Kelvin Sherlock on 6/8/2021. +// Copyright © 2021 Kelvin Sherlock. All rights reserved. +// + +#import +#import "Ample.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface NewMachineViewController : NSViewController + +@property (nullable) NSString *machine; + +@end + +@interface NewMachineViewController (Table) + +@end + +@interface NewMachineViewController (Bookmark) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Ample/NewMachineViewController.m b/Ample/NewMachineViewController.m new file mode 100644 index 0000000..2f54ee7 --- /dev/null +++ b/Ample/NewMachineViewController.m @@ -0,0 +1,217 @@ +// +// NewMachineViewController.m +// Ample +// +// Created by Kelvin Sherlock on 6/8/2021. +// Copyright © 2021 Kelvin Sherlock. All rights reserved. +// + +#import "NewMachineViewController.h" + +@interface NewMachineViewController () { + + NSArray *_data; +} + +@property (weak) IBOutlet NSOutlineView *outlineView; + +@end + +@implementation NewMachineViewController + +-(void)awakeFromNib { + + static unsigned first = 0; + + if (first) return; + first++; + + NSBundle *bundle = [NSBundle mainBundle]; + NSString *path = [bundle pathForResource: @"models" ofType: @"plist"]; + _data = [NSArray arrayWithContentsOfFile: path]; + +} + +-(void)viewDidLoad { + [super viewDidLoad]; + + //[_outlineView reloadData]; + //[_outlineView setAutosaveExpandedItems: YES]; + //[_outlineView expandItem: nil expandChildren: YES]; +} + +#pragma mark - IBActions +- (IBAction)clickAction:(id)sender { + + NSInteger row = [_outlineView selectedRow]; + if (row < 0) return; + NSDictionary *d = [_outlineView itemAtRow: row]; + if (!d) return; + NSString *value = [d objectForKey: @"value"]; + if (!d) return; + [self setMachine: value]; +} + +@end + + +@implementation NewMachineViewController (Table) + +#if 0 +- (BOOL)outlineView:(NSOutlineView *)outlineView shouldExpandItem:(id)item { + return YES; +} + +- (BOOL)outlineView:(NSOutlineView *)outlineView shouldCollapseItem:(id)item { + return NO; +} +#endif + +- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item { + // disclosure triangle. + if (!item) return YES; + NSArray *children = [(NSDictionary *)item objectForKey: @"children"]; + return [children count] > 0; +} + + +- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { + if (!item) return YES; + NSArray *children = [(NSDictionary *)item objectForKey: @"children"]; + return [children count] > 0; +} + +- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item { + +#if 0 + NSArray *children = [(NSDictionary *)item objectForKey: @"children"]; + return [children count] > 0; +#else + return NO; +#endif +} + + +- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { + +#if 0 + NSArray *children = [(NSDictionary *)item objectForKey: @"children"]; + if ([children count]) { + return [outlineView makeViewWithIdentifier: @"HeaderCell" owner: self]; + } +#endif + NSTableCellView *v = [outlineView makeViewWithIdentifier: @"DataCell" owner: self]; + //[v setObjectValue: item]; + return v; +} + +- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { + if (!item) return [_data count]; + NSArray *children = [(NSDictionary *)item objectForKey: @"children"]; + return [children count]; +} + +- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { + + if (item == nil) { + return [_data objectAtIndex: index]; + } + NSArray *children = [(NSDictionary *)item objectForKey: @"children"]; + return [children objectAtIndex: index]; +} + +- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { + return item; +} + + +- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item { + if (!item) return NO; + return [(NSDictionary *)item objectForKey: @"value"] != nil; +} + + +// saving/restoring expanded items +- (id)outlineView:(NSOutlineView *)outlineView persistentObjectForItem:(id)item { + + return [item objectForKey: @"description"]; +} + +- (id)outlineView:(NSOutlineView *)outlineView itemForPersistentObject:(id)object { + + if ([object isKindOfClass: [NSString class]]) { + + for(NSDictionary *d in _data) { + if ([(NSString *)object isEqualToString: [d objectForKey: @"description"]]) + return d; + } + + } + return nil; + //return object; +} + + +@end + + +@implementation NewMachineViewController (Bookmark) + + +- (void)didLoadBookmark:(NSDictionary *)bookmark { +} + +- (BOOL)loadBookmark:(NSDictionary *)bookmark { + NSString *machine = [bookmark objectForKey: @"machine"]; + + //NSInteger row = [_outlineView selectedRow]; + if (!machine) { + [self setMachine: nil]; + [_outlineView deselectAll: nil]; + return NO; + } + + for (NSDictionary *parent in _data) { + NSArray *children = [parent objectForKey: @"children"]; + + for (NSDictionary *child in children) { + if ([machine isEqualToString: [child objectForKey: @"value"]]) { + + [_outlineView expandItem: parent]; + NSInteger row = [_outlineView rowForItem: child]; + if (row >= 0) { + NSIndexSet *set = [NSIndexSet indexSetWithIndex: row]; + [_outlineView selectRowIndexes: set byExtendingSelection: NO]; + [_outlineView scrollRowToVisible: row]; + return YES; + } + return NO; + } + } + + // could also match parent. + if ([machine isEqualToString: [parent objectForKey: @"value"]]) { + NSInteger row = [_outlineView rowForItem: parent]; + if (row >= 0) { + NSIndexSet *set = [NSIndexSet indexSetWithIndex: row]; + [_outlineView selectRowIndexes: set byExtendingSelection: NO]; + [_outlineView scrollRowToVisible: row]; + return YES; + } + return NO; + } + } + + return NO; +} + +- (BOOL)saveBookmark:(NSMutableDictionary *)bookmark { + // machine saved in parent. + return YES; +} + +- (void)willLoadBookmark:(NSDictionary *)bookmark { + +} + +@end