group emulator bundles with same name in settings

This commit is contained in:
Jesús A. Álvarez 2016-06-28 23:07:52 +02:00
parent 154510c94f
commit cbfa046773
4 changed files with 60 additions and 13 deletions

View File

@ -124,7 +124,7 @@
</subviews> </subviews>
</tableViewCellContentView> </tableViewCellContentView>
</tableViewCell> </tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="machine" textLabel="znE-ML-UrQ" detailTextLabel="xcq-HY-ZDe" style="IBUITableViewCellStyleSubtitle" id="MGj-K1-5lZ"> <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationWidth="60" reuseIdentifier="machine" textLabel="znE-ML-UrQ" detailTextLabel="xcq-HY-ZDe" style="IBUITableViewCellStyleSubtitle" id="MGj-K1-5lZ">
<rect key="frame" x="0.0" y="225.5" width="600" height="44"/> <rect key="frame" x="0.0" y="225.5" width="600" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="MGj-K1-5lZ" id="ueO-zm-JQP"> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="MGj-K1-5lZ" id="ueO-zm-JQP">
@ -147,6 +147,7 @@
</label> </label>
</subviews> </subviews>
</tableViewCellContentView> </tableViewCellContentView>
<inset key="separatorInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
</tableViewCell> </tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="about" textLabel="YWX-qF-gPj" detailTextLabel="xr3-v1-hzM" style="IBUITableViewCellStyleValue1" id="Mon-vq-IrO"> <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="about" textLabel="YWX-qF-gPj" detailTextLabel="xr3-v1-hzM" style="IBUITableViewCellStyleValue1" id="Mon-vq-IrO">
<rect key="frame" x="0.0" y="269.5" width="600" height="44"/> <rect key="frame" x="0.0" y="269.5" width="600" height="44"/>
@ -183,7 +184,7 @@
<rect key="frame" x="15" y="0.0" width="570" height="43.5"/> <rect key="frame" x="15" y="0.0" width="570" height="43.5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/> <fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/> <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
</subviews> </subviews>

View File

@ -17,7 +17,7 @@
#define kROM_Size 0x00040000 #define kROM_Size 0x00040000
#ifdef PLIST_PREPROCESSOR #ifdef PLIST_PREPROCESSOR
#define MNVMBundleDisplayName Mac II (640×480) #define MNVMBundleDisplayName Mac II
#define MNVMBundleGetInfoString 8M, 640×480 #define MNVMBundleGetInfoString 8M, 640×480
#else #else
#include "../CNFGGLOB.h" #include "../CNFGGLOB.h"

View File

@ -17,7 +17,7 @@
#define kROM_Size 0x00040000 #define kROM_Size 0x00040000
#ifdef PLIST_PREPROCESSOR #ifdef PLIST_PREPROCESSOR
#define MNVMBundleDisplayName Mac II (1024×768) #define MNVMBundleDisplayName Mac II
#define MNVMBundleGetInfoString 8M, 1024×768 #define MNVMBundleGetInfoString 8M, 1024×768
#else #else
#include "../CNFGGLOB.h" #include "../CNFGGLOB.h"

View File

@ -25,6 +25,8 @@ typedef enum : NSInteger {
{ {
NSArray *keyboardLayouts; NSArray *keyboardLayouts;
NSArray<NSBundle*> *emulatorBundles; NSArray<NSBundle*> *emulatorBundles;
NSMutableArray *machineList; // NSString (header) or NSBundle (emulator bundle)
NSMutableSet<NSBundle*> *groupedEmulatorBundles;
NSBundle *selectedEmulatorBundle; NSBundle *selectedEmulatorBundle;
NSString *aboutTitle; NSString *aboutTitle;
NSArray<NSDictionary<NSString*,NSString*>*> *aboutItems; NSArray<NSDictionary<NSString*,NSString*>*> *aboutItems;
@ -40,12 +42,29 @@ typedef enum : NSInteger {
- (void)loadEmulatorBundles { - (void)loadEmulatorBundles {
emulatorBundles = [AppDelegate sharedInstance].emulatorBundles; emulatorBundles = [AppDelegate sharedInstance].emulatorBundles;
NSMutableDictionary<NSString*,NSMutableArray<NSBundle*>*> *bundlesByName = [NSMutableDictionary dictionaryWithCapacity:emulatorBundles.count];
NSString *selectedBundleName = [[NSUserDefaults standardUserDefaults] stringForKey:@"machine"]; NSString *selectedBundleName = [[NSUserDefaults standardUserDefaults] stringForKey:@"machine"];
for (NSBundle *bundle in emulatorBundles) { for (NSBundle *bundle in emulatorBundles) {
NSString *bundleName = bundle.bundlePath.lastPathComponent.stringByDeletingPathExtension; NSString *bundleName = bundle.bundlePath.lastPathComponent.stringByDeletingPathExtension;
if ([selectedBundleName isEqualToString:bundleName]) { if ([selectedBundleName isEqualToString:bundleName]) {
selectedEmulatorBundle = bundle; selectedEmulatorBundle = bundle;
} }
NSString *displayName = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
if (bundlesByName[displayName] == nil) {
bundlesByName[displayName] = [NSMutableArray arrayWithCapacity:1];
}
[bundlesByName[displayName] addObject:bundle];
}
NSArray *sortedNames = [bundlesByName.allKeys sortedArrayUsingSelector:@selector(compare:)];
machineList = [NSMutableArray arrayWithCapacity:emulatorBundles.count];
groupedEmulatorBundles = [NSMutableSet setWithCapacity:emulatorBundles.count];
for (NSString *name in sortedNames) {
NSArray<NSBundle*>* bundles = bundlesByName[name];
if (bundles.count > 1) {
[machineList addObject:name];
[groupedEmulatorBundles addObjectsFromArray:bundles];
}
[machineList addObjectsFromArray:bundles];
} }
} }
@ -127,7 +146,7 @@ typedef enum : NSInteger {
case SettingsSectionKeyboard: case SettingsSectionKeyboard:
return keyboardLayouts.count; return keyboardLayouts.count;
case SettingsSectionMachine: case SettingsSectionMachine:
return emulatorBundles.count; return machineList.count;
case SettingsSectionAbout: case SettingsSectionAbout:
return aboutItems.count; return aboutItems.count;
default: default:
@ -205,14 +224,33 @@ typedef enum : NSInteger {
BOOL selected = [[defaults stringForKey:@"keyboardLayout"] isEqualToString:layout.lastPathComponent]; BOOL selected = [[defaults stringForKey:@"keyboardLayout"] isEqualToString:layout.lastPathComponent];
cell.accessoryType = selected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; cell.accessoryType = selected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
} else if (section == SettingsSectionMachine) { } else if (section == SettingsSectionMachine) {
NSBundle *bundle = emulatorBundles[indexPath.row]; id item = machineList[indexPath.row];
BOOL rowIsHeader = [item isKindOfClass:[NSString class]];
BOOL rowHasHeader = [groupedEmulatorBundles containsObject:item];
NSBundle *bundle = rowIsHeader ? machineList[indexPath.row + 1] : item;
NSString *bundleName = bundle.bundlePath.lastPathComponent.stringByDeletingPathExtension; NSString *bundleName = bundle.bundlePath.lastPathComponent.stringByDeletingPathExtension;
cell = [tableView dequeueReusableCellWithIdentifier:@"machine" forIndexPath:indexPath]; cell = [tableView dequeueReusableCellWithIdentifier:@"machine" forIndexPath:indexPath];
cell.textLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]; if (rowIsHeader) {
cell.detailTextLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleGetInfoString"]; cell.textLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
NSString *iconName = [NSString stringWithFormat:@"PlugIns/%@.mnvm/Icon", bundleName]; cell.detailTextLabel.text = NSLocalizedString(@"multiple configurations available", nil);
cell.imageView.image = [UIImage imageNamed:iconName]; } else if (rowHasHeader) {
cell.accessoryType = bundle == selectedEmulatorBundle ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; cell.textLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleGetInfoString"];
cell.detailTextLabel.text = nil;
} else {
cell.textLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
cell.detailTextLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleGetInfoString"];
}
if (rowHasHeader) {
cell.imageView.image = nil;
cell.indentationLevel = 1;
} else {
NSString *iconName = [NSString stringWithFormat:@"PlugIns/%@.mnvm/Icon", bundleName];
cell.imageView.image = [UIImage imageNamed:iconName];
cell.indentationLevel = 0;
}
cell.accessoryType = (item == selectedEmulatorBundle) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
cell.selectionStyle = rowIsHeader ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleDefault;
} else if (section == SettingsSectionAbout) { } else if (section == SettingsSectionAbout) {
cell = [tableView dequeueReusableCellWithIdentifier:@"about" forIndexPath:indexPath]; cell = [tableView dequeueReusableCellWithIdentifier:@"about" forIndexPath:indexPath];
NSDictionary<NSString*,NSString*> *item = aboutItems[indexPath.row]; NSDictionary<NSString*,NSString*> *item = aboutItems[indexPath.row];
@ -240,12 +278,20 @@ typedef enum : NSInteger {
[tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic]; [tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic];
} else if (indexPath.section == SettingsSectionMachine) { } else if (indexPath.section == SettingsSectionMachine) {
// selected emulated machine // selected emulated machine
NSBundle *bundle = emulatorBundles[indexPath.row]; NSBundle *bundle = machineList[indexPath.row];
if (bundle == selectedEmulatorBundle || ![bundle isKindOfClass:[NSBundle class]]) {
return;
}
NSString *bundleName = bundle.bundlePath.lastPathComponent.stringByDeletingPathExtension; NSString *bundleName = bundle.bundlePath.lastPathComponent.stringByDeletingPathExtension;
[defaults setValue:bundleName forKey:@"machine"]; [defaults setValue:bundleName forKey:@"machine"];
NSUInteger lastSelectedIndex = [machineList indexOfObject:selectedEmulatorBundle];
if (lastSelectedIndex != NSNotFound) {
[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:lastSelectedIndex inSection:SettingsSectionMachine]].accessoryType = UITableViewCellAccessoryNone;
}
UITableViewCell *currentCell = [tableView cellForRowAtIndexPath:indexPath];
currentCell.accessoryType = UITableViewCellAccessoryCheckmark;
selectedEmulatorBundle = bundle; selectedEmulatorBundle = bundle;
[tableView reloadSections:[NSIndexSet indexSetWithIndex:SettingsSectionSpeed] withRowAnimation:UITableViewRowAnimationAutomatic]; [tableView reloadSections:[NSIndexSet indexSetWithIndex:SettingsSectionSpeed] withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic];
} else if (indexPath.section == SettingsSectionAbout) { } else if (indexPath.section == SettingsSectionAbout) {
// links in about // links in about
NSString *linkURL = aboutItems[indexPath.row][@"link"]; NSString *linkURL = aboutItems[indexPath.row][@"link"];