QRect MultilineTextEdit::mapToView(int para,int index) { if( para < 0 || para > paragraphs() || index < 0 || index > paragraphLength(para) ) return QRect(); //invalid rectangle const QFontMetrics& fm = fontMetrics(); const QString& paratext = text(para); // Find index of the first character on the same line as parameter // 'index' using binary search. Very fast, even for long texts. int linestart = 0; int indexline = lineOfChar( para, index ); if ( indexline > 0 ) { int min = 0, max = index; int i = (min + max)/2; int iline = lineOfChar( para, i ); while ( iline != indexline-1 || lineOfChar( para, i+1 ) != indexline ) { Q_ASSERT( min != max && min != i && max != i ); if ( iline < indexline ) min = i; else max = i; i = (min + max)/2; iline = lineOfChar( para, i ); } linestart = i+1; } Q_ASSERT( linestart >= 0 ); int linewidth = fm.size(ExpandTabs, paratext.mid( linestart, index-linestart )).width(); int linewidth2 = fm.size(ExpandTabs, paratext.mid( linestart, index-linestart+1 )).width(); // FIXME as soon as it's possible to ask real margins from QTextEdit: const int left_margin = 4; // const int top_margin = 4; QPainter painter( viewport()); const QRect& linerect = paragraphRect(para); return QRect( contentsToViewport( QPoint( left_margin + linerect.left() + linewidth , /*top_margin + */linerect.top() + indexline * fm.lineSpacing() + fm.leading())), QSize( linewidth2-linewidth, fm.lineSpacing() )); }
void EditSpell::misspelling (const QString& original, const QStringList&, unsigned int) { if (!find(original, true, true, true, &nPara, &nIndex)){ string oldWord; oldWord = original.local8Bit(); log(L_DEBUG, "%s not found", oldWord.c_str()); return; } setCursorPosition(nPara, nIndex); for (unsigned i = 0; i < original.length(); i++) moveCursor(MoveForward, true); ensureCursorVisible(); QRect rc = paragraphRect(nPara); QPoint p1 = QPoint(rc.left(), rc.top()); QPoint p2 = QPoint(rc.right(), rc.bottom()); p1 = viewport()->mapToParent(p1); p2 = viewport()->mapToParent(p2); p1.setX(QMAX(p1.x(), 0)); p1.setY(QMAX(p1.y(), 0)); p2.setX(QMIN(p2.x(), width())); p2.setY(QMIN(p2.y(), height())); p1 = mapToGlobal(p1); p2 = mapToGlobal(p2); int yPos = p1.y(); if (p1.y() >= pSpell->heightDlg() - 10){ yPos -= pSpell->heightDlg() + 25; }else{ yPos = p2.y() + 10; } p1.setY(yPos); p1 = mapFromGlobal(p1); pSpell->moveDlg(p1.x(), p1.y()); #else void EditSpell::misspelling (const QString&, const QStringList&, unsigned int) { #endif } void EditSpell::corrected_old(QString original, QString newword, unsigned pos) { corrected((const QString&)original, (const QString&)newword, (unsigned int)pos); }