1 | // Copyright (C) 2021 The Qt Company Ltd. |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only |
3 | |
4 | #include <QtVirtualKeyboard/qvirtualkeyboarddictionarymanager.h> |
5 | #include <QtVirtualKeyboard/qvirtualkeyboarddictionary.h> |
6 | #include <QtGlobal> |
7 | #include <QSet> |
8 | |
9 | #include <QtCore/private/qobject_p.h> |
10 | |
11 | QT_BEGIN_NAMESPACE |
12 | |
13 | class QVirtualKeyboardDictionaryManagerPrivate : public QObjectPrivate |
14 | { |
15 | Q_DECLARE_PUBLIC(QVirtualKeyboardDictionaryManager) |
16 | public: |
17 | QVirtualKeyboardDictionaryManagerPrivate(QVirtualKeyboardDictionaryManager *q) |
18 | { |
19 | q_ptr = q; |
20 | } |
21 | |
22 | void updateActiveDictionaries() |
23 | { |
24 | Q_Q(QVirtualKeyboardDictionaryManager); |
25 | QSet<QString> newActiveDictionaries(baseDictionaries); |
26 | newActiveDictionaries.unite(other: extraDictionaries); |
27 | if (activeDictionaries != newActiveDictionaries) { |
28 | activeDictionaries = newActiveDictionaries; |
29 | emit q->activeDictionariesChanged(); |
30 | } |
31 | } |
32 | |
33 | QSet<QString> baseDictionaries; |
34 | QSet<QString> ; |
35 | QSet<QString> activeDictionaries; |
36 | QMap<QString, QVirtualKeyboardDictionary *> dictionaries; |
37 | }; |
38 | |
39 | struct QVirtualKeyboardDictionaryManagerSingleton { |
40 | QVirtualKeyboardDictionaryManager instance; |
41 | }; |
42 | |
43 | Q_GLOBAL_STATIC(QVirtualKeyboardDictionaryManagerSingleton, singleton) |
44 | |
45 | /*! |
46 | \class QVirtualKeyboardDictionaryManager |
47 | |
48 | \inmodule QtVirtualKeyboard |
49 | \ingroup qtvirtualkeyboard-cpp-for-apps |
50 | |
51 | \brief Dictionary management for application-defined dictionaries. |
52 | |
53 | This class allows you to manage dictionaries for virtual keyboard input |
54 | methods. Dictionaries are application-defined and can be activated in the |
55 | desired context. |
56 | |
57 | \note Dictionaries do not refer to the built-in dictionaries of the input |
58 | method, but to the application's own dictionaries (for example, a phonebook |
59 | application). |
60 | |
61 | The following operations are supported by the dictionary manager: |
62 | \list |
63 | \li Create dictionaries using the \c createDictionary() function. |
64 | \li Add or modify content of the dictionary instance. |
65 | \li Activate dictionaries by adding them to the list of |
66 | \l {baseDictionaries}{base dictionaries} or |
67 | \l {extraDictionaries}{extra dictionaries}. |
68 | \endlist |
69 | |
70 | To activate dictionaries from QML, use the \l VirtualKeyboard attached |
71 | type. |
72 | */ |
73 | |
74 | QVirtualKeyboardDictionaryManager::QVirtualKeyboardDictionaryManager(QObject *parent) : |
75 | QObject(*new QVirtualKeyboardDictionaryManagerPrivate(this), parent) |
76 | { |
77 | Q_D(QVirtualKeyboardDictionaryManager); |
78 | connect(sender: this, signal: &QVirtualKeyboardDictionaryManager::baseDictionariesChanged, |
79 | slot: [=](){ d->updateActiveDictionaries(); }); |
80 | connect(sender: this, signal: &QVirtualKeyboardDictionaryManager::extraDictionariesChanged, |
81 | slot: [=](){ d->updateActiveDictionaries(); }); |
82 | } |
83 | |
84 | /*! |
85 | Returns the singleton instance of the QVirtualKeyboardDictionaryManager. |
86 | |
87 | All the functionalities must be called from the main thread. |
88 | */ |
89 | |
90 | QVirtualKeyboardDictionaryManager *QVirtualKeyboardDictionaryManager::instance() |
91 | { |
92 | return &singleton->instance; |
93 | } |
94 | |
95 | QStringList QVirtualKeyboardDictionaryManager::availableDictionaries() const |
96 | { |
97 | Q_D(const QVirtualKeyboardDictionaryManager); |
98 | return d->dictionaries.keys(); |
99 | } |
100 | |
101 | QStringList QVirtualKeyboardDictionaryManager::baseDictionaries() const |
102 | { |
103 | Q_D(const QVirtualKeyboardDictionaryManager); |
104 | return d->baseDictionaries.values(); |
105 | } |
106 | |
107 | void QVirtualKeyboardDictionaryManager::setBaseDictionaries(const QStringList &baseDictionaries) |
108 | { |
109 | Q_D(QVirtualKeyboardDictionaryManager); |
110 | QSet<QString> newBaseDictionaries(baseDictionaries.begin(), baseDictionaries.end()); |
111 | const QStringList availableDict = availableDictionaries(); |
112 | newBaseDictionaries.intersect(other: QSet<QString>(availableDict.begin(), availableDict.end())); |
113 | if (d->baseDictionaries != newBaseDictionaries) { |
114 | d->baseDictionaries = newBaseDictionaries; |
115 | emit baseDictionariesChanged(); |
116 | } |
117 | } |
118 | |
119 | QStringList QVirtualKeyboardDictionaryManager::() const |
120 | { |
121 | Q_D(const QVirtualKeyboardDictionaryManager); |
122 | return d->extraDictionaries.values(); |
123 | } |
124 | |
125 | void QVirtualKeyboardDictionaryManager::(const QStringList &) |
126 | { |
127 | Q_D(QVirtualKeyboardDictionaryManager); |
128 | QSet<QString> (extraDictionaries.begin(), extraDictionaries.end()); |
129 | const QStringList availableDict = availableDictionaries(); |
130 | newExtraDictionaries.intersect(other: QSet<QString>(availableDict.begin(), availableDict.end())); |
131 | if (d->extraDictionaries != newExtraDictionaries) { |
132 | d->extraDictionaries = newExtraDictionaries; |
133 | emit extraDictionariesChanged(); |
134 | } |
135 | } |
136 | |
137 | QStringList QVirtualKeyboardDictionaryManager::activeDictionaries() const |
138 | { |
139 | Q_D(const QVirtualKeyboardDictionaryManager); |
140 | return d->activeDictionaries.values(); |
141 | } |
142 | |
143 | /*! |
144 | Create a dictionary with the given \a name or return the dictionary if it |
145 | already exists. |
146 | |
147 | The dictionary instance is owned by the dictionary manager and must not be |
148 | destroyed manually. To free memory allocated for the dictionary, the |
149 | application may reset the \l{QVirtualKeyboardDictionary::contents}{contents} |
150 | of the dictionary. |
151 | |
152 | \sa dictionary() |
153 | */ |
154 | |
155 | QVirtualKeyboardDictionary *QVirtualKeyboardDictionaryManager::createDictionary(const QString &name) |
156 | { |
157 | Q_D(QVirtualKeyboardDictionaryManager); |
158 | |
159 | QVirtualKeyboardDictionary *dictionary = d->dictionaries.value(key: name); |
160 | if (!dictionary) { |
161 | dictionary = new QVirtualKeyboardDictionary(name, this); |
162 | d->dictionaries[name] = dictionary; |
163 | emit availableDictionariesChanged(); |
164 | } |
165 | |
166 | return dictionary; |
167 | } |
168 | |
169 | /*! |
170 | Returns an existing dictionary with the given \a name if it exists, otherwise returns |
171 | \nullptr. |
172 | |
173 | \sa createDictionary() |
174 | */ |
175 | |
176 | QVirtualKeyboardDictionary *QVirtualKeyboardDictionaryManager::dictionary(const QString &name) const |
177 | { |
178 | Q_D(const QVirtualKeyboardDictionaryManager); |
179 | |
180 | return d->dictionaries.value(key: name); |
181 | } |
182 | |
183 | /*! |
184 | \property QVirtualKeyboardDictionaryManager::availableDictionaries |
185 | \brief the list of all dictionaries. |
186 | |
187 | This property holds the names of all existing dictionaries. |
188 | */ |
189 | |
190 | /*! |
191 | \property QVirtualKeyboardDictionaryManager::baseDictionaries |
192 | \brief the list of currently active base dictionaries. |
193 | |
194 | This property holds the names of base dictionaries. The application manages |
195 | this property. |
196 | */ |
197 | |
198 | /*! |
199 | \property QVirtualKeyboardDictionaryManager::extraDictionaries |
200 | \brief the list of currently active extra dictionaries. |
201 | |
202 | This property holds the names of extra dictionaries. The application manages |
203 | this property. |
204 | */ |
205 | |
206 | /*! |
207 | \property QVirtualKeyboardDictionaryManager::activeDictionaries |
208 | \brief the list of currently active dictionaries. |
209 | |
210 | This property holds the list of active dictionaries, which is a combination |
211 | of unique names included in baseDictionaries and extraDictionaries. |
212 | */ |
213 | |
214 | QT_END_NAMESPACE |
215 | |