X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=ConfigsController.m;h=d38ada85fed674d0dc2fe8e2c93bc3959f8a11c1;hp=1c100f2c9809949a2976913646ba0a391a68974c;hb=aaab00fd866af505e9a5e454f1aeb3e298fd38e3;hpb=f9903acac24bb4be43e370d5f3eb942510f727e1 diff --git a/ConfigsController.m b/ConfigsController.m index 1c100f2..d38ada8 100644 --- a/ConfigsController.m +++ b/ConfigsController.m @@ -155,18 +155,25 @@ [stream close]; if (!([serialization isKindOfClass:NSDictionary.class] - && serialization[@"entries"])) { + && [serialization[@"name"] isKindOfClass:NSString.class] + && [serialization[@"entries"] isKindOfClass:NSDictionary.class])) { *error = [NSError errorWithDomain:@"Enjoyable" - code:0 - description:@"This isn't a valid mapping file."]; + code:0 + description:@"This isn't a valid mapping file."]; return nil; } NSDictionary *entries = serialization[@"entries"]; Config *cfg = [[Config alloc] initWithName:serialization[@"name"]]; - for (id key in entries) - cfg.entries[key] = [Target targetDeserialize:entries[key] - withConfigs:_configs]; + for (id key in entries) { + NSDictionary *value = entries[key]; + if ([key isKindOfClass:NSString.class]) { + Target *target = [Target targetDeserialize:value + withConfigs:_configs]; + if (target) + cfg.entries[key] = target; + } + } return cfg; } @@ -231,10 +238,11 @@ } if (error) { - [[NSAlert alertWithError:error] beginSheetModalForWindow:window - modalDelegate:nil - didEndSelector:nil - contextInfo:nil]; + [window presentError:error + modalForWindow:window + delegate:nil + didPresentSelector:nil + contextInfo:nil]; } }]; @@ -248,27 +256,23 @@ NSWindow *window = NSApplication.sharedApplication.keyWindow; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { - if (result == NSFileHandlingPanelOKButton) { - NSError *error; - NSDictionary *serialization = [cfg serialize]; - NSData *json = [NSJSONSerialization dataWithJSONObject:serialization - options:NSJSONWritingPrettyPrinted - error:&error]; - if (!error) - [json writeToURL:panel.URL options:NSDataWritingAtomic error:&error]; - - if (error) { - // FIXME: Ideally, this sheet is attached to the - // panel, and the panel doesn't close, so you - // can maybe fix what is wrong and try saving - // again. But it seems to be impossible to force - // the panel to stay open. - [panel close]; - [[NSAlert alertWithError:error] beginSheetModalForWindow:window - modalDelegate:nil - didEndSelector:nil - contextInfo:nil]; - } + if (result != NSFileHandlingPanelOKButton) + return; + [panel close]; + NSError *error; + NSDictionary *serialization = [cfg serialize]; + NSData *json = [NSJSONSerialization dataWithJSONObject:serialization + options:NSJSONWritingPrettyPrinted + error:&error]; + if (!error) + [json writeToURL:panel.URL options:NSDataWritingAtomic error:&error]; + + if (error) { + [window presentError:error + modalForWindow:window + delegate:nil + didPresentSelector:nil + contextInfo:nil]; } }]; }