File: selectdirectory.mm

package info (click to toggle)
vcmi 1.6.5%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 32,060 kB
  • sloc: cpp: 238,971; python: 265; sh: 224; xml: 157; ansic: 78; objc: 61; makefile: 49
file content (72 lines) | stat: -rw-r--r-- 2,261 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * 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);
}