Completed Import

Completed list state saving
This commit is contained in:
Akop Karapetyan 2019-12-06 23:17:35 -08:00 committed by tmaul
parent 310ad34a4e
commit 4b87fa68c3
7 changed files with 205 additions and 29 deletions

View File

@ -12,6 +12,7 @@
FE0A7E9D2393A1FF001E6997 /* FBScanner.mm in Sources */ = {isa = PBXBuildFile; fileRef = FE0A7E9C2393A1FE001E6997 /* FBScanner.mm */; };
FE0A7EA12394B87B001E6997 /* FBRomSetStatusAsNSImage.m in Sources */ = {isa = PBXBuildFile; fileRef = FE0A7E9F2394B87B001E6997 /* FBRomSetStatusAsNSImage.m */; };
FE0A7EA42394ED91001E6997 /* FBDropFileScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = FE0A7EA32394ED91001E6997 /* FBDropFileScrollView.m */; };
FE0A7EA7239501FF001E6997 /* FBImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = FE0A7EA5239501FF001E6997 /* FBImporter.m */; };
FE1B1092235615940065200C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FE1B1091235615940065200C /* AppDelegate.m */; };
FE1B1094235615950065200C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FE1B1093235615950065200C /* Assets.xcassets */; };
FE1B1097235615950065200C /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FE1B1095235615950065200C /* MainMenu.xib */; };
@ -1050,6 +1051,8 @@
FE0A7EA02394B87B001E6997 /* FBRomSetStatusAsNSImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBRomSetStatusAsNSImage.h; sourceTree = "<group>"; };
FE0A7EA22394ED90001E6997 /* FBDropFileScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBDropFileScrollView.h; sourceTree = "<group>"; };
FE0A7EA32394ED91001E6997 /* FBDropFileScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBDropFileScrollView.m; sourceTree = "<group>"; };
FE0A7EA5239501FF001E6997 /* FBImporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBImporter.m; sourceTree = "<group>"; };
FE0A7EA6239501FF001E6997 /* FBImporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBImporter.h; sourceTree = "<group>"; };
FE1B108D235615940065200C /* FinalBurn Neo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "FinalBurn Neo.app"; sourceTree = BUILT_PRODUCTS_DIR; };
FE1B1090235615940065200C /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
FE1B1091235615940065200C /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
@ -4645,6 +4648,8 @@
isa = PBXGroup;
children = (
FE1B287F235626280065200C /* burner_macos.h */,
FE0A7EA6239501FF001E6997 /* FBImporter.h */,
FE0A7EA5239501FF001E6997 /* FBImporter.m */,
FEED9E1A235845EE00B7AF83 /* FBMainThread.h */,
FEED9E1B235845EE00B7AF83 /* FBMainThread.mm */,
FE2BC6CF2362D5BD00B9D150 /* FBMainThread+Etc.mm */,
@ -5626,6 +5631,7 @@
FE1B25C923561A760065200C /* k051316.cpp in Sources */,
FE1B25AC23561A760065200C /* k056832.cpp in Sources */,
FE1B26B623561A770065200C /* d_mrdo.cpp in Sources */,
FE0A7EA7239501FF001E6997 /* FBImporter.m in Sources */,
FE1B27DD23561A790065200C /* mathbox.cpp in Sources */,
FE1B268E23561A770065200C /* d_bionicc.cpp in Sources */,
FE1B24BF23561A750065200C /* smssystem.cpp in Sources */,
@ -6129,7 +6135,7 @@
CODE_SIGN_ENTITLEMENTS = Emulator/FinalBurnNeo.entitlements;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(LOCAL_LIBRARY_DIR)/Frameworks",
@ -6142,7 +6148,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.13;
MARKETING_VERSION = 1.01;
MARKETING_VERSION = 1.02;
OTHER_CFLAGS = (
"-DINLINE=\"static inline\"",
"-DUSE_SPEEDHACKS",
@ -6189,7 +6195,7 @@
CODE_SIGN_ENTITLEMENTS = Emulator/FinalBurnNeo.entitlements;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(LOCAL_LIBRARY_DIR)/Frameworks",
@ -6202,7 +6208,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.13;
MARKETING_VERSION = 1.01;
MARKETING_VERSION = 1.02;
OTHER_CFLAGS = (
"-DINLINE=\"static inline\"",
"-DUSE_SPEEDHACKS",

View File

@ -9,6 +9,7 @@
#import <Cocoa/Cocoa.h>
#import "FBScanner.h"
#import "FBImporter.h"
#import "FBDropFileScrollView.h"
@interface FBLauncherItem: NSObject
@ -20,7 +21,7 @@
@end
@interface FBLauncherController : NSWindowController<FBScannerDelegate, FBDropFileScrollViewDelegate>
@interface FBLauncherController : NSWindowController<FBScannerDelegate, FBImporterDelegate, FBDropFileScrollViewDelegate>
{
IBOutlet NSPanel *progressPanel;
IBOutlet NSProgressIndicator *progressPanelBar;

View File

@ -33,11 +33,15 @@
- (NSString *) setCachePath;
- (NSSet<NSString *> *) supportedRomSets;
- (void) importFiles:(NSArray<NSString *> *) files;
- (void) initiateScan;
@end
@implementation FBLauncherController
{
FBScanner *scanner;
FBImporter *importer;
}
- (id) init
@ -54,8 +58,14 @@
if ([NSFileManager.defaultManager fileExistsAtPath:self.setCachePath]) {
// Restore from cache
NSArray<FBROMSet *> *cached = [NSKeyedUnarchiver unarchiveObjectWithFile:self.setCachePath];
if (cached)
if (cached) {
[self reloadSets:cached];
// Restore previous selection
NSData *data = [NSUserDefaults.standardUserDefaults objectForKey:@"selectedGame"];
romSetTreeController.selectionIndexPaths = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:data
error:nil];
}
}
if (_romSets.count == 0)
@ -70,9 +80,10 @@
- (void) windowWillClose:(NSNotification *) notification
{
@synchronized (self) {
[scanner cancel];
}
[NSUserDefaults.standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:romSetTreeController.selectionIndexPaths]
forKey:@"selectedGame"];
[importer cancel];
[scanner cancel];
}
#pragma mark - FBScannerDelegate
@ -87,16 +98,14 @@
completionHandler:^(NSModalResponse returnCode) { }];
}
- (void) progressDidUpdate:(float) progress
- (void) scanDidProgress:(float) progress
{
progressPanelBar.doubleValue = progress;
}
- (void) scanDidEnd:(NSArray<FBROMSet *> *) romSets
{
@synchronized (self) {
scanner = nil;
}
scanner = nil;
[self.window endSheet:progressPanel];
@ -110,6 +119,37 @@
[self reloadSets:romSets];
}
#pragma mark - FBImporterDelegate
- (void) importDidStart
{
progressPanelBar.doubleValue = 0;
progressPanelLabel.stringValue = NSLocalizedString(@"Importing...", nil);
progressPanelCancelButton.enabled = YES;
[self.window beginSheet:progressPanel
completionHandler:^(NSModalResponse returnCode) { }];
}
- (void) importDidProgress:(float) progress
{
progressPanelBar.doubleValue = progress;
}
- (void) importDidEnd:(BOOL) isCancelled
filesCopied:(int) count
{
importer = nil;
NSLog(@"Import complete; %d files copied", count);
[self.window endSheet:progressPanel];
if (isCancelled || count < 1)
return;
[self rescanSets:self];
}
#pragma mark - FBDropFileScrollView
- (BOOL) isDropAcceptable:(NSArray<NSString *> *) paths
@ -117,12 +157,16 @@
__block BOOL acceptable = YES;
NSSet<NSString *> *supportedFormats = self.appDelegate.supportedFormats;
NSSet<NSString *> *supportedArchives = self.supportedRomSets;
NSString *romPath = self.appDelegate.romPath;
[paths enumerateObjectsUsingBlock:^(NSString *path, NSUInteger idx, BOOL *stop) {
NSString *filename = path.lastPathComponent;
NSString *parent = path.stringByDeletingLastPathComponent.stringByResolvingSymlinksInPath;
// Check extension && archive name
if (![supportedFormats containsObject:filename.pathExtension]
|| ![supportedArchives containsObject:filename.stringByDeletingPathExtension]) {
|| ![supportedArchives containsObject:filename.stringByDeletingPathExtension]
|| [parent isEqualToString:romPath]) {
acceptable = NO;
*stop = YES;
}
@ -133,21 +177,14 @@
- (void) dropDidComplete:(NSArray<NSString *> *) paths
{
// FIXME
[self importFiles:paths];
}
#pragma mark - Actions
- (void) rescanSets:(id) sender
{
@synchronized (self) {
if (!scanner) {
scanner = [FBScanner new];
scanner.rootPath = AppDelegate.sharedInstance.romPath;
scanner.delegate = self;
[scanner start];
}
}
[self initiateScan];
}
- (void) cancelProgress:(id) sender
@ -155,9 +192,8 @@
progressPanelCancelButton.enabled = NO;
progressPanelLabel.stringValue = NSLocalizedString(@"Cancelling...", nil);
@synchronized (self) {
[scanner cancel];
}
[importer cancel];
[scanner cancel];
}
- (void) launchSet:(id) sender
@ -179,6 +215,9 @@
- (void) reloadSets:(NSArray<FBROMSet *> *) romSets
{
// Save current selection
NSArray<NSIndexPath *> *selection = romSetTreeController.selectionIndexPaths;
// Clear the master list
[(NSMutableArray *) _romSets removeAllObjects];
@ -211,6 +250,9 @@
}];
[romSetTreeController rearrangeObjects];
// Restore selection
romSetTreeController.selectionIndexPaths = selection;
}
- (NSString *) setCachePath
@ -231,4 +273,29 @@
return set;
}
- (void) importFiles:(NSArray<NSString *> *) files
{
if (scanner || importer)
return;
importer = [FBImporter new];
importer.destinationPath = AppDelegate.sharedInstance.romPath;
importer.sourcePaths = files;
importer.delegate = self;
[importer start];
}
- (void) initiateScan
{
if (scanner || importer)
return;
scanner = [FBScanner new];
scanner.rootPath = AppDelegate.sharedInstance.romPath;
scanner.delegate = self;
[scanner start];
}
@end

View File

@ -0,0 +1,28 @@
//
// FBImporter.h
// Emulator
//
// Created by Akop Karapetyan on 12/02/19.
// Copyright © 2019 Akop Karapetyan. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol FBImporterDelegate<NSObject>
@optional
- (void) importDidStart;
- (void) importDidProgress:(float) progress;
- (void) importDidEnd:(BOOL) isCancelled
filesCopied:(int) count;
@end
@interface FBImporter : NSThread
@property NSArray<NSString *> *sourcePaths;
@property NSString *destinationPath;
@property (nonatomic, weak) id<FBImporterDelegate> delegate;
@end

View File

@ -0,0 +1,74 @@
//
// FBImporter.m
// Emulator
//
// Created by Akop Karapetyan on 12/02/19.
// Copyright © 2019 Akop Karapetyan. All rights reserved.
//
#import "FBImporter.h"
#pragma mark - FBImporter
@implementation FBImporter
{
}
- (instancetype) init
{
if (self = [super init]) {
}
return self;
}
#pragma mark - NSThread
- (void) main
{
NSArray<NSString *> *sourcePaths = [NSArray arrayWithArray:_sourcePaths];
NSString *destinationPath = _destinationPath;
if (!sourcePaths || sourcePaths.count == 0 || !destinationPath)
return;
id<FBImporterDelegate> del = _delegate;
if ([del respondsToSelector:@selector(importDidStart)])
dispatch_async(dispatch_get_main_queue(), ^{ [del importDidStart]; });
__block int filesCopied = 0;
[sourcePaths enumerateObjectsUsingBlock:^(NSString *source, NSUInteger idx, BOOL *stop) {
NSString *sourceFilename = source.lastPathComponent;
NSURL *destinationUrl = [NSURL fileURLWithPath:[destinationPath stringByAppendingPathComponent:sourceFilename]];
// FIXME...
NSError *error = nil;
// Trash any existing file
[NSFileManager.defaultManager trashItemAtURL:destinationUrl
resultingItemURL:nil
error:&error];
// Copy new file to destination
BOOL copyOK = [NSFileManager.defaultManager copyItemAtURL:[NSURL fileURLWithPath:source]
toURL:destinationUrl
error:&error];
if (self.isCancelled)
*stop = YES;
if (copyOK)
filesCopied++;
id<FBImporterDelegate> del = _delegate;
if ([del respondsToSelector:@selector(importDidProgress:)])
dispatch_async(dispatch_get_main_queue(), ^{
[del importDidProgress:(float) idx / sourcePaths.count];
});
}];
del = _delegate;
if ([del respondsToSelector:@selector(importDidEnd:filesCopied:)])
dispatch_async(dispatch_get_main_queue(), ^{
[del importDidEnd:self.isCancelled
filesCopied:filesCopied];
});
}
@end

View File

@ -24,7 +24,7 @@
@optional
- (void) scanDidStart;
- (void) progressDidUpdate:(float) progress;
- (void) scanDidProgress:(float) progress;
- (void) scanDidEnd:(NSArray<FBROMSet *> *) romSets;
@end

View File

@ -88,9 +88,9 @@
continue;
del = _delegate;
if ([del respondsToSelector:@selector(progressDidUpdate:)])
if ([del respondsToSelector:@selector(scanDidProgress:)])
dispatch_async(dispatch_get_main_queue(), ^{
[del progressDidUpdate:(float)i/nBurnDrvCount];
[del scanDidProgress:(float)i/nBurnDrvCount];
});
nBurnDrvActive = i;