This commit is contained in:
Kelvin Sherlock 2020-08-22 15:55:16 -04:00
parent 568b653200
commit 12dd0e2c5e
5 changed files with 149 additions and 113 deletions

View File

@ -115,6 +115,7 @@ static NSString *kMyContext = @"kMyContext";
-(void)buildCommandLine {
static NSString *EmptyArg = @"\"\"";
if (!_mameROM) {
[self setCommandLine: @""];
@ -154,10 +155,14 @@ static NSString *kMyContext = @"kMyContext";
}
}
NSArray *args = [_slotController args];
if ([args count]) {
[argv addObjectsFromArray: args];
for (NSString *x in args) {
[argv addObject: [x length] ? x : EmptyArg];
}
// if ([args count]) {
// [argv addObjectsFromArray: args];
// }
if (_mameNoThrottle) [argv addObject: @"-nothrottle"];

View File

@ -763,13 +763,6 @@
<binding destination="Voe-Tx-rLC" name="value" keyPath="self.mameSquarePixels" id="rNk-1d-QZl"/>
</connections>
</button>
<pathControl verticalHuggingPriority="750" fixedFrame="YES" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4bN-As-LRL">
<rect key="frame" x="398" y="96" width="204" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<pathCell key="cell" selectable="YES" editable="YES" alignment="left" placeholderString="Floppy 1" pathStyle="popUp" id="3aA-ge-m45">
<font key="font" metaFont="system"/>
</pathCell>
</pathControl>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cFJ-CO-Dzm" customClass="FlippedView">
<rect key="frame" x="20" y="169" width="306" height="570"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>

View File

@ -21,7 +21,7 @@
<rect key="frame" x="0.0" y="0.0" width="306" height="500"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="none" selectionHighlightStyle="none" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" outlineTableColumn="pBj-py-R6a" id="sIz-DD-PZQ">
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="none" selectionHighlightStyle="none" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" outlineTableColumn="pBj-py-R6a" id="sIz-DD-PZQ">
<rect key="frame" x="0.0" y="0.0" width="306" height="500"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="2" height="3"/>
@ -78,11 +78,18 @@
</connections>
</tableCellView>
<tableCellView identifier="ItemView" id="yGq-lc-RCM" customClass="TablePathView">
<rect key="frame" x="1" y="41" width="304" height="40"/>
<rect key="frame" x="1" y="41" width="304" height="27"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<pathControl verticalHuggingPriority="750" fixedFrame="YES" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="f7R-TO-fmF">
<rect key="frame" x="0.0" y="1" width="251" height="22"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<pathCell key="cell" controlSize="small" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="dcz-8y-tKb">
<font key="font" metaFont="smallSystem"/>
</pathCell>
</pathControl>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zNo-ij-mUl">
<rect key="frame" x="273" y="5" width="33" height="27"/>
<rect key="frame" x="278" y="4" width="23" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="bevel" bezelStyle="rounded" image="NSStopProgressFreestandingTemplate" imagePosition="overlaps" alignment="center" controlSize="small" imageScaling="proportionallyDown" inset="2" id="IZA-Tu-olu">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -92,15 +99,14 @@
<action selector="buttonDelete:" target="-2" id="f30-YS-1UK"/>
</connections>
</button>
<pathControl verticalHuggingPriority="750" fixedFrame="YES" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="f7R-TO-fmF">
<rect key="frame" x="0.0" y="8" width="207" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMinY="YES" flexibleMaxY="YES"/>
<pathCell key="cell" controlSize="small" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="dcz-8y-tKb">
<font key="font" metaFont="smallSystem"/>
</pathCell>
</pathControl>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" id="jeU-0Q-Eps">
<rect key="frame" x="256" y="6" width="14" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" enabled="NO" refusesFirstResponder="YES" alignment="left" image="NSStatusUnavailable" id="dtr-VF-lvn"/>
</imageView>
</subviews>
<connections>
<outlet property="imageView" destination="jeU-0Q-Eps" id="Cjz-C6-w1l"/>
<outlet property="pathControl" destination="f7R-TO-fmF" id="oH7-N3-JC7"/>
</connections>
</tableCellView>
@ -127,6 +133,7 @@
</scrollView>
</objects>
<resources>
<image name="NSStatusUnavailable" width="16" height="16"/>
<image name="NSStopProgressFreestandingTemplate" width="14" height="14"/>
</resources>
</document>

View File

@ -58,15 +58,6 @@
return YES;
}
-(void)prepareCell: (id)cell {
[(NSTextFieldCell *)cell setTitle: _title];
}
-(Class)cellClass {
return [NSTextFieldCell class];
}
-(NSString *)viewIdentifier {
return @"CategoryView";
}
@ -114,15 +105,7 @@
return NO;
}
-(void)prepareCell: (id)cell {
[(NSPathCell *)cell setURL: _url];
[(NSPathCell *)cell setPathStyle: NSPathStylePopUp];
// [(NSTextFieldCell *)cell setTitle: @"xxx"];
}
-(Class)cellClass {
return [NSPathCell class];
}
-(NSString *)viewIdentifier {
return @"ItemView";
@ -131,19 +114,6 @@
-(void)prepareView: (TablePathView *)view {
NSPathControl *pc = [view pathControl];
#if 0
Class pcClass = [NSPathControl class];
if (!pc) {
for (NSView *v in [view subviews]) {
if ([v isKindOfClass: pcClass]) {
pc = v;
[view setPathControl: pc];
break;
}
}
}
if (!pc) return;
#endif
[pc setURL: _url]; //??? will binding take care of it?
[pc unbind: @"value"];
[pc bind: @"value" toObject: self withKeyPath: @"url" options: nil];
@ -244,14 +214,11 @@
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item {
return [item isGroupItem];
return NO; //[item isGroupItem];
}
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item {
[item prepareCell: cell];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item {
return NO;

View File

@ -8,8 +8,13 @@
#import "SlotViewController.h"
const unsigned kMemoryMask = 1 << 16;
@interface SlotViewController () {
unsigned _slots_explicit;
unsigned _slots_valid;
unsigned _slots_default;
}
@property (weak) IBOutlet NSPopUpButton *ram_menu;
@ -80,7 +85,10 @@
[self setMemoryBytes: 0];
[self setResolution: NSMakeSize(0, 0)];
_slots_default = 0;
_slots_explicit = 0;
_slots_valid = 0;
[self setArgs: @[]];
}
@ -91,7 +99,8 @@ static NSFont *ItalicMenuFont(void) {
return [NSFont fontWithDescriptor: fd2 size: [font pointSize]];
}
static void SetDefaultMenu(NSArray *items, NSPopUpButton *button) {
// entry 0 will always be empty.
static int SetDefaultMenu(NSArray *items, NSPopUpButton *button) {
static NSDictionary *attr = nil;
if (!attr) {
@ -114,9 +123,9 @@ static void SetDefaultMenu(NSArray *items, NSPopUpButton *button) {
NSString *title = [d objectForKey: @"description"];
NSAttributedString *t = [[NSAttributedString alloc] initWithString: title attributes: attr];
[item setAttributedTitle: t];
return;
return ix;
}
return 0;
}
-(void)syncMemory {
@ -124,70 +133,101 @@ static void SetDefaultMenu(NSArray *items, NSPopUpButton *button) {
int ix = 0;
NSArray *items = [_machine objectForKey: @"RAM"];
SetDefaultMenu(items, _ram_menu);
unsigned default_index = SetDefaultMenu(items, _ram_menu);
_slots_valid |= kMemoryMask;
_slots_default &= ~kMemoryMask;
if (default_index) _slots_default |= kMemoryMask;
for (NSDictionary *d in items) {
unsigned size = [(NSNumber *)[d objectForKey: @"value"] unsignedIntValue];
if (size == _memoryBytes) {
[_ram_menu selectItemAtIndex: ix];
[self setMemory: [d objectForKey: @"description"]];
return;
}
++ix;
}
if (_slots_explicit & kMemoryMask) {
// if ram was explicitly set, try to keep it.
[self setMemoryBytes: 0];
[self setMemory: @""];
[_ram_menu selectItemAtIndex: 0];
/* set to default */
for (NSDictionary *d in items) {
unsigned size = [(NSNumber *)[d objectForKey: @"value"] unsignedIntValue];
if (size == _memoryBytes) {
[_ram_menu selectItemAtIndex: ix];
[self setMemory: [d objectForKey: @"description"]];
return;
}
++ix;
}
}
_slots_explicit &= ~kMemoryMask;
if (default_index) {
NSDictionary *d = [items objectAtIndex: default_index];
[_ram_menu selectItemAtIndex: default_index];
[self setMemory: [d objectForKey: @"description"]];
[self setMemoryBytes: [(NSNumber *)[d objectForKey: @"value"] unsignedIntValue]];
} else {
[self setMemoryBytes: 0];
[self setMemory: @""];
[_ram_menu selectItemAtIndex: 0];
}
}
-(void)syncSlot: (NSString *)slot button: (NSPopUpButton *)button {
-(void)syncSlot: (NSString *)slot button: (NSPopUpButton *)button index: (unsigned)index {
NSString *value = [self valueForKey: slot];
NSArray *items = [_machine objectForKey: slot];
SetDefaultMenu(items, button);
if (![value length]) return;
unsigned mask = 1 << index;
_slots_default &= ~mask;
if (![items count]) {
[self setValue: @"" forKey: slot];
_slots_explicit &= ~mask;
_slots_valid &= ~mask;
return;
}
_slots_valid |= mask;
int ix = 0;
for (NSDictionary *d in items) {
if ([value isEqualToString: [d objectForKey: @"value"]]) {
unsigned default_index = SetDefaultMenu(items, button);
[button selectItemAtIndex: ix];
return;
if (default_index) _slots_default |= mask;
if (_slots_explicit & mask) {
int ix = 0;
for (NSDictionary *d in items) {
if ([value isEqualToString: [d objectForKey: @"value"]]) {
[button selectItemAtIndex: ix];
return;
}
++ix;
}
++ix;
}
[self setValue: @"" forKey: slot];
[button selectItemAtIndex: 0];
_slots_explicit &= ~mask;
if (default_index) {
NSDictionary *d = [items objectAtIndex: default_index];
[button selectItemAtIndex: default_index];
[self setValue: [d objectForKey: @"value"] forKey: slot];
} else {
[self setValue: @"" forKey: slot];
[button selectItemAtIndex: 0];
}
}
-(void)syncSlots {
[self syncMemory];
[self syncSlot: @"sl0" button: _sl0_menu];
[self syncSlot: @"sl1" button: _sl1_menu];
[self syncSlot: @"sl2" button: _sl2_menu];
[self syncSlot: @"sl3" button: _sl3_menu];
[self syncSlot: @"sl4" button: _sl4_menu];
[self syncSlot: @"sl5" button: _sl5_menu];
[self syncSlot: @"sl6" button: _sl6_menu];
[self syncSlot: @"sl7" button: _sl7_menu];
[self syncSlot: @"rs232" button: _rs232_menu];
[self syncSlot: @"aux" button: _aux_menu];
[self syncSlot: @"exp" button: _exp_menu];
[self syncSlot: @"gameio" button: _game_menu];
[self syncSlot: @"modem" button: _modem_menu];
[self syncSlot: @"printer" button: _printer_menu];
[self syncSlot: @"sl0" button: _sl0_menu index: 0];
[self syncSlot: @"sl1" button: _sl1_menu index: 1];
[self syncSlot: @"sl2" button: _sl2_menu index: 2];
[self syncSlot: @"sl3" button: _sl3_menu index: 3];
[self syncSlot: @"sl4" button: _sl4_menu index: 4];
[self syncSlot: @"sl5" button: _sl5_menu index: 5];
[self syncSlot: @"sl6" button: _sl6_menu index: 6];
[self syncSlot: @"sl7" button: _sl7_menu index: 7];
[self syncSlot: @"rs232" button: _rs232_menu index: 8];
[self syncSlot: @"aux" button: _aux_menu index: 9];
[self syncSlot: @"exp" button: _exp_menu index: 10];
[self syncSlot: @"gameio" button: _game_menu index: 11];
[self syncSlot: @"modem" button: _modem_menu index: 12];
[self syncSlot: @"printer" button: _printer_menu index: 13];
}
-(void)loadMachine: (NSString *)model {
@ -232,6 +272,8 @@ static void SetDefaultMenu(NSArray *items, NSPopUpButton *button) {
// NSInteger ix = [sender indexOfSelectedItem];
NSString *key = Names[tag];
_slots_explicit |= (1 << tag);
NSDictionary *o = [[sender selectedItem] representedObject];
@ -248,6 +290,8 @@ static void SetDefaultMenu(NSArray *items, NSPopUpButton *button) {
[self setMemory: title];
[self setMemoryBytes: [(NSNumber *)[o objectForKey: @"value"] unsignedIntValue]];
_slots_explicit |= kMemoryMask;
// if pull-down menu
if ([sender pullsDown])
[sender setTitle: title];
@ -255,29 +299,49 @@ static void SetDefaultMenu(NSArray *items, NSPopUpButton *button) {
[self rebuildArgs];
}
static BOOL should_add_arg(unsigned slot, unsigned valid_slots, unsigned explicit_slots, unsigned default_slots, NSString *value) {
unsigned mask = 1 << slot;
if (~valid_slots & mask) return NO;
if (default_slots & mask) {
if (explicit_slots & mask)
return YES;
return NO;
}
return [value length];
}
-(void)rebuildArgs {
NSMutableArray *args = [NSMutableArray new];
#define _(a, b) if ([a length]) { [args addObject: b]; [args addObject: a]; }
/* if there IS a default card for the slot and nothing is selected, need to -sl0 "" it. */
_(_memory, @"-ramsize")
#define _(ix, a, b) \
if (should_add_arg(ix, _slots_valid, _slots_explicit, _slots_default, a)) { \
[args addObject: b]; [args addObject: a]; \
} \
_(_sl0, @"-sl0")
_(_sl1, @"-sl1")
_(_sl2, @"-sl2")
_(_sl3, @"-sl3")
_(_sl4, @"-sl4")
_(_sl5, @"-sl5")
_(_sl6, @"-sl6")
_(_sl7, @"-sl7")
_(16, _memory, @"-ramsize")
_(_rs232, @"-rs232")
_(_aux, @"-aux")
_(_exp, @"-exp")
_(_gameio, @"-gameio")
_(_printer, @"-printer")
_(_modem, @"-modem")
_(0, _sl0, @"-sl0")
_(1, _sl1, @"-sl1")
_(2, _sl2, @"-sl2")
_(3, _sl3, @"-sl3")
_(4, _sl4, @"-sl4")
_(5, _sl5, @"-sl5")
_(6, _sl6, @"-sl6")
_(7, _sl7, @"-sl7")
_(8, _rs232, @"-rs232")
_(9, _aux, @"-aux")
_(10, _exp, @"-exp")
_(11, _gameio, @"-gameio")
_(12, _printer, @"-printer")
_(13, _modem, @"-modem")
[self setArgs: args];