12using namespace Qt::Literals;
21 qsizetype removeSuffix = 0)
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(); });
27 return std::distance(name.begin(), result);
33 qsizetype removeSuffix = 0)
35 if (
auto idx = firstLetterIdx(name, removePrefix, removeSuffix))
42 qsizetype removeSuffix = 0)
44 auto idx = firstLetterIdx(name, removePrefix, removeSuffix);
48 QChar &changeMe = name[*idx];
49 changeMe = option ==
ToUpper ? changeMe.toUpper() : changeMe.toLower();
55 return view->toString();
61 return QByteArray(view.data(), view.size());
67 return toUtf8Data(*view);
72
73
74
75
76
77
78
81
82
83
84QString QQmlSignalNames::addPrefixToPropertyName(QStringView prefix, QStringView propertyName)
86 QString result = prefix.toString().append(propertyName);
87 changeCaseOfFirstLetter(result, ToUpper, prefix.size());
91QString QQmlSignalNames::propertyNameToChangedSignalName(QStringView property)
93 return property.toString().append(Changed);
96QByteArray QQmlSignalNames::propertyNameToChangedSignalName(QUtf8StringView property)
98 return toUtf8Data(property).append(QByteArrayView(Changed));
101QString QQmlSignalNames::propertyNameToChangedHandlerName(QStringView property)
103 return propertyNameToChangedSignalName(signalNameToHandlerName(property));
106template<
typename View>
109 const qsizetype changeSignalSize = changeSignal.size();
110 if (changeSignalSize < StrlenChanged || changeSignal.last(StrlenChanged).compare(Changed) != 0)
113 const View result = changeSignal.sliced(0, changeSignalSize - StrlenChanged);
114 if (!result.isEmpty())
121
122
123
124
125
126
128std::optional<QString> QQmlSignalNames::changedSignalNameToPropertyName(QStringView signalName)
130 return toQStringData(changedSignalNameToPropertyNameTemplate(signalName));
132std::optional<QByteArray>
133QQmlSignalNames::changedSignalNameToPropertyName(QUtf8StringView signalName)
135 return toUtf8Data(changedSignalNameToPropertyNameTemplate(signalName));
139
140
141
142
143
144std::optional<QString> QQmlSignalNames::changedHandlerNameToPropertyName(QStringView handler)
146 if (!isChangedHandlerName(handler))
149 if (
auto withoutChangedSuffix = changedSignalNameToPropertyName(handler)) {
150 return handlerNameToSignalName(*withoutChangedSuffix);
155QString QQmlSignalNames::signalNameToHandlerName(QAnyStringView signal)
158 handlerName.reserve(StrlenOn + signal.length());
159 handlerName.append(On);
161 signal.visit([&handlerName](
auto &&s) { handlerName.append(s); });
163 changeCaseOfFirstLetter(handlerName, ToUpper, StrlenOn);
172 if (!QQmlSignalNames::isHandlerName(handler))
175 QString signalName = handler.sliced(StrlenOn).toString();
176 Q_ASSERT(!signalName.isEmpty());
183
184
185
186
187std::optional<QString> QQmlSignalNames::handlerNameToSignalName(QStringView handler)
189 return handlerNameToSignalNameHelper<Handler>(handler);
193
194
195
196
197
198std::optional<QString> QQmlSignalNames::badHandlerNameToSignalName(QStringView handler)
200 if (handler.size() <= StrlenOn || !handler.startsWith(On))
203 QString signalName = handler.sliced(StrlenOn).toString();
206 signalName.front() = signalName.front().toLower();
212
213
214
215
216std::optional<QString> QQmlSignalNames::changedHandlerNameToSignalName(QStringView handler)
218 return handlerNameToSignalNameHelper<ChangedHandler>(handler);
221bool QQmlSignalNames::isChangedSignalName(QStringView signalName)
223 if (signalName.size() <= StrlenChanged || !signalName.endsWith(Changed))
226 if (
auto letter = firstLetter(signalName, 0, StrlenChanged))
227 return letter->isLower();
232bool QQmlSignalNames::isChangedHandlerName(QStringView signalName)
234 if (signalName.size() <= (StrlenOn + StrlenChanged)
235 || !signalName.startsWith(On)
236 || !signalName.endsWith(Changed)) {
240 if (
auto letter = firstLetter(signalName, StrlenOn, StrlenChanged))
241 return letter->isUpper();
246bool QQmlSignalNames::isHandlerName(QStringView signalName)
248 if (signalName.size() <= StrlenOn || !signalName.startsWith(On))
251 if (
auto letter = firstLetter(signalName, StrlenOn))
252 return letter->isUpper();
static QByteArray toUtf8Data(QUtf8StringView view)
static constexpr const QLatin1String Changed("Changed")
static constexpr const QLatin1String On("on")
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 std::optional< QString > toQStringData(std::optional< QStringView > view)
static std::optional< qsizetype > firstLetterIdx(QStringView name, qsizetype removePrefix=0, qsizetype removeSuffix=0)
static constexpr const qsizetype StrlenOn
static std::optional< QString > handlerNameToSignalNameHelper(QStringView handler)
static constexpr const qsizetype StrlenChanged
std::optional< View > changedSignalNameToPropertyNameTemplate(View changeSignal)