changeset 2415:f33a81fa29e9

iOS: Implment dw_file_browse() and fix issues in dw_color_choose().
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 02 Apr 2021 02:17:59 +0000
parents 5e5fab842901
children 353581ebf4a5
files ios/dw.m
diffstat 1 files changed, 81 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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 <UIDocumentPickerDelegate>
+{
+    DWDialog *dialog;
+}
+-(void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls;
+-(void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller;
+-(void)setDialog:(DWDialog *)newdialog;
+@end
+
+@implementation DWDocumentPickerDelegate
+-(void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)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;
 }
 
 /*