13using namespace Qt::Literals;
22 qsizetype removeSuffix = 0)
24 auto end =
std::prev(name.cend(), removeSuffix);
25 auto result =
std::find_if(
std::next(name.cbegin(), removePrefix), end,
26 [](
const QChar &c) {
return c.isLetter(); });
28 return std::distance(name.begin(), result);
34 qsizetype removeSuffix = 0)
36 if (
auto idx = firstLetterIdx(name, removePrefix, removeSuffix))
43 qsizetype removeSuffix = 0)
45 auto idx = firstLetterIdx(name, removePrefix, removeSuffix);
49 QChar &changeMe = name[*idx];
50 changeMe = option ==
ToUpper ? changeMe.toUpper() : changeMe.toLower();
56 return view->toString();
62 return QByteArray(view.data(), view.size());
68 return toUtf8Data(*view);
73
74
75
76
77
78
79
82
83
84
85QString QQmlSignalNames::addPrefixToPropertyName(QStringView prefix, QStringView propertyName)
87 QString result = prefix.toString().append(propertyName);
88 changeCaseOfFirstLetter(result, ToUpper, prefix.size());
92QString QQmlSignalNames::propertyNameToChangedSignalName(QStringView property)
94 return property.toString().append(Changed);
97QByteArray QQmlSignalNames::propertyNameToChangedSignalName(QUtf8StringView property)
99 return toUtf8Data(property).append(QByteArrayView(Changed));
102QString QQmlSignalNames::propertyNameToChangedHandlerName(QStringView property)
104 return propertyNameToChangedSignalName(signalNameToHandlerName(property));
107template<
typename View>
110 const qsizetype changeSignalSize = changeSignal.size();
111 if (changeSignalSize < StrlenChanged || changeSignal.last(StrlenChanged).compare(Changed) != 0)
114 const View result = changeSignal.sliced(0, changeSignalSize - StrlenChanged);
115 if (!result.isEmpty())
122
123
124
125
126
127
129std::optional<QString> QQmlSignalNames::changedSignalNameToPropertyName(QStringView signalName)
131 return toQStringData(changedSignalNameToPropertyNameTemplate(signalName));
133std::optional<QByteArray>
134QQmlSignalNames::changedSignalNameToPropertyName(QUtf8StringView signalName)
136 return toUtf8Data(changedSignalNameToPropertyNameTemplate(signalName));
140
141
142
143
144
145std::optional<QString> QQmlSignalNames::changedHandlerNameToPropertyName(QStringView handler)
147 if (!isChangedHandlerName(handler))
150 if (
auto withoutChangedSuffix = changedSignalNameToPropertyName(handler)) {
151 return handlerNameToSignalName(*withoutChangedSuffix);
156QString QQmlSignalNames::signalNameToHandlerName(QAnyStringView signal)
159 handlerName.reserve(StrlenOn + signal.length());
160 handlerName.append(On);
162 signal.visit([&handlerName](
auto &&s) { handlerName.append(s); });
164 changeCaseOfFirstLetter(handlerName, ToUpper, StrlenOn);
173 if (!QQmlSignalNames::isHandlerName(handler))
176 QString signalName = handler.sliced(StrlenOn).toString();
177 Q_ASSERT(!signalName.isEmpty());
184
185
186
187
188std::optional<QString> QQmlSignalNames::handlerNameToSignalName(QStringView handler)
190 return handlerNameToSignalNameHelper<Handler>(handler);
194
195
196
197
198
199std::optional<QString> QQmlSignalNames::badHandlerNameToSignalName(QStringView handler)
201 if (handler.size() <= StrlenOn || !handler.startsWith(On))
204 QString signalName = handler.sliced(StrlenOn).toString();
207 signalName.front() = signalName.front().toLower();
213
214
215
216
217std::optional<QString> QQmlSignalNames::changedHandlerNameToSignalName(QStringView handler)
219 return handlerNameToSignalNameHelper<ChangedHandler>(handler);
222bool QQmlSignalNames::isChangedSignalName(QStringView signalName)
224 if (signalName.size() <= StrlenChanged || !signalName.endsWith(Changed))
227 if (
auto letter = firstLetter(signalName, 0, StrlenChanged))
228 return letter->isLower();
233bool QQmlSignalNames::isChangedHandlerName(QStringView signalName)
235 if (signalName.size() <= (StrlenOn + StrlenChanged)
236 || !signalName.startsWith(On)
237 || !signalName.endsWith(Changed)) {
241 if (
auto letter = firstLetter(signalName, StrlenOn, StrlenChanged))
242 return letter->isUpper();
247bool QQmlSignalNames::isHandlerName(QStringView signalName)
249 if (signalName.size() <= StrlenOn || !signalName.startsWith(On))
252 if (
auto letter = firstLetter(signalName, StrlenOn))
253 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)