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; }
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))); } } }
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; }