2017-10-31 07:35:57 -04:00
|
|
|
|
#import <SDWebImage/UIImageView+WebCache.h>
|
2015-08-15 03:08:32 -04:00
|
|
|
|
#import "CoverViewController.h"
|
|
|
|
|
#import "EmulatorViewController.h"
|
2017-10-31 07:35:57 -04:00
|
|
|
|
#import "../ui_shared/BootablesProcesses.h"
|
|
|
|
|
#import "../ui_shared/BootablesDbClient.h"
|
|
|
|
|
#import "PathUtils.h"
|
2015-08-17 12:48:29 -04:00
|
|
|
|
#import "BackgroundLayer.h"
|
2015-08-31 14:59:13 -04:00
|
|
|
|
#import "CoverViewCell.h"
|
2015-08-15 03:08:32 -04:00
|
|
|
|
|
|
|
|
|
@interface CoverViewController ()
|
|
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
@implementation CoverViewController
|
|
|
|
|
|
2017-10-31 07:35:57 -04:00
|
|
|
|
static NSString* const reuseIdentifier = @"coverCell";
|
2015-08-15 03:08:32 -04:00
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (void)viewDidLoad
|
2017-10-31 07:35:57 -04:00
|
|
|
|
{
|
|
|
|
|
[super viewDidLoad];
|
2020-12-02 18:37:31 -05:00
|
|
|
|
|
2017-10-31 07:35:57 -04:00
|
|
|
|
assert(_bootables == nullptr);
|
|
|
|
|
_bootables = new BootableArray(BootablesDb::CClient::GetInstance().GetBootables());
|
|
|
|
|
|
|
|
|
|
CAGradientLayer* bgLayer = [BackgroundLayer blueGradient];
|
2015-08-17 12:48:29 -04:00
|
|
|
|
bgLayer.frame = self.view.bounds;
|
2020-12-02 18:37:31 -05:00
|
|
|
|
[self.view.layer insertSublayer:bgLayer atIndex:0];
|
2015-08-15 03:08:32 -04:00
|
|
|
|
|
2017-10-31 07:35:57 -04:00
|
|
|
|
self.collectionView.allowsMultipleSelection = NO;
|
2020-01-04 01:20:25 -05:00
|
|
|
|
if(@available(iOS 11.0, *))
|
|
|
|
|
{
|
|
|
|
|
self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAlways;
|
|
|
|
|
}
|
2017-10-31 07:35:57 -04:00
|
|
|
|
}
|
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (void)viewDidUnload
|
2017-10-31 07:35:57 -04:00
|
|
|
|
{
|
|
|
|
|
assert(_bootables != nullptr);
|
|
|
|
|
delete _bootables;
|
2020-12-02 18:37:31 -05:00
|
|
|
|
|
2017-10-31 07:35:57 -04:00
|
|
|
|
[super viewDidUnload];
|
2015-08-15 03:08:32 -04:00
|
|
|
|
}
|
|
|
|
|
|
2021-11-06 09:33:56 -04:00
|
|
|
|
- (void)viewDidAppear:(BOOL)animated
|
|
|
|
|
{
|
|
|
|
|
UIAlertController* alert = [UIAlertController alertControllerWithTitle: @"Scanning" message: @"Please wait..." preferredStyle: UIAlertControllerStyleAlert];
|
|
|
|
|
[self presentViewController:alert animated:YES completion:nil];
|
|
|
|
|
|
|
|
|
|
dispatch_queue_t queue = dispatch_queue_create("play_startup", NULL);
|
|
|
|
|
dispatch_async(queue, ^{
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
alert.title = @"Scanning local games...";
|
|
|
|
|
});
|
|
|
|
|
ScanBootables(Framework::PathUtils::GetPersonalDataPath());
|
|
|
|
|
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
alert.title = @"Scanning games on all device...";
|
|
|
|
|
});
|
|
|
|
|
ScanBootables("/private/var/mobile");
|
|
|
|
|
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
alert.title = @"Purging inexisting files...";
|
|
|
|
|
});
|
|
|
|
|
PurgeInexistingFiles();
|
|
|
|
|
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
alert.title = @"Fetching game titles...";
|
|
|
|
|
});
|
|
|
|
|
FetchGameTitles();
|
|
|
|
|
|
|
|
|
|
//Done
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
[alert dismissViewControllerAnimated: YES completion: nil];
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
|
2015-08-17 12:48:29 -04:00
|
|
|
|
{
|
|
|
|
|
// resize your layers based on the view’s new bounds
|
2020-12-02 18:37:31 -05:00
|
|
|
|
[[[self.view.layer sublayers] objectAtIndex:0] setFrame:self.view.bounds];
|
2015-08-17 12:48:29 -04:00
|
|
|
|
}
|
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (BOOL)shouldAutorotate
|
2017-10-31 07:35:57 -04:00
|
|
|
|
{
|
|
|
|
|
if([self isViewLoaded] && self.view.window)
|
|
|
|
|
{
|
2015-08-17 12:48:29 -04:00
|
|
|
|
return YES;
|
2017-10-31 07:35:57 -04:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2015-08-17 12:48:29 -04:00
|
|
|
|
return NO;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-15 03:08:32 -04:00
|
|
|
|
#pragma mark <UICollectionViewDataSource>
|
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView
|
2017-10-31 07:35:57 -04:00
|
|
|
|
{
|
|
|
|
|
return 1;
|
2015-08-15 03:08:32 -04:00
|
|
|
|
}
|
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (NSString*)collectionView:(UICollectionView*)collectionView titleForHeaderInSection:(NSInteger)section
|
2015-08-15 12:44:56 -04:00
|
|
|
|
{
|
2017-10-31 07:35:57 -04:00
|
|
|
|
return @"";
|
2015-08-15 12:44:56 -04:00
|
|
|
|
}
|
2015-08-15 03:08:32 -04:00
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section
|
2017-10-31 07:35:57 -04:00
|
|
|
|
{
|
|
|
|
|
return _bootables->size();
|
2015-08-15 03:08:32 -04:00
|
|
|
|
}
|
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath
|
2017-10-31 07:35:57 -04:00
|
|
|
|
{
|
2020-12-02 18:37:31 -05:00
|
|
|
|
CoverViewCell* cell = (CoverViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
|
|
|
|
|
|
2017-10-31 07:35:57 -04:00
|
|
|
|
auto bootable = (*_bootables)[indexPath.row];
|
2020-12-02 18:37:31 -05:00
|
|
|
|
UIImage* placeholder = [UIImage imageNamed:@"boxart.png"];
|
|
|
|
|
cell.nameLabel.text = [NSString stringWithUTF8String:bootable.title.c_str()];
|
|
|
|
|
cell.backgroundView = [[UIImageView alloc] initWithImage:placeholder];
|
|
|
|
|
|
2017-10-31 07:35:57 -04:00
|
|
|
|
if(!bootable.coverUrl.empty())
|
|
|
|
|
{
|
2020-12-02 18:37:31 -05:00
|
|
|
|
NSString* coverUrl = [NSString stringWithUTF8String:bootable.coverUrl.c_str()];
|
|
|
|
|
[(UIImageView*)cell.backgroundView sd_setImageWithURL:[NSURL URLWithString:coverUrl] placeholderImage:placeholder];
|
2015-08-31 14:59:13 -04:00
|
|
|
|
}
|
2020-12-02 18:37:31 -05:00
|
|
|
|
|
2017-10-31 07:35:57 -04:00
|
|
|
|
return cell;
|
2015-08-15 03:08:32 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma mark <UICollectionViewDelegate>
|
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
|
2015-08-15 04:06:15 -04:00
|
|
|
|
{
|
2020-12-02 18:37:31 -05:00
|
|
|
|
if([segue.identifier isEqualToString:@"showEmulator"])
|
2017-10-31 07:35:57 -04:00
|
|
|
|
{
|
2020-12-02 18:37:31 -05:00
|
|
|
|
NSIndexPath* indexPath = [[self.collectionView indexPathsForSelectedItems] objectAtIndex:0];
|
2017-10-31 07:35:57 -04:00
|
|
|
|
auto bootable = (*_bootables)[indexPath.row];
|
|
|
|
|
BootablesDb::CClient::GetInstance().SetLastBootedTime(bootable.path, time(nullptr));
|
|
|
|
|
EmulatorViewController* emulatorViewController = segue.destinationViewController;
|
2020-12-02 18:37:31 -05:00
|
|
|
|
emulatorViewController.bootablePath = [NSString stringWithUTF8String:bootable.path.native().c_str()];
|
|
|
|
|
[self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
|
2017-10-31 07:35:57 -04:00
|
|
|
|
}
|
2015-08-15 03:08:32 -04:00
|
|
|
|
}
|
|
|
|
|
|
2020-12-02 18:37:31 -05:00
|
|
|
|
- (IBAction)onExit:(id)sender
|
2018-10-26 08:14:14 -04:00
|
|
|
|
{
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-15 03:08:32 -04:00
|
|
|
|
@end
|