/* * selectdirectory.mm, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #include "selectdirectory.h" #include #import #import #import @interface ObjcDocumentPickerDelegate : NSObject @property (nonatomic, assign, readonly) QEventLoop & eventLoop; @property (nonatomic, copy, nullable) NSURL * selectedDirectoryURL; @end @implementation ObjcDocumentPickerDelegate { QEventLoop _eventLoop; } - (QEventLoop &)eventLoop { return _eventLoop; } - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls { self.selectedDirectoryURL = urls.firstObject; _eventLoop.exit(); } - (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller { _eventLoop.exit(); } @end static ObjcDocumentPickerDelegate * documentPickerDelegate; SelectDirectory::~SelectDirectory() { [documentPickerDelegate.selectedDirectoryURL stopAccessingSecurityScopedResource]; documentPickerDelegate = nil; } QString SelectDirectory::getExistingDirectory() { documentPickerDelegate = [ObjcDocumentPickerDelegate new]; UIDocumentPickerViewController * documentPickerVc; if(@available(iOS 14.0, *)) documentPickerVc = [[UIDocumentPickerViewController alloc] initForOpeningContentTypes:@[UTTypeFolder]]; else documentPickerVc = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[(__bridge NSString *)kUTTypeFolder] inMode:UIDocumentPickerModeOpen]; documentPickerVc.allowsMultipleSelection = NO; documentPickerVc.delegate = documentPickerDelegate; [UIApplication.sharedApplication.keyWindow.rootViewController presentViewController:documentPickerVc animated:YES completion:nil]; documentPickerDelegate.eventLoop.exec(QEventLoop::DialogExec); if(!documentPickerDelegate.selectedDirectoryURL) return {}; [documentPickerDelegate.selectedDirectoryURL startAccessingSecurityScopedResource]; return QString::fromNSString(documentPickerDelegate.selectedDirectoryURL.path); }