bool ScintillaEditor::modifyNumber(int key)
{
	int line, index;
	qsci->getCursorPosition(&line, &index);
	auto text=qsci->text(line);

	int lineFrom, indexFrom, lineTo, indexTo;
	qsci->getSelection(&lineFrom, &indexFrom, &lineTo, &indexTo);
	auto hadSelection=qsci->hasSelectedText();

	auto begin=QRegExp("[-+]?\\d*\\.?\\d*$").indexIn(text.left(index));
	auto end=text.indexOf(QRegExp("[^0-9.]"),index);
	if (end<0) end=text.length();
	auto nr=text.mid(begin,end-begin);
	if ( !(nr.contains(QRegExp("^[-+]?\\d*\\.?\\d*$")) && nr.contains(QRegExp("\\d"))) ) return false;
	auto sign=nr[0]=='+'||nr[0]=='-';
	if (nr.endsWith('.')) nr=nr.left(nr.length()-1);
	auto curpos=index-begin;
	auto dotpos=nr.indexOf('.');
	auto decimals=dotpos<0?0:nr.length()-dotpos-1;
	auto number=(dotpos<0)?nr.toLongLong():(nr.left(dotpos)+nr.mid(dotpos+1)).toLongLong();
	auto tail=nr.length()-curpos;
	auto exponent=tail-((dotpos>=curpos)?1:0);
	long long int step=1;
	for (int i=exponent; i>0; i--) step*=10;

	switch (key) {
		case Qt::Key_Up:   number+=step; break;
		case Qt::Key_Down: number-=step; break;
	}
	auto negative=number<0;
	if (negative) number=-number;
	auto newnr=QString::number(number);
	if (decimals) {
		if (newnr.length()<=decimals) newnr.prepend(QString(decimals-newnr.length()+1,'0'));
		newnr=newnr.left(newnr.length()-decimals)+"."+newnr.right(decimals);
	}
	if (tail>newnr.length()) {
		newnr.prepend(QString(tail-newnr.length(),'0'));
	}
	if (negative) newnr.prepend('-');
	else if (sign) newnr.prepend('+');
	qsci->setSelection(line, begin, line, end);
	qsci->replaceSelectedText(newnr);

	qsci->selectAll(false);
	if (hadSelection)
	{
		qsci->setSelection(lineFrom, indexFrom, lineTo, indexTo);
	}
	qsci->setCursorPosition(line, begin+newnr.length()-tail);
	emit previewRequest();
	return true;
}
Example #2
0
void LibraryTreeWidget::onCurrentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous)
{
	if (current != 0)
	{
		QString fileName = current->data(0, Qt::UserRole).toMap()["filename"].toString();

		if (fileName.isEmpty() == false)
		{
			QDir dir = QFileInfo(projectFileName_).dir();
			emit previewRequest(current->text(0), QDir::cleanPath(dir.absoluteFilePath(fileName)));
		}
	}
}
Example #3
0
bool ScintillaEditor::eventFilter(QObject* obj, QEvent *e)
{
	static bool wasChanged=false;
	static bool previewAfterUndo=false;

	if (obj != qsci) return EditorInterface::eventFilter(obj, e);

	if (	e->type()==QEvent::KeyPress
		 || e->type()==QEvent::KeyRelease
		 ) {
		QKeyEvent *ke = static_cast<QKeyEvent*>(e);
		if ((ke->modifiers() & ~Qt::KeypadModifier) == Qt::AltModifier) {
			switch (ke->key())
			{
				case Qt::Key_Left:
				case Qt::Key_Right:
					if (e->type()==QEvent::KeyPress) {
						navigateOnNumber(ke->key());
					}
					return true;

				case Qt::Key_Up:
				case Qt::Key_Down:
					if (e->type()==QEvent::KeyPress) {
						if (!wasChanged) qsci->beginUndoAction();
						if (modifyNumber(ke->key())) {
							wasChanged=true;
							previewAfterUndo=true;
						}
						if (!wasChanged) qsci->endUndoAction();
					}
					return true;
			}
		}
		if (previewAfterUndo && e->type()==QEvent::KeyPress) {
			int k=ke->key() | ke->modifiers();
			if (wasChanged) qsci->endUndoAction();
			wasChanged=false;
			QsciCommand *cmd=qsci->standardCommands()->boundTo(k);
			if ( cmd && ( cmd->command()==QsciCommand::Undo || cmd->command()==QsciCommand::Redo ) )
				QTimer::singleShot(0,this,SIGNAL(previewRequest()));
			else if ( cmd || !ke->text().isEmpty() ) {
				// any insert or command (but not undo/redo) cancels the preview after undo
				previewAfterUndo=false;
			}
		}
	}
	return false;
}