feat: add RXValidator
a QRegularExpression validator with Unicode support Needed for status-im/status-desktop#8115
This commit is contained in:
parent
c96e2601d0
commit
39cce22001
|
@ -35,7 +35,7 @@ macro(add_target name type)
|
|||
endif()
|
||||
|
||||
# for DOtherSide.pc
|
||||
set(PC_REQUIRES "Qt5Core, Qt5Gui, Qt5Widgets, Qt5Qml, Qt5Quick, Qt5Network, Qt5DBus, Qt5Multimedia SortFilterProxyModel")
|
||||
set(PC_REQUIRES "Qt5Core, Qt5Gui, Qt5Widgets, Qt5Qml, Qt5Quick, Qt5Network, Qt5DBus, Qt5Multimedia, SortFilterProxyModel")
|
||||
if (${Qt5QuickControls2_FOUND})
|
||||
target_link_libraries(${name} PRIVATE Qt5::QuickControls2)
|
||||
set(PC_REQUIRES "${PC_REQUIRES}, Qt5QuickControls2")
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
#pragma once
|
||||
|
||||
#include <QValidator>
|
||||
|
||||
// A QValidator built around QRegularExpression, but with Unicode support
|
||||
// (RegularExpressionValidator doesn't expose this to QML)
|
||||
|
||||
class RXValidator : public QValidator
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QRegularExpression regularExpression READ regularExpression WRITE setRegularExpression NOTIFY regularExpressionChanged)
|
||||
|
||||
public:
|
||||
RXValidator(QObject* parent = nullptr);
|
||||
|
||||
// helper QML function
|
||||
Q_INVOKABLE bool test(QString input) const;
|
||||
|
||||
protected:
|
||||
QValidator::State validate(QString &input, int &pos) const override;
|
||||
|
||||
signals:
|
||||
void regularExpressionChanged(const QRegularExpression &re);
|
||||
|
||||
private:
|
||||
QRegularExpression regularExpression() const;
|
||||
void setRegularExpression(const QRegularExpression &re);
|
||||
|
||||
QRegularExpression m_rx;
|
||||
};
|
|
@ -72,6 +72,7 @@
|
|||
#include "DOtherSide/Status/KeychainManager.h"
|
||||
#include "DOtherSide/Status/SoundManager.h"
|
||||
#include "DOtherSide/Status/QClipboardProxy.h"
|
||||
#include "DOtherSide/Status/RXValidator.h"
|
||||
#include "DOtherSide/DosSpellchecker.h"
|
||||
|
||||
#include <qqmlsortfilterproxymodeltypes.h>
|
||||
|
@ -85,6 +86,7 @@ void register_meta_types()
|
|||
qmlRegisterType<StatusSyntaxHighlighterHelper>("DotherSide", 0 , 1, "StatusSyntaxHighlighter");
|
||||
qmlRegisterType<SpellChecker>("DotherSide", 0, 1, "SpellChecker");
|
||||
qmlRegisterSingletonType<QClipboardProxy>("DotherSide", 0 , 1, "QClipboardProxy", &QClipboardProxy::qmlInstance);
|
||||
qmlRegisterType<RXValidator>("DotherSide", 0, 1, "RXValidator");
|
||||
qqsfpm::registerTypes();
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
#include "DOtherSide/Status/RXValidator.h"
|
||||
|
||||
RXValidator::RXValidator(QObject* parent)
|
||||
: QValidator(parent)
|
||||
{
|
||||
}
|
||||
|
||||
bool RXValidator::test(QString input) const
|
||||
{
|
||||
int dummy_pos = 0;
|
||||
return validate(input, dummy_pos) == QValidator::Acceptable;
|
||||
}
|
||||
|
||||
QRegularExpression RXValidator::regularExpression() const
|
||||
{
|
||||
return m_rx;
|
||||
}
|
||||
|
||||
void RXValidator::setRegularExpression(const QRegularExpression& re)
|
||||
{
|
||||
if (m_rx != re) {
|
||||
m_rx = re;
|
||||
m_rx.setPatternOptions(re.patternOptions() | QRegularExpression::UseUnicodePropertiesOption);
|
||||
m_rx.setPattern(QRegularExpression::anchoredPattern(re.pattern()));
|
||||
emit regularExpressionChanged(m_rx);
|
||||
emit changed();
|
||||
}
|
||||
}
|
||||
|
||||
QValidator::State RXValidator::validate(QString& input, int& pos) const
|
||||
{
|
||||
if (m_rx.pattern().isEmpty())
|
||||
return Acceptable;
|
||||
|
||||
const QRegularExpressionMatch m = m_rx.match(input, 0, QRegularExpression::PartialPreferCompleteMatch);
|
||||
if (m.hasMatch())
|
||||
return Acceptable;
|
||||
|
||||
if (input.isEmpty() || m.hasPartialMatch())
|
||||
return Intermediate;
|
||||
|
||||
pos = input.size();
|
||||
return Invalid;
|
||||
}
|
Loading…
Reference in New Issue