1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

refactor: change QRegExp on QRegularExpression for some search functions

This commit is contained in:
TriKriSta 2018-07-07 20:56:02 +03:00
parent 74468fde32
commit 60a2c5e651
6 changed files with 71 additions and 50 deletions

View File

@ -71,7 +71,7 @@ void Text::selectText(const QString& txt, const std::pair<int, int>& point)
selectText(cursor, point);
}
void Text::selectText(const QRegExp &exp, const std::pair<int, int>& point)
void Text::selectText(const QRegularExpression &exp, const std::pair<int, int>& point)
{
regenerate();

View File

@ -37,7 +37,7 @@ public:
void setText(const QString& txt);
void selectText(const QString& txt, const std::pair<int, int>& point);
void selectText(const QRegExp& exp, const std::pair<int, int>& point);
void selectText(const QRegularExpression& exp, const std::pair<int, int>& point);
void deselectText();
virtual void setWidth(qreal width) final;

View File

@ -28,7 +28,6 @@
#include <QFile>
#include <QMetaObject>
#include <QMutexLocker>
#include <QRegularExpression>
/// The two following defines are required to use SQLCipher
/// They are used by the sqlite3.h header
@ -726,7 +725,7 @@ QVariant RawDatabase::extractData(sqlite3_stmt* stmt, int col)
*/
void RawDatabase::regexpInsensitive(sqlite3_context* ctx, int argc, sqlite3_value** argv)
{
regexp(ctx, argc, argv, Qt::CaseInsensitive);
regexp(ctx, argc, argv, QRegularExpression::CaseInsensitiveOption | QRegularExpression::UseUnicodePropertiesOption);
}
/**
@ -737,17 +736,17 @@ void RawDatabase::regexpInsensitive(sqlite3_context* ctx, int argc, sqlite3_valu
*/
void RawDatabase::regexpSensitive(sqlite3_context* ctx, int argc, sqlite3_value** argv)
{
regexp(ctx, argc, argv, Qt::CaseSensitive);
regexp(ctx, argc, argv, QRegularExpression::UseUnicodePropertiesOption);
}
void RawDatabase::regexp(sqlite3_context* ctx, int argc, sqlite3_value** argv, const Qt::CaseSensitivity cs)
void RawDatabase::regexp(sqlite3_context* ctx, int argc, sqlite3_value** argv, const QRegularExpression::PatternOptions cs)
{
QRegExp regex;
QRegularExpression regex;
QString str1((const char*)sqlite3_value_text(argv[0]));
QString str2((const char*)sqlite3_value_text(argv[1]));
regex.setPattern(str1);
regex.setCaseSensitivity(cs);
regex.setPatternOptions(cs);
bool b = str2.contains(regex);

View File

@ -9,6 +9,7 @@
#include <QThread>
#include <QVariant>
#include <QVector>
#include <QRegularExpression>
#include <atomic>
#include <functional>
#include <memory>
@ -91,7 +92,7 @@ protected:
static void regexpSensitive(sqlite3_context* ctx, int argc, sqlite3_value** argv);
private:
static void regexp(sqlite3_context* ctx, int argc, sqlite3_value** argv, const Qt::CaseSensitivity cs);
static void regexp(sqlite3_context* ctx, int argc, sqlite3_value** argv, const QRegularExpression::PatternOptions cs);
struct Transaction
{

View File

@ -537,7 +537,14 @@ void ChatForm::onSearchUp(const QString& phrase, const ParameterSearch& paramete
QVector<ChatLine::Ptr> lines = chatWidget->getLines();
int numLines = lines.size();
int startLine = numLines - searchPoint.x();
int startLine;
if (searchAfterLoadHistory) {
startLine = 1;
searchAfterLoadHistory = false;
} else {
startLine = numLines - searchPoint.x();
}
if (startLine == 0 && loadHistory(phrase, parameter)) {
return;
@ -746,7 +753,7 @@ void ChatForm::loadHistoryDefaultNum(bool processUndelivered)
QString pk = f->getPublicKey().toString();
QList<History::HistMessage> msgs = history->getChatHistoryDefaultNum(pk);
if (!msgs.isEmpty()) {
earliestMessage = msgs.back().timestamp;
earliestMessage = msgs.first().timestamp;
}
handleLoadedMessages(msgs, processUndelivered);
}

View File

@ -45,7 +45,7 @@
#include <QFileDialog>
#include <QKeyEvent>
#include <QMessageBox>
#include <QRegExp>
#include <QRegularExpression>
/**
* @class GenericChatForm
@ -585,8 +585,6 @@ bool GenericChatForm::searchInText(const QString& phrase, const ParameterSearch&
int numLines = lines.size();
auto d = QDate::currentDate();
int startLine = numLines - searchPoint.x();
if (parameter.period == PeriodSearch::WithTheFirst) {
startLine = 0;
@ -632,25 +630,29 @@ bool GenericChatForm::searchInText(const QString& phrase, const ParameterSearch&
QString txt = content->getText();
bool find = false;
QRegExp exp;
QRegularExpression exp;
QRegularExpressionMatch match;
auto flagIns = QRegularExpression::CaseInsensitiveOption | QRegularExpression::UseUnicodePropertiesOption;
auto flag = QRegularExpression::UseUnicodePropertiesOption;
switch (parameter.filter) {
case FilterSearch::Register:
find = txt.contains(phrase, Qt::CaseSensitive);
break;
case FilterSearch::WordsOnly:
exp = QRegExp(QString("\\b%1\\b").arg(phrase), Qt::CaseInsensitive);
exp = QRegularExpression(QString("\\b%1\\b").arg(phrase), flagIns);
find = txt.contains(exp);
break;
case FilterSearch::RegisterAndWordsOnly:
exp = QRegExp(QString("\\b%1\\b").arg(phrase));
exp = QRegularExpression(QString("\\b%1\\b").arg(phrase), flag);
find = txt.contains(exp);
break;
case FilterSearch::RegisterAndRegular:
exp = QRegExp(phrase);
exp = QRegularExpression(phrase, flag);
find = txt.contains(exp);
break;
case FilterSearch::Regular:
exp = QRegExp(phrase, Qt::CaseInsensitive);
exp = QRegularExpression(phrase, flagIns);
find = txt.contains(exp);
break;
default:
@ -670,7 +672,7 @@ bool GenericChatForm::searchInText(const QString& phrase, const ParameterSearch&
chatWidget->scrollToLine(l);
text->deselectText();
if (exp.isEmpty()) {
if (exp.pattern().isEmpty()) {
text->selectText(phrase, point);
} else {
text->selectText(exp, point);
@ -688,9 +690,12 @@ bool GenericChatForm::searchInText(const QString& phrase, const ParameterSearch&
std::pair<int, int> GenericChatForm::indexForSearchInLine(const QString& txt, const QString& phrase, const ParameterSearch& parameter, bool searchUp)
{
int index = 0;
QRegExp exp;
int index = -1;
int size = 0;
QRegularExpression exp;
auto flagIns = QRegularExpression::CaseInsensitiveOption | QRegularExpression::UseUnicodePropertiesOption;
auto flag = QRegularExpression::UseUnicodePropertiesOption;
if (searchUp) {
int startIndex = -1;
if (searchPoint.y() > -1) {
@ -702,25 +707,42 @@ std::pair<int, int> GenericChatForm::indexForSearchInLine(const QString& txt, co
index = txt.lastIndexOf(phrase, startIndex, Qt::CaseSensitive);
break;
case FilterSearch::WordsOnly:
exp = QRegExp(QString("\\b%1\\b").arg(phrase), Qt::CaseInsensitive);
index = exp.lastIndexIn(txt, startIndex);
exp = QRegularExpression(QString("\\b%1\\b").arg(phrase), flagIns);
break;
case FilterSearch::RegisterAndWordsOnly:
exp = QRegExp(QString("\\b%1\\b").arg(phrase));
index = exp.lastIndexIn(txt, startIndex);
exp = QRegularExpression(QString("\\b%1\\b").arg(phrase), flag);
break;
case FilterSearch::RegisterAndRegular:
exp = QRegExp(phrase);
index = exp.lastIndexIn(txt, startIndex);
exp = QRegularExpression(phrase, flag);
break;
case FilterSearch::Regular:
exp = QRegExp(phrase, Qt::CaseInsensitive);
index = exp.lastIndexIn(txt, startIndex);
exp = QRegularExpression(phrase, flagIns);
break;
default:
index = txt.lastIndexOf(phrase, startIndex, Qt::CaseInsensitive);
break;
}
if (!exp.pattern().isEmpty()) {
auto matchIt = exp.globalMatch(txt);
while (matchIt.hasNext()) {
auto match = matchIt.next();
int sizeItem = match.capturedLength();
int indexItem = match.capturedStart();
if (startIndex == -1 || indexItem < startIndex) {
index = indexItem;
size = sizeItem;
} else {
break;
}
}
} else {
size = phrase.size();
}
} else {
int startIndex = 0;
if (searchPoint.y() > -1) {
@ -732,37 +754,30 @@ std::pair<int, int> GenericChatForm::indexForSearchInLine(const QString& txt, co
index = txt.indexOf(phrase, startIndex, Qt::CaseSensitive);
break;
case FilterSearch::WordsOnly:
exp = QRegExp(QString("\\b%1\\b").arg(phrase), Qt::CaseInsensitive);
index = exp.indexIn(txt, startIndex);
exp = QRegularExpression(QString("\\b%1\\b").arg(phrase), flagIns);
break;
case FilterSearch::RegisterAndWordsOnly:
exp = QRegExp(QString("\\b%1\\b").arg(phrase));
index = exp.indexIn(txt, startIndex);
exp = QRegularExpression(QString("\\b%1\\b").arg(phrase), flag);
break;
case FilterSearch::RegisterAndRegular:
exp = QRegExp(phrase);
index = exp.indexIn(txt, startIndex);
exp = QRegularExpression(phrase, flag);
break;
case FilterSearch::Regular:
exp = QRegExp(phrase, Qt::CaseInsensitive);
index = exp.indexIn(txt, startIndex);
exp = QRegularExpression(phrase, flagIns);
break;
default:
index = txt.indexOf(phrase, startIndex, Qt::CaseInsensitive);
break;
}
}
int size = 0;
if (index > -1) {
if (exp.isEmpty()) {
size = phrase.size();
} else {
auto lExp = exp.capturedTexts();
if (!lExp.isEmpty()) {
size = lExp[0].size();
if (!exp.pattern().isEmpty()) {
auto match = exp.match(txt, startIndex);
if (match.hasMatch()) {
size = match.capturedLength(0);
index = match.capturedEnd() - size;
}
} else {
size = phrase.size();
}
}
@ -936,9 +951,8 @@ void GenericChatForm::onContinueSearch()
QString phrase = searchForm->getSearchPhrase();
ParameterSearch parameter = searchForm->getParameterSearch();
if (!phrase.isEmpty() && searchAfterLoadHistory) {
searchAfterLoadHistory = false;
if (parameter.period == PeriodSearch::WithTheFirst || parameter.period == PeriodSearch::AfterDate) {
searchAfterLoadHistory = false;
onSearchDown(phrase, parameter);
} else {
onSearchUp(phrase, parameter);