Much, much smarter way of finding the Tags

The old way manually implemented a parser, where it could simply call a
regexp (or, in my case, a QChar) that will split the QString into many, to
find the beginning and end of the strings on the tags.

This patch also fixes a Qt5 off-by-one bug on the tag Visualization.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2014-05-27 20:06:24 -03:00 committed by Dirk Hohndel
parent f2ecb6d0eb
commit 7320748ace
2 changed files with 15 additions and 51 deletions

View file

@ -1,6 +1,5 @@
#include "tagwidget.h"
#include <QPair>
#include <QDebug>
#include <QAbstractItemView>
#include <QSettings>
#include <QFont>
@ -67,50 +66,18 @@ QPair<int, int> TagWidget::getCursorTagPosition()
return qMakePair(start, end);
}
enum ParseState {
FINDSTART,
FINDEND
};
void TagWidget::highlight()
{
int i = 0, start = 0, end = 0;
ParseState state = FINDEND;
removeAllBlocks();
while (i < text().length()) {
if (text().at(i) == ',') {
if (state == FINDSTART) {
/* Detect empty tags */
} else if (state == FINDEND) {
/* Found end of tag */
if (i > 1) {
if (text().at(i - 1) != '\\') {
addBlock(start, end);
state = FINDSTART;
}
} else {
state = FINDSTART;
}
}
} else if (text().at(i) == ' ') {
/* Handled */
} else {
/* Found start of tag */
if (state == FINDSTART) {
state = FINDEND;
start = i;
} else if (state == FINDEND) {
end = i;
}
}
i++;
}
if (state == FINDEND) {
if (end < start)
end = text().length() - 1;
if (text().length() > 0)
addBlock(start, end);
int lastPos = 0;
Q_FOREACH (const QString& s, text().split(QChar(','), QString::SkipEmptyParts)) {
QString trimmed = s.trimmed();
if (trimmed.isEmpty())
continue;
int start = text().indexOf(trimmed, lastPos);
addBlock(start, trimmed.size() + start);
lastPos = trimmed.size() + start;
}
}