Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qiosdocumentpickercontroller.mm
Go to the documentation of this file.
1// Copyright (C) 2020 Harald Meyer.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#import <UIKit/UIKit.h>
5#import <MobileCoreServices/MobileCoreServices.h>
6
8
9@implementation QIOSDocumentPickerController {
10 QIOSFileDialog *m_fileDialog;
11}
12
13- (instancetype)initWithQIOSFileDialog:(QIOSFileDialog *)fileDialog
14{
15 NSMutableArray <UTType *> *docTypes = [[[NSMutableArray alloc] init] autorelease];
16
17 QStringList nameFilters = fileDialog->options()->nameFilters();
18 if (!nameFilters.isEmpty() && (fileDialog->options()->fileMode() != QFileDialogOptions::Directory
20 {
22 for (const QString &filter : nameFilters)
24
25 docTypes = [self computeAllowedFileTypes:results];
26 }
27
28 if (!docTypes.count) {
29 switch (fileDialog->options()->fileMode()) {
33 [docTypes addObject:UTTypeContent];
34 [docTypes addObject:UTTypeItem];
35 [docTypes addObject:UTTypeData];
36 break;
37 // Showing files is not supported in Directory mode in iOS
40 [docTypes addObject:UTTypeFolder];
41 break;
42 }
43 }
44
45 if (self = [super initForOpeningContentTypes:docTypes]) {
46 m_fileDialog = fileDialog;
47 self.modalPresentationStyle = UIModalPresentationFormSheet;
48 self.delegate = self;
49 self.presentationController.delegate = self;
50
51 if (m_fileDialog->options()->fileMode() == QFileDialogOptions::ExistingFiles)
52 self.allowsMultipleSelection = YES;
53
54 self.directoryURL = m_fileDialog->options()->initialDirectory().toNSURL();
55 }
56 return self;
57}
58
59- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray <NSURL *>*)urls
60{
61 Q_UNUSED(controller);
62
63 QList<QUrl> files;
64 for (NSURL* url in urls)
65 files.append(QUrl::fromNSURL(url));
66
67 m_fileDialog->selectedFilesChanged(files);
68 emit m_fileDialog->accept();
69}
70
71- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller
72{
73 Q_UNUSED(controller);
74 emit m_fileDialog->reject();
75}
76
77- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
78{
79 Q_UNUSED(presentationController);
80
81 // "Called on the delegate when the user has taken action to dismiss the
82 // presentation successfully, after all animations are finished.
83 // This is not called if the presentation is dismissed programmatically."
84
85 // So if document picker's view was dismissed, for example by swiping it away,
86 // we got this method called. But not if the dialog was cancelled or a file
87 // was selected.
88 emit m_fileDialog->reject();
89}
90
91- (NSMutableArray<UTType*>*)computeAllowedFileTypes:(QStringList)filters
92{
93 QStringList fileTypes;
94 for (const QString &filter : filters) {
95 if (filter == (QLatin1String("*")))
96 continue;
97
98 if (filter.contains(u'?'))
99 continue;
100
101 if (filter.count(u'*') != 1)
102 continue;
103
104 auto extensions = filter.split('.', Qt::SkipEmptyParts);
105 fileTypes += extensions.last();
106 }
107
108 NSMutableArray<UTType *> *result = [NSMutableArray<UTType *> arrayWithCapacity:fileTypes.size()];
109 for (const QString &string : fileTypes)
110 [result addObject:[UTType typeWithFilenameExtension:string.toNSString()]];
111
112 return result;
113}
114
115@end
QStringList nameFilters() const
The QPlatformFileDialogHelper class allows for platform-specific customization of file dialogs.
const QSharedPointer< QFileDialogOptions > & options() const
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
list append(new Employee("Blackpool", "Stephen"))
@ SkipEmptyParts
Definition qnamespace.h:128
QString self
Definition language.cpp:58
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint in
GLuint64EXT * result
[6]
GLsizei const GLchar *const * string
[0]
Definition qopenglext.h:694
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define emit
#define Q_UNUSED(x)
QUrl url("example.com")
[constructor-url-reference]
QStringList files
[8]
const QStringList filters({"Image files (*.png *.xpm *.jpg)", "Text files (*.txt)", "Any files (*)" })
[6]