# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1617329879 0 # Node ID f33a81fa29e964ee416336ce330345f30d3c3113 # Parent 5e5fab842901a58ef698ca2dcb0159fcf880923d iOS: Implment dw_file_browse() and fix issues in dw_color_choose(). diff -r 5e5fab842901 -r f33a81fa29e9 ios/dw.m --- a/ios/dw.m Fri Apr 02 00:44:17 2021 +0000 +++ b/ios/dw.m Fri Apr 02 02:17:59 2021 +0000 @@ -915,10 +915,38 @@ } else dw_dialog_dismiss(dialog, NULL); + [viewController dismissViewControllerAnimated:YES completion:nil]; } -(void)colorPickerViewControllerDidFinish:(UIColorPickerViewController *)viewController API_AVAILABLE(ios(14.0)) { dw_dialog_dismiss(dialog, NULL); + [viewController dismissViewControllerAnimated:YES completion:nil]; +} +-(void)setDialog:(DWDialog *)newdialog { dialog = newdialog; } +@end + +@interface DWDocumentPickerDelegate : UIResponder +{ + DWDialog *dialog; +} +-(void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls; +-(void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller; +-(void)setDialog:(DWDialog *)newdialog; +@end + +@implementation DWDocumentPickerDelegate +-(void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls +{ + NSURL *url = [urls firstObject]; + char *file = NULL; + + if(url && [[url absoluteString] length] > 0) + file = strdup([[url absoluteString] UTF8String]); + dw_dialog_dismiss(dialog, file); +} +-(void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller +{ + dw_dialog_dismiss(dialog, NULL); } -(void)setDialog:(DWDialog *)newdialog { dialog = newdialog; } @end @@ -960,6 +988,8 @@ UIColorPickerViewController *picker = [[UIColorPickerViewController alloc] init]; DWColorPickerDelegate *delegate = [[DWColorPickerDelegate alloc] init]; + /* Setup our picker */ + [picker setSupportsAlpha:NO]; /* Unhide our hidden window and make it key */ [hiddenWindow setHidden:NO]; [hiddenWindow makeKeyAndVisible]; @@ -977,7 +1007,6 @@ // Fallback on earlier versions }; } - -(void)fontPicker:(NSPointerArray *)params { DWDialog *dialog = dw_dialog_new(NULL); @@ -1008,6 +1037,46 @@ [picker release]; [delegate release]; } +-(void)filePicker:(NSPointerArray *)params +{ + DWDialog *dialog = dw_dialog_new(NULL); + UIDocumentPickerViewController *picker ; + DWDocumentPickerDelegate *delegate = [[DWDocumentPickerDelegate alloc] init]; + UIDocumentPickerMode mode = UIDocumentPickerModeOpen; + char *defpath = [params pointerAtIndex:0]; + char *ext = [params pointerAtIndex:1]; + int flags = DW_POINTER_TO_INT([params pointerAtIndex:2]); + char *file = NULL; + NSArray *UTIs; + + /* Setup the picker */ + if(flags & DW_FILE_SAVE) + mode = UIDocumentPickerModeExportToService; + /* Try to generate a UTI for our passed extension */ + if(ext) + UTIs = [NSArray arrayWithObject:[NSString stringWithFormat:@"public.%s", ext]]; + else + UTIs = @[@"public.text"]; + picker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:UTIs inMode:mode]; + [picker setAllowsMultipleSelection:NO]; + [picker setShouldShowFileExtensions:YES]; + if(defpath) + [picker setDirectoryURL:[NSURL URLWithString:[NSString stringWithUTF8String:defpath]]]; + /* Unhide our hidden window and make it key */ + [hiddenWindow setHidden:NO]; + [hiddenWindow makeKeyAndVisible]; + [delegate setDialog:dialog]; + [picker setDelegate:delegate]; + /* Wait for them to pick a color */ + [[hiddenWindow rootViewController] presentViewController:picker animated:YES completion:nil]; + file = dw_dialog_wait(dialog); + /* Once the dialog is gone we can rehide our window */ + [hiddenWindow resignKeyWindow]; + [hiddenWindow setHidden:YES]; + [params addPointer:file]; + [picker release]; + [delegate release]; +} -(void)messageBox:(NSMutableArray *)params { __block DWDialog *dialog = dw_dialog_new(NULL); @@ -2850,7 +2919,17 @@ */ char * API dw_file_browse(const char *title, const char *defpath, const char *ext, int flags) { - return NULL; + NSPointerArray *params = [[NSPointerArray pointerArrayWithOptions:NSPointerFunctionsOpaqueMemory] retain]; + char *file = NULL; + + [params addPointer:(void *)defpath]; + [params addPointer:(void *)ext]; + [params addPointer:DW_INT_TO_POINTER(flags)]; + [DWObj safeCall:@selector(filePicker:) withObject:params]; + if([params count] > 3) + file = [params pointerAtIndex:3]; + + return file; } /*