blob: acbe671e1a7f307ff872da6cb23dd2fe501a515b (
plain)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtCore/qmimedata.h>
#include "qutimimeconverter.h"
#include "qmacmimeregistry_p.h"
#include "qguiapplication.h"
#include "private/qcore_mac_p.h"
QT_BEGIN_NAMESPACE
using namespace Qt::StringLiterals;
namespace QMacMimeRegistry {
typedef QList<QUtiMimeConverter*> MimeList;
Q_GLOBAL_STATIC(MimeList, globalMimeList)
Q_GLOBAL_STATIC(QStringList, globalDraggedTypesList)
// implemented in qutimimeconverter.mm
void registerBuiltInTypes();
/*!
\fn void qRegisterDraggedTypes(const QStringList &types)
\relates QUtiMimeConverter
Registers the given \a types as custom pasteboard types.
This function should be called to enable the Drag and Drop events
for custom pasteboard types on Cocoa implementations. This is required
in addition to a QUtiMimeConverter subclass implementation. By default
drag and drop is enabled for all standard pasteboard types.
\sa QUtiMimeConverter
*/
void registerDraggedTypes(const QStringList &types)
{
(*globalDraggedTypesList()) += types;
}
const QStringList& enabledDraggedTypes()
{
return (*globalDraggedTypesList());
}
/*****************************************************************************
QDnD debug facilities
*****************************************************************************/
//#define DEBUG_MIME_MAPS
/*!
\class QMacMimeRegistry
\internal
\ingroup draganddrop
*/
/*!
\internal
This is an internal function.
*/
void initializeMimeTypes()
{
if (globalMimeList()->isEmpty())
registerBuiltInTypes();
}
/*!
\internal
*/
void destroyMimeTypes()
{
MimeList *mimes = globalMimeList();
while (!mimes->isEmpty())
delete mimes->takeFirst();
}
/*
Returns a MIME type of for scope \a scope for \a uti, or \nullptr if none exists.
*/
QString flavorToMime(QUtiMimeConverter::HandlerScope scope, const QString &uti)
{
const MimeList &mimes = *globalMimeList();
for (const auto &mime : mimes) {
const bool relevantScope = mime->scope() & scope;
#ifdef DEBUG_MIME_MAPS
qDebug("QMacMimeRegistry::flavorToMime: attempting (%d) for uti %s [%s]",
relevantScope, qPrintable(uti), qPrintable((*it)->mimeForUti(uti)));
#endif
if (relevantScope) {
const QString mimeType = mime->mimeForUti(uti);
if (!mimeType.isNull())
return mimeType;
}
}
return QString();
}
void registerMimeConverter(QUtiMimeConverter *macMime)
{
// globalMimeList is in decreasing priority order. Recently added
// converters take prioity over previously added converters: prepend
// to the list.
globalMimeList()->prepend(macMime);
}
void unregisterMimeConverter(QUtiMimeConverter *macMime)
{
if (!QGuiApplication::closingDown())
globalMimeList()->removeAll(macMime);
}
/*
Returns a list of all currently defined QUtiMimeConverter objects for scope \a scope.
*/
QList<QUtiMimeConverter *> all(QUtiMimeConverter::HandlerScope scope)
{
MimeList ret;
const MimeList &mimes = *globalMimeList();
for (const auto &mime : mimes) {
if (mime->scope() & scope)
ret.append(mime);
}
return ret;
}
} // namespace QMacMimeRegistry
QT_END_NAMESPACE
|