1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00
vcmi/launcher/ios/selectdirectory.mm

73 lines
2.2 KiB
Plaintext

/*
* 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 <QEventLoop>
#import <UIKit/UIKit.h>
#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
#import <MobileCoreServices/MobileCoreServices.h>
@interface ObjcDocumentPickerDelegate : NSObject <UIDocumentPickerDelegate>
@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<NSURL *> *)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);
}