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