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
qqmlsignalnames.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qqmlsignalnames_p.h"
5#include <iterator>
6#include <algorithm>
7#include <optional>
8#include <string>
9
11
12using namespace Qt::Literals;
13
14static constexpr const QLatin1String On("on");
15static constexpr const QLatin1String Changed("Changed");
16
17static constexpr const qsizetype StrlenOn = On.length();
18static constexpr const qsizetype StrlenChanged = Changed.length();
19
20static std::optional<qsizetype> firstLetterIdx(QStringView name, qsizetype removePrefix = 0,
21 qsizetype removeSuffix = 0)
22{
23 auto end = std::prev(name.cend(), removeSuffix);
24 auto result = std::find_if(std::next(name.cbegin(), removePrefix), end,
25 [](const QChar &c) { return c.isLetter(); });
26 if (result != end)
27 return std::distance(name.begin(), result);
28
29 return {};
30}
31
32static std::optional<QChar> firstLetter(QStringView name, qsizetype removePrefix = 0,
33 qsizetype removeSuffix = 0)
34{
35 if (auto idx = firstLetterIdx(name, removePrefix, removeSuffix))
36 return name[*idx];
37 return {};
38}
39
42 qsizetype removeSuffix = 0)
43{
44 auto idx = firstLetterIdx(name, removePrefix, removeSuffix);
45 if (!idx)
46 return;
47
48 QChar &changeMe = name[*idx];
49 changeMe = option == ToUpper ? changeMe.toUpper() : changeMe.toLower();
50};
51
52static std::optional<QString> toQStringData(std::optional<QStringView> view)
53{
54 if (view)
55 return view->toString();
56 return std::nullopt;
57}
58
60{
61 return QByteArray(view.data(), view.size());
62}
63
64static std::optional<QByteArray> toUtf8Data(std::optional<QUtf8StringView> view)
65{
66 if (view)
67 return toUtf8Data(*view);
68 return std::nullopt;
69}
70
85{
86 QString result = prefix.toString().append(propertyName);
88 return result;
89}
90
95
100
105
106template<typename View>
107std::optional<View> changedSignalNameToPropertyNameTemplate(View changeSignal)
108{
109 const qsizetype changeSignalSize = changeSignal.size();
110 if (changeSignalSize < StrlenChanged || changeSignal.last(StrlenChanged).compare(Changed) != 0)
111 return std::nullopt;
112
113 const View result = changeSignal.sliced(0, changeSignalSize - StrlenChanged);
114 if (!result.isEmpty())
115 return result;
116
117 return {};
118}
119
132std::optional<QByteArray>
137
145{
146 if (!isChangedHandlerName(handler))
147 return {};
148
149 if (auto withoutChangedSuffix = changedSignalNameToPropertyName(handler)) {
150 return handlerNameToSignalName(*withoutChangedSuffix);
151 }
152 return {};
153}
154
156{
157 QString handlerName;
158 handlerName.reserve(StrlenOn + signal.length());
159 handlerName.append(On);
160
161 signal.visit([&handlerName](auto &&s) { handlerName.append(s); });
162
164 return handlerName;
165}
166
167enum HandlerType { ChangedHandler, Handler };
168
169template<HandlerType type>
170static std::optional<QString> handlerNameToSignalNameHelper(QStringView handler)
171{
172 if (!QQmlSignalNames::isHandlerName(handler))
173 return {};
174
175 QString signalName = handler.sliced(StrlenOn).toString();
176 Q_ASSERT(!signalName.isEmpty());
177
179 return signalName;
180}
181
188{
189 return handlerNameToSignalNameHelper<Handler>(handler);
190}
191
199{
200 if (handler.size() <= StrlenOn || !handler.startsWith(On))
201 return {};
202
203 QString signalName = handler.sliced(StrlenOn).toString();
204
205 // This is quite wrong. But we need it for backwards compatibility.
206 signalName.front() = signalName.front().toLower();
207
208 return signalName;
209}
210
217{
218 return handlerNameToSignalNameHelper<ChangedHandler>(handler);
219}
220
222{
223 if (signalName.size() <= StrlenChanged || !signalName.endsWith(Changed))
224 return false;
225
226 if (auto letter = firstLetter(signalName, 0, StrlenChanged))
227 return letter->isLower();
228
229 return true;
230}
231
233{
234 if (signalName.size() <= (StrlenOn + StrlenChanged)
235 || !signalName.startsWith(On)
236 || !signalName.endsWith(Changed)) {
237 return false;
238 }
239
240 if (auto letter = firstLetter(signalName, StrlenOn, StrlenChanged))
241 return letter->isUpper();
242
243 return true;
244}
245
247{
248 if (signalName.size() <= StrlenOn || !signalName.startsWith(On))
249 return false;
250
251 if (auto letter = firstLetter(signalName, StrlenOn))
252 return letter->isUpper();
253
254 return true;
255}
256
\inmodule QtCore
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
static std::optional< QString > changedSignalNameToPropertyName(QStringView changeSignal)
static std::optional< QString > changedHandlerNameToSignalName(QStringView changedHandler)
static QString signalNameToHandlerName(QAnyStringView signal)
static bool isChangedSignalName(QStringView signalName)
static std::optional< QString > badHandlerNameToSignalName(QStringView handler)
static std::optional< QString > changedHandlerNameToPropertyName(QStringView handler)
static QString propertyNameToChangedHandlerName(QStringView property)
static bool isHandlerName(QStringView signalName)
static std::optional< QString > handlerNameToSignalName(QStringView handler)
static QString addPrefixToPropertyName(QStringView prefix, QStringView propertyName)
static QString propertyNameToChangedSignalName(QStringView property)
static bool isChangedHandlerName(QStringView signalName)
\inmodule QtCore
Definition qstringview.h:78
bool startsWith(QStringView s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
constexpr qsizetype size() const noexcept
Returns the size of this string view, in UTF-16 code units (that is, surrogate pairs count as two for...
QString toString() const
Returns a deep copy of this string view's data as a QString.
Definition qstring.h:1121
constexpr QStringView sliced(qsizetype pos) const noexcept
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
void reserve(qsizetype size)
Ensures the string has space for at least size characters.
Definition qstring.h:1325
QString & append(QChar c)
Definition qstring.cpp:3252
auto signal
Combined button and popup list for selecting options.
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
GLuint GLuint end
GLenum type
GLuint name
GLdouble s
[6]
Definition qopenglext.h:235
const GLubyte * c
GLuint64EXT * result
[6]
GLuint GLenum option
static QByteArray toUtf8Data(QUtf8StringView view)
static constexpr const QLatin1String Changed("Changed")
static constexpr const qsizetype StrlenChanged
static std::optional< QChar > firstLetter(QStringView name, qsizetype removePrefix=0, qsizetype removeSuffix=0)
static void changeCaseOfFirstLetter(QString &name, ChangeCase option, qsizetype removePrefix=0, qsizetype removeSuffix=0)
static constexpr const qsizetype StrlenOn
static std::optional< QString > toQStringData(std::optional< QStringView > view)
@ ToLower
@ ToUpper
static std::optional< qsizetype > firstLetterIdx(QStringView name, qsizetype removePrefix=0, qsizetype removeSuffix=0)
static std::optional< QString > handlerNameToSignalNameHelper(QStringView handler)
@ ChangedHandler
std::optional< View > changedSignalNameToPropertyNameTemplate(View changeSignal)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
ptrdiff_t qsizetype
Definition qtypes.h:165
const char property[13]
Definition qwizard.cpp:101
QQuickView * view
[0]