selectdirectory.mm 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * selectdirectory.mm, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "selectdirectory.h"
  11. #include <QEventLoop>
  12. #import <UIKit/UIKit.h>
  13. #import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
  14. #import <MobileCoreServices/MobileCoreServices.h>
  15. @interface ObjcDocumentPickerDelegate : NSObject <UIDocumentPickerDelegate>
  16. @property (nonatomic, assign, readonly) QEventLoop & eventLoop;
  17. @property (nonatomic, copy, nullable) NSURL * selectedDirectoryURL;
  18. @end
  19. @implementation ObjcDocumentPickerDelegate
  20. {
  21. QEventLoop _eventLoop;
  22. }
  23. - (QEventLoop &)eventLoop { return _eventLoop; }
  24. - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls
  25. {
  26. self.selectedDirectoryURL = urls.firstObject;
  27. _eventLoop.exit();
  28. }
  29. - (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller
  30. {
  31. _eventLoop.exit();
  32. }
  33. @end
  34. static ObjcDocumentPickerDelegate * documentPickerDelegate;
  35. SelectDirectory::~SelectDirectory()
  36. {
  37. [documentPickerDelegate.selectedDirectoryURL stopAccessingSecurityScopedResource];
  38. documentPickerDelegate = nil;
  39. }
  40. QString SelectDirectory::getExistingDirectory()
  41. {
  42. documentPickerDelegate = [ObjcDocumentPickerDelegate new];
  43. UIDocumentPickerViewController * documentPickerVc;
  44. if(@available(iOS 14.0, *))
  45. documentPickerVc = [[UIDocumentPickerViewController alloc] initForOpeningContentTypes:@[UTTypeFolder]];
  46. else
  47. documentPickerVc = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[(__bridge NSString *)kUTTypeFolder] inMode:UIDocumentPickerModeOpen];
  48. documentPickerVc.allowsMultipleSelection = NO;
  49. documentPickerVc.delegate = documentPickerDelegate;
  50. [UIApplication.sharedApplication.keyWindow.rootViewController presentViewController:documentPickerVc animated:YES completion:nil];
  51. documentPickerDelegate.eventLoop.exec(QEventLoop::DialogExec);
  52. if(!documentPickerDelegate.selectedDirectoryURL)
  53. return {};
  54. [documentPickerDelegate.selectedDirectoryURL startAccessingSecurityScopedResource];
  55. return QString::fromNSString(documentPickerDelegate.selectedDirectoryURL.path);
  56. }