From 2398a28af6f6c225c77b77bef422d1d2dec4a2bb Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 25 Jan 2023 20:53:01 +0200 Subject: SL-18996 [WIP] MacOS make picker dialogs non-modal to avoid disconnects #1 --- indra/newview/llfilepicker_mac.mm | 68 ++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 15 deletions(-) (limited to 'indra/newview/llfilepicker_mac.mm') diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index 1438e4dc0a..f6892f40fa 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -29,27 +29,22 @@ #include #include "llfilepicker_mac.h" -std::vector* doLoadDialog(const std::vector* allowed_types, - unsigned int flags) +NSOpenPanel *init_panel(const std::vector* allowed_types, unsigned int flags) { - int i, result; - - //Aura TODO: We could init a small window and release it at the end of this routine - //for a modeless interface. + int i; NSOpenPanel *panel = [NSOpenPanel openPanel]; - //NSString *fileName = nil; NSMutableArray *fileTypes = nil; - if ( allowed_types && !allowed_types->empty()) + if ( allowed_types && !allowed_types->empty()) { fileTypes = [[NSMutableArray alloc] init]; for (i=0;isize();++i) { - [fileTypes addObject: - [NSString stringWithCString:(*allowed_types)[i].c_str() + [fileTypes addObject: + [NSString stringWithCString:(*allowed_types)[i].c_str() encoding:[NSString defaultCStringEncoding]]]; } } @@ -62,21 +57,30 @@ std::vector* doLoadDialog(const std::vector* allowed_t [panel setCanChooseFiles: ( (flags & F_FILE)?true:false )]; [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; - std::vector* outfiles = NULL; - if (fileTypes) { [panel setAllowedFileTypes:fileTypes]; - result = [panel runModal]; } - else + else { // I suggest it's better to open the last path and let this default to home dir as necessary // for consistency with other OS X apps // //[panel setDirectoryURL: fileURLWithPath(NSHomeDirectory()) ]; - result = [panel runModal]; } + return panel; +} + +std::vector* doLoadDialog(const std::vector* allowed_types, + unsigned int flags) +{ + int result; + + NSOpenPanel *panel = init_panel(allowed_types,flags); + + result = [panel runModal]; + + std::vector* outfiles = NULL; if (result == NSOKButton) { @@ -97,6 +101,40 @@ std::vector* doLoadDialog(const std::vector* allowed_t return outfiles; } +void doLoadDialogModeless(const std::vector* allowed_types, + unsigned int flags, + void (*callback)(bool, std::vector &, void*), + void *userdata) +{ + // Note: might need to return and save this panel + // so that it does not close immediately + NSOpenPanel *panel = init_panel(allowed_types,flags); + + [panel beginWithCompletionHandler:^(NSModalResponse result) + { + if (result == NSOKButton) + { + std::vector outfiles; + NSArray *filesToOpen = [panel URLs]; + int i, count = [filesToOpen count]; + + if (count > 0) + { + + for (i=0; i Date: Thu, 26 Jan 2023 16:58:00 +0200 Subject: SL-18996 make MacOS picker dialogs modeless to avoid disconnects #2 --- indra/newview/llfilepicker_mac.mm | 50 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) (limited to 'indra/newview/llfilepicker_mac.mm') diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index f6892f40fa..8f5b3030db 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -112,9 +112,9 @@ void doLoadDialogModeless(const std::vector* allowed_types, [panel beginWithCompletionHandler:^(NSModalResponse result) { + std::vector outfiles; if (result == NSOKButton) { - std::vector outfiles; NSArray *filesToOpen = [panel URLs]; int i, count = [filesToOpen count]; @@ -128,11 +128,15 @@ void doLoadDialogModeless(const std::vector* allowed_types, } callback(true, outfiles, userdata); } - else + else // no valid result { callback(false, outfiles, userdata); } } + else // cancel + { + callback(false, outfiles, userdata); + } }]; } @@ -168,4 +172,46 @@ std::string* doSaveDialog(const std::string* file, return outfile; } +void doSaveDialogModeless(const std::string* file, + const std::string* type, + const std::string* creator, + const std::string* extension, + unsigned int flags, + void (*callback)(bool, std::string&, void*), + void *userdata) +{ + NSSavePanel *panel = [NSSavePanel savePanel]; + + NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; + NSArray *fileType = [extensionns componentsSeparatedByString:@","]; + + //[panel setMessage:@"Save Image File"]; + [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; + [panel setCanSelectHiddenExtension:true]; + [panel setAllowedFileTypes:fileType]; + NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; + + NSURL* url = [NSURL fileURLWithPath:fileName]; + [panel setNameFieldStringValue: fileName]; + [panel setDirectoryURL: url]; + + + [panel beginWithCompletionHandler:^(NSModalResponse result) + { + if (result == NSOKButton) + { + NSURL* url = [panel URL]; + NSString* p = [url path]; + std::string outfile([p UTF8String]); + + callback(true, outfile, userdata); + } + else // cancel + { + std::string outfile; + callback(false, outfile, userdata); + } + }]; +} + #endif -- cgit v1.2.3