diff --git a/ios/RetroArch.xcodeproj/project.pbxproj b/ios/RetroArch.xcodeproj/project.pbxproj index e7e64056fa..3c3b249c0e 100644 --- a/ios/RetroArch.xcodeproj/project.pbxproj +++ b/ios/RetroArch.xcodeproj/project.pbxproj @@ -82,6 +82,7 @@ 96AFAFD416C1FBC0009DE44C /* input_common.c in Sources */ = {isa = PBXBuildFile; fileRef = 96AFAFC916C1FBC0009DE44C /* input_common.c */; }; 96C19C2216D2F3BA00FE8D5A /* RADirectoryFilterList.m in Sources */ = {isa = PBXBuildFile; fileRef = 96C19C2116D2F3BA00FE8D5A /* RADirectoryFilterList.m */; }; 96C19C2416D453BA00FE8D5A /* RADirectoryGrid.m in Sources */ = {isa = PBXBuildFile; fileRef = 96C19C2316D453BA00FE8D5A /* RADirectoryGrid.m */; }; + 96C19C2916D5A56500FE8D5A /* browser.m in Sources */ = {isa = PBXBuildFile; fileRef = 96C19C2816D5A56400FE8D5A /* browser.m */; }; 96CF015016C2C0B700ABF9C9 /* overlay.c in Sources */ = {isa = PBXBuildFile; fileRef = 96AFAFCE16C1FBC0009DE44C /* overlay.c */; }; 96CF015C16C2F72900ABF9C9 /* ios_input.c in Sources */ = {isa = PBXBuildFile; fileRef = 96CF015B16C2F72900ABF9C9 /* ios_input.c */; }; /* End PBXBuildFile section */ @@ -229,6 +230,7 @@ 96C19C2316D453BA00FE8D5A /* RADirectoryGrid.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RADirectoryGrid.m; sourceTree = ""; }; 96C19C2516D455BE00FE8D5A /* browser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = browser.h; sourceTree = ""; }; 96C19C2616D455BE00FE8D5A /* rarch_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rarch_wrapper.h; sourceTree = ""; }; + 96C19C2816D5A56400FE8D5A /* browser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = browser.m; sourceTree = ""; }; 96CF015B16C2F72900ABF9C9 /* ios_input.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ios_input.c; sourceTree = ""; }; /* End PBXFileReference section */ @@ -550,6 +552,7 @@ isa = PBXGroup; children = ( 96C19C2516D455BE00FE8D5A /* browser.h */, + 96C19C2816D5A56400FE8D5A /* browser.m */, 96C19C2116D2F3BA00FE8D5A /* RADirectoryFilterList.m */, 96C19C2316D453BA00FE8D5A /* RADirectoryGrid.m */, 963F5AC416CC523B009BBD19 /* RADirectoryList.m */, @@ -687,6 +690,7 @@ 96096DD816D1ABAF00BF4499 /* RAModuleInfoList.m in Sources */, 96C19C2216D2F3BA00FE8D5A /* RADirectoryFilterList.m in Sources */, 96C19C2416D453BA00FE8D5A /* RADirectoryGrid.m in Sources */, + 96C19C2916D5A56500FE8D5A /* browser.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/RetroArch/RADirectoryGrid.m b/ios/RetroArch/RADirectoryGrid.m index 63fff44843..1bd0403d3d 100644 --- a/ios/RetroArch/RADirectoryGrid.m +++ b/ios/RetroArch/RADirectoryGrid.m @@ -18,19 +18,9 @@ - (id)initWithPath:(NSString*)path filter:(NSRegularExpression*)regex { - UICollectionViewFlowLayout* layout = [UICollectionViewFlowLayout new]; - layout.itemSize = CGSizeMake(175, 248); - self = [super initWithCollectionViewLayout:layout]; - - if (path == nil) - { - if (ra_ios_is_directory(@"/var/mobile/RetroArchGames")) path = @"/var/mobile/RetroArchGames"; - else if (ra_ios_is_directory(@"/var/mobile")) path = @"/var/mobile"; - else path = @"/"; - } - - _path = path; + _path = path ? path : ra_ios_get_browser_root(); + // Load template image NSString* templateName = [NSString stringWithFormat:@"%@/.coverart/template.png", _path]; _templateImage = [UIImage imageWithContentsOfFile:templateName]; @@ -40,29 +30,12 @@ _templateImage = [RetroArch_iOS get].file_icon; } - _list = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:_path error:nil]; - _list = [_path stringsByAppendingPaths:_list]; - - if (regex) - { - _list = [_list filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^(id object, NSDictionary* bindings) - { - if (ra_ios_is_directory(object)) - return YES; - - return (BOOL)([regex numberOfMatchesInString:[object lastPathComponent] options:0 range:NSMakeRange(0, [[object lastPathComponent] length])] != 0); - }]]; - } - - _list = [_list sortedArrayUsingComparator:^(id left, id right) - { - const BOOL left_is_dir = ra_ios_is_directory((NSString*)left); - const BOOL right_is_dir = ra_ios_is_directory((NSString*)right); - - return (left_is_dir != right_is_dir) ? - (left_is_dir ? -1 : 1) : - ([left caseInsensitiveCompare:right]); - }]; + // + UICollectionViewFlowLayout* layout = [UICollectionViewFlowLayout new]; + layout.itemSize = _templateImage.size; + self = [super initWithCollectionViewLayout:layout]; + + _list = ra_ios_list_directory(_path, regex); self.navigationItem.rightBarButtonItem = [RetroArch_iOS get].settings_button; [self setTitle: [_path lastPathComponent]]; @@ -88,13 +61,9 @@ NSString* path = [_list objectAtIndex: indexPath.row]; if(ra_ios_is_directory(path)) - { [[RetroArch_iOS get] pushViewController:[RADirectoryList directoryListWithPath:path]]; - } else - { [[RetroArch_iOS get] runGame:path]; - } } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath diff --git a/ios/RetroArch/RADirectoryList.m b/ios/RetroArch/RADirectoryList.m index d04c52686a..439d0e58b9 100644 --- a/ios/RetroArch/RADirectoryList.m +++ b/ios/RetroArch/RADirectoryList.m @@ -8,18 +8,6 @@ #import "browser.h" -BOOL ra_ios_is_file(NSString* path) -{ - return [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:nil]; -} - -BOOL ra_ios_is_directory(NSString* path) -{ - BOOL result = NO; - [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&result]; - return result; -} - static NSString* check_path(NSString* path) { if (path && !ra_ios_is_directory(path)) @@ -62,38 +50,8 @@ static NSString* check_path(NSString* path) { self = [super initWithStyle:UITableViewStylePlain]; - if (path == nil) - { - if (ra_ios_is_directory(@"/var/mobile/RetroArchGames")) path = @"/var/mobile/RetroArchGames"; - else if (ra_ios_is_directory(@"/var/mobile")) path = @"/var/mobile"; - else path = @"/"; - } - - _path = path; - - _list = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:_path error:nil]; - _list = [_path stringsByAppendingPaths:_list]; - - if (regex) - { - _list = [_list filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^(id object, NSDictionary* bindings) - { - if (ra_ios_is_directory(object)) - return YES; - - return (BOOL)([regex numberOfMatchesInString:[object lastPathComponent] options:0 range:NSMakeRange(0, [[object lastPathComponent] length])] != 0); - }]]; - } - - _list = [_list sortedArrayUsingComparator:^(id left, id right) - { - const BOOL left_is_dir = ra_ios_is_directory((NSString*)left); - const BOOL right_is_dir = ra_ios_is_directory((NSString*)right); - - return (left_is_dir != right_is_dir) ? - (left_is_dir ? -1 : 1) : - ([left caseInsensitiveCompare:right]); - }]; + _path = path ? path : ra_ios_get_browser_root(); + _list = ra_ios_list_directory(_path, regex); self.navigationItem.rightBarButtonItem = [RetroArch_iOS get].settings_button; [self setTitle: [_path lastPathComponent]]; diff --git a/ios/RetroArch/browser.h b/ios/RetroArch/browser.h index 464897108d..d2f648e199 100644 --- a/ios/RetroArch/browser.h +++ b/ios/RetroArch/browser.h @@ -1,5 +1,7 @@ extern BOOL ra_ios_is_directory(NSString* path); extern BOOL ra_ios_is_file(NSString* path); +extern NSArray* ra_ios_list_directory(NSString* path, NSRegularExpression* regex); +extern NSString* ra_ios_get_browser_root(); @interface RADirectoryGrid : UICollectionViewController - (id)initWithPath:(NSString*)path filter:(NSRegularExpression*)regex; diff --git a/ios/RetroArch/browser.m b/ios/RetroArch/browser.m new file mode 100644 index 0000000000..71f11fddf9 --- /dev/null +++ b/ios/RetroArch/browser.m @@ -0,0 +1,47 @@ +BOOL ra_ios_is_file(NSString* path) +{ + return [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:nil]; +} + +BOOL ra_ios_is_directory(NSString* path) +{ + BOOL result = NO; + [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&result]; + return result; +} + +NSArray* ra_ios_list_directory(NSString* path, NSRegularExpression* regex) +{ + NSArray* result = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil]; + result = [path stringsByAppendingPaths:result]; + + if (regex) + { + result = [result filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^(id object, NSDictionary* bindings) + { + if (ra_ios_is_directory(object)) + return YES; + + return (BOOL)([regex numberOfMatchesInString:[object lastPathComponent] options:0 range:NSMakeRange(0, [[object lastPathComponent] length])] != 0); + }]]; + } + + result = [result sortedArrayUsingComparator:^(id left, id right) + { + const BOOL left_is_dir = ra_ios_is_directory((NSString*)left); + const BOOL right_is_dir = ra_ios_is_directory((NSString*)right); + + return (left_is_dir != right_is_dir) ? + (left_is_dir ? -1 : 1) : + ([left caseInsensitiveCompare:right]); + }]; + + return result; +} + +NSString* ra_ios_get_browser_root() +{ + if (ra_ios_is_directory(@"/var/mobile/RetroArchGames")) return @"/var/mobile/RetroArchGames"; + else if (ra_ios_is_directory(@"/var/mobile")) return @"/var/mobile"; + else return @"/"; +}