mirror of
https://github.com/zydeco/minivmac4ios.git
synced 2025-02-18 00:30:43 +00:00
group emulator bundles with same name in settings
This commit is contained in:
parent
154510c94f
commit
cbfa046773
@ -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>
|
||||||
|
@ -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"
|
||||||
|
@ -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"
|
||||||
|
@ -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];
|
||||||
|
if (rowIsHeader) {
|
||||||
|
cell.textLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
|
||||||
|
cell.detailTextLabel.text = NSLocalizedString(@"multiple configurations available", nil);
|
||||||
|
} else if (rowHasHeader) {
|
||||||
|
cell.textLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleGetInfoString"];
|
||||||
|
cell.detailTextLabel.text = nil;
|
||||||
|
} else {
|
||||||
cell.textLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
|
cell.textLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
|
||||||
cell.detailTextLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleGetInfoString"];
|
cell.detailTextLabel.text = [bundle objectForInfoDictionaryKey:@"CFBundleGetInfoString"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rowHasHeader) {
|
||||||
|
cell.imageView.image = nil;
|
||||||
|
cell.indentationLevel = 1;
|
||||||
|
} else {
|
||||||
NSString *iconName = [NSString stringWithFormat:@"PlugIns/%@.mnvm/Icon", bundleName];
|
NSString *iconName = [NSString stringWithFormat:@"PlugIns/%@.mnvm/Icon", bundleName];
|
||||||
cell.imageView.image = [UIImage imageNamed:iconName];
|
cell.imageView.image = [UIImage imageNamed:iconName];
|
||||||
cell.accessoryType = bundle == selectedEmulatorBundle ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
|
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"];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user