diff --git a/shell/apple/emulator-ios/emulator/EmulatorViewController.h b/shell/apple/emulator-ios/emulator/EmulatorViewController.h index 16f02b12c..dcdf5058c 100644 --- a/shell/apple/emulator-ios/emulator/EmulatorViewController.h +++ b/shell/apple/emulator-ios/emulator/EmulatorViewController.h @@ -10,10 +10,14 @@ #import #import #import "iCadeReaderView.h" +#import "VirtualViewController.h" @interface ViewController : GLKViewController @property (nonatomic) iCadeReaderView* iCadeReader; @property (nonatomic) GCController *gController __attribute__((weak_import)); +@property (nonatomic, strong) id connectObserver; +@property (nonatomic, strong) id disconnectObserver; +@property (nonatomic, strong) VirtualViewController *controller; @end diff --git a/shell/apple/emulator-ios/emulator/EmulatorViewController.mm b/shell/apple/emulator-ios/emulator/EmulatorViewController.mm index d143f8337..e9c44ecd6 100644 --- a/shell/apple/emulator-ios/emulator/EmulatorViewController.mm +++ b/shell/apple/emulator-ios/emulator/EmulatorViewController.mm @@ -81,6 +81,8 @@ extern "C" int reicast_main(int argc, char* argv[]); - (void)viewDidLoad { [super viewDidLoad]; + + self.controller = [[VirtualViewController alloc] initWithNibName:@"VirtualViewController" bundle:nil]; self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; @@ -94,24 +96,32 @@ extern "C" int reicast_main(int argc, char* argv[]); self.connectObserver = [[NSNotificationCenter defaultCenter] addObserverForName:GCControllerDidConnectNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { if ([[GCController controllers] count] == 1) { + if ([self.controller pollController]) { + [self.controller hideController]; + } [self toggleHardwareController:YES]; } }]; self.disconnectObserver = [[NSNotificationCenter defaultCenter] addObserverForName:GCControllerDidDisconnectNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { if (![[GCController controllers] count]) { [self toggleHardwareController:NO]; + if (![self.controller pollController]) { + [self.controller showController:self.view]; + } } }]; if ([[GCController controllers] count]) { [self toggleHardwareController:YES]; - } - + } else if (![self.controller pollController]) { + [self.controller showController:self.view]; + } + self.iCadeReader = [[iCadeReaderView alloc] init]; [self.view addSubview:self.iCadeReader]; self.iCadeReader.delegate = self; self.iCadeReader.active = YES; - + [self setupGL]; if (!gles_init()) @@ -124,7 +134,10 @@ extern "C" int reicast_main(int argc, char* argv[]); } - (void)dealloc -{ +{ + if ([self.controller pollController]) { + [self.controller hideController]; + } [self tearDownGL]; if ([EAGLContext currentContext] == self.context) { diff --git a/shell/apple/emulator-ios/emulator/MainStoryboard.storyboard b/shell/apple/emulator-ios/emulator/MainStoryboard.storyboard index 276a2a495..347cc5f9e 100644 --- a/shell/apple/emulator-ios/emulator/MainStoryboard.storyboard +++ b/shell/apple/emulator-ios/emulator/MainStoryboard.storyboard @@ -1,9 +1,48 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14,6 +53,7 @@ + diff --git a/shell/apple/emulator-ios/emulator/PathsViewController.h b/shell/apple/emulator-ios/emulator/PathsViewController.h index f2a76777e..3a811484a 100644 --- a/shell/apple/emulator-ios/emulator/PathsViewController.h +++ b/shell/apple/emulator-ios/emulator/PathsViewController.h @@ -11,4 +11,6 @@ @interface PathsViewController : UITableViewController @property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarButton; +@property (nonatomic, strong) NSMutableArray* diskImages; + @end diff --git a/shell/apple/emulator-ios/emulator/PathsViewController.m b/shell/apple/emulator-ios/emulator/PathsViewController.m index 5f4849ba0..ffc7c8839 100644 --- a/shell/apple/emulator-ios/emulator/PathsViewController.m +++ b/shell/apple/emulator-ios/emulator/PathsViewController.m @@ -8,6 +8,7 @@ #import "PathsViewController.h" #import "SWRevealViewController.h" +#import "EmulatorViewController.h" @interface PathsViewController () @@ -32,7 +33,7 @@ // Set the side bar button action. When it's tapped, it'll show up the sidebar. _sidebarButton.target = self.revealViewController; _sidebarButton.action = @selector(revealToggle:); - + // Set the gesture [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; // Uncomment the following line to preserve selection between presentations. @@ -40,6 +41,13 @@ // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; + + self.diskImages = [[NSMutableArray alloc] init]; + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documents = [paths objectAtIndex:0]; + NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documents error:NULL]; + NSPredicate *filter = [NSPredicate predicateWithFormat:@"self ENDSWITH '.chd'"]; + self.diskImages = [NSMutableArray arrayWithArray:[files filteredArrayUsingPredicate:filter]]; } - (void)didReceiveMemoryWarning @@ -50,6 +58,47 @@ #pragma mark - Table view data source -// TODO: paths view controller logic +-(NSInteger)numberOfSectionsInTableView: (UITableView*)tableView +{ + return 1; +} + +-(NSInteger)tableView: (UITableView *)tableView numberOfRowsInSection: (NSInteger)section +{ + return [self.diskImages count]; +} + +-(NSString*)tableView: (UITableView*)tableView titleForHeaderInSection: (NSInteger)section +{ + return @""; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + return 160; + // Assign the specific cell height to prevent issues with custom size +} + +-(UITableViewCell*)tableView: (UITableView*)tableView cellForRowAtIndexPath: (NSIndexPath*)indexPath +{ + static NSString *CellIdentifier = @"Cell"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; + if(cell == nil) + { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; + } + + assert(indexPath.row < [self.diskImages count]); + NSString* imagePath = [self.diskImages objectAtIndex: indexPath.row]; + + cell.textLabel.text = [imagePath lastPathComponent]; + + return cell; +} + +-(void)tableView: (UITableView*)tableView didSelectRowAtIndexPath: (NSIndexPath*)indexPath +{ + [self performSegueWithIdentifier: @"emulatorView" sender: self]; +} @end diff --git a/shell/apple/emulator-ios/emulator/VirtualViewController.h b/shell/apple/emulator-ios/emulator/VirtualViewController.h new file mode 100644 index 000000000..7c391a453 --- /dev/null +++ b/shell/apple/emulator-ios/emulator/VirtualViewController.h @@ -0,0 +1,30 @@ +// +// VirtualViewController.h +// +// +// Created by Lounge Katt on 8/19/15. +// +// + +#import + +@interface VirtualViewController : UIViewController + +@property (nonatomic, strong) IBOutlet UIButton* img_dpad_l; +@property (nonatomic, strong) IBOutlet UIButton* img_dpad_r; +@property (nonatomic, strong) IBOutlet UIButton* img_dpad_u; +@property (nonatomic, strong) IBOutlet UIButton* img_dpad_d; +@property (nonatomic, strong) IBOutlet UIButton* img_abxy_a; +@property (nonatomic, strong) IBOutlet UIButton* img_abxy_b; +@property (nonatomic, strong) IBOutlet UIButton* img_abxy_x; +@property (nonatomic, strong) IBOutlet UIButton* img_abxy_y; +@property (nonatomic, strong) IBOutlet UIButton* img_vjoy; +@property (nonatomic, strong) IBOutlet UIButton* img_lt; +@property (nonatomic, strong) IBOutlet UIButton* img_rt; +@property (nonatomic, strong) IBOutlet UIButton* img_start; + +- (void) showController:(UIView *)parentView; +- (void) hideController; +- (BOOL) pollController; + +@end diff --git a/shell/apple/emulator-ios/emulator/VirtualViewController.m b/shell/apple/emulator-ios/emulator/VirtualViewController.m new file mode 100644 index 000000000..0d8a1c744 --- /dev/null +++ b/shell/apple/emulator-ios/emulator/VirtualViewController.m @@ -0,0 +1,62 @@ +// +// VirtualViewController.m +// +// +// Created by Lounge Katt on 8/19/15. +// +// + +#import "VirtualViewController.h" + +@interface VirtualViewController () + +@end + +@implementation VirtualViewController + +- (void)showController:(UIView *)parentView +{ + [parentView addSubview:self.view]; +} + +- (void)hideController { + [self.view removeFromSuperview]; +} + +- (BOOL)pollController { + if (self.view.window != nil) { + return YES; + } + return NO; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/shell/apple/emulator-ios/emulator/VirtualViewController.xib b/shell/apple/emulator-ios/emulator/VirtualViewController.xib new file mode 100644 index 000000000..0710fc57a --- /dev/null +++ b/shell/apple/emulator-ios/emulator/VirtualViewController.xib @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shell/apple/emulator-ios/reicast-ios.xcodeproj/project.pbxproj b/shell/apple/emulator-ios/reicast-ios.xcodeproj/project.pbxproj index 816fb7705..0e9dbc440 100644 --- a/shell/apple/emulator-ios/reicast-ios.xcodeproj/project.pbxproj +++ b/shell/apple/emulator-ios/reicast-ios.xcodeproj/project.pbxproj @@ -42,6 +42,8 @@ 87078A9B18A47FE90034C7A0 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 87078A9A18A47FE90034C7A0 /* AppDelegate.m */; }; 87078AA318A47FE90034C7A0 /* Shader.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 87078AA218A47FE90034C7A0 /* Shader.fsh */; }; 87078AA518A47FE90034C7A0 /* Shader.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 87078AA418A47FE90034C7A0 /* Shader.vsh */; }; + 872EF7021B852EB200A0F617 /* VirtualViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 872EF7001B852EB200A0F617 /* VirtualViewController.m */; }; + 872EF7031B852EB200A0F617 /* VirtualViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 872EF7011B852EB200A0F617 /* VirtualViewController.xib */; }; 876AA3771B818A4000617242 /* ini.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 876AA3751B818A4000617242 /* ini.cpp */; }; 877652C21B6157BD00437F10 /* audiobackend_alsa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 877652B61B6157BD00437F10 /* audiobackend_alsa.cpp */; }; 877652C31B6157BD00437F10 /* audiobackend_directsound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 877652B91B6157BD00437F10 /* audiobackend_directsound.cpp */; }; @@ -302,6 +304,9 @@ 87078AA218A47FE90034C7A0 /* Shader.fsh */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = Shader.fsh; path = Shaders/Shader.fsh; sourceTree = ""; }; 87078AA418A47FE90034C7A0 /* Shader.vsh */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = Shader.vsh; path = Shaders/Shader.vsh; sourceTree = ""; }; 87078AB018A47FE90034C7A0 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 872EF6FF1B852EB200A0F617 /* VirtualViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VirtualViewController.h; path = emulator/VirtualViewController.h; sourceTree = ""; }; + 872EF7001B852EB200A0F617 /* VirtualViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VirtualViewController.m; path = emulator/VirtualViewController.m; sourceTree = ""; }; + 872EF7011B852EB200A0F617 /* VirtualViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VirtualViewController.xib; path = emulator/VirtualViewController.xib; sourceTree = ""; }; 876AA3751B818A4000617242 /* ini.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ini.cpp; sourceTree = ""; }; 876AA3761B818A4000617242 /* ini.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ini.h; sourceTree = ""; }; 877652B61B6157BD00437F10 /* audiobackend_alsa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audiobackend_alsa.cpp; sourceTree = ""; }; @@ -834,6 +839,9 @@ 9C7A393618C805F70070BB5F /* View Controller Subclasses */ = { isa = PBXGroup; children = ( + 872EF6FF1B852EB200A0F617 /* VirtualViewController.h */, + 872EF7001B852EB200A0F617 /* VirtualViewController.m */, + 872EF7011B852EB200A0F617 /* VirtualViewController.xib */, 87C208C51B7A4BFA00638BDD /* AboutViewController.h */, 87C208C61B7A4BFA00638BDD /* AboutViewController.m */, 87C208C71B7A4BFA00638BDD /* BrowserTableViewController.h */, @@ -1543,6 +1551,7 @@ 87D92F4C1B7A1B4800D8FD9E /* Start@2x.png in Resources */, 87D92F471B7A1B4800D8FD9E /* menuicon.png in Resources */, 87D92F411B7A1B4800D8FD9E /* JoystickButton.png in Resources */, + 872EF7031B852EB200A0F617 /* VirtualViewController.xib in Resources */, 87D92F441B7A1B4800D8FD9E /* LTrigger@2x.png in Resources */, 87D92F551B7A1BB100D8FD9E /* LICENSE in Resources */, 87D92F451B7A1B4800D8FD9E /* menuback.png in Resources */, @@ -1760,6 +1769,7 @@ 9C7A3B1818C806E00070BB5F /* Renderer_if.cpp in Sources */, 9C7A3AC518C806E00070BB5F /* zip_error_clear.c in Sources */, 9C7A3AC318C806E00070BB5F /* zip_err_str.c in Sources */, + 872EF7021B852EB200A0F617 /* VirtualViewController.m in Sources */, 9C7A3B4818C806E00070BB5F /* gldraw.cpp in Sources */, 9C7A3AE618C806E00070BB5F /* zip_source_free.c in Sources */, 9C7A3AF118C806E00070BB5F /* adler32.c in Sources */, diff --git a/shell/apple/reicast.xcworkspace/xcshareddata/xcschemes/reicast-ios.xcscheme b/shell/apple/reicast.xcworkspace/xcshareddata/xcschemes/reicast-ios.xcscheme index e425c7dae..208a001a2 100644 --- a/shell/apple/reicast.xcworkspace/xcshareddata/xcschemes/reicast-ios.xcscheme +++ b/shell/apple/reicast.xcworkspace/xcshareddata/xcschemes/reicast-ios.xcscheme @@ -62,7 +62,8 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" allowLocationSimulation = "YES"> - + - +