mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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:
parent
f2ecb6d0eb
commit
7320748ace
2 changed files with 15 additions and 51 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue