📄 q3richtext.cpp
字号:
return ok;}void Q3TextCursor::gotoRight(){ if (para->string()->isRightToLeft()) gotoPreviousLetter(); else gotoNextLetter();}void Q3TextCursor::gotoNextLetter(){ tmpX = -1;#ifndef QT_NO_TEXTCUSTOMITEM const Q3TextStringChar *tsc = para->at(idx); if (tsc && tsc->isCustom() && tsc->customItem()->isNested()) { if (processNesting(EnterBegin)) return; }#endif if (idx < para->length() - 1) { idx = para->string()->nextCursorPosition(idx); } else if (para->next()) { para = para->next(); while (!para->isVisible() && para->next()) para = para->next(); idx = 0; } else if (nestedDepth()) { pop(); processNesting(Next); if (idx == -1) { pop(); if (idx < para->length() - 1) { idx = para->string()->nextCursorPosition(idx); } else if (para->next()) { para = para->next(); idx = 0; } } }}void Q3TextCursor::gotoUp(){ int indexOfLineStart; int line; Q3TextStringChar *c = para->lineStartOfChar(idx, &indexOfLineStart, &line); if (!c) return; if (tmpX < 0) tmpX = x(); if (indexOfLineStart == 0) { if (!para->prev()) { if (!nestedDepth()) return; pop(); processNesting(Up); if (idx == -1) { pop(); if (!para->prev()) return; idx = tmpX = 0; } else { tmpX = -1; return; } } Q3TextParagraph *p = para->prev(); while (p && !p->isVisible()) p = p->prev(); if (p) para = p; int lastLine = para->lines() - 1; if (!para->lineStartOfLine(lastLine, &indexOfLineStart)) return; idx = indexOfLineStart; while (idx < para->length()-1 && para->at(idx)->x < tmpX) ++idx; if (idx > indexOfLineStart && para->at(idx)->x - tmpX > tmpX - para->at(idx-1)->x) --idx; } else { --line; int oldIndexOfLineStart = indexOfLineStart; if (!para->lineStartOfLine(line, &indexOfLineStart)) return; idx = indexOfLineStart; while (idx < oldIndexOfLineStart-1 && para->at(idx)->x < tmpX) ++idx; if (idx > indexOfLineStart && para->at(idx)->x - tmpX > tmpX - para->at(idx-1)->x) --idx; } fixCursorPosition();}void Q3TextCursor::gotoDown(){ int indexOfLineStart; int line; Q3TextStringChar *c = para->lineStartOfChar(idx, &indexOfLineStart, &line); if (!c) return; if (tmpX < 0) tmpX = x(); if (line == para->lines() - 1) { if (!para->next()) { if (!nestedDepth()) return; pop(); processNesting(Down); if (idx == -1) { pop(); if (!para->next()) return; idx = tmpX = 0; } else { tmpX = -1; return; } } Q3TextParagraph *s = para->next(); while (s && !s->isVisible()) s = s->next(); if (s) para = s; if (!para->lineStartOfLine(0, &indexOfLineStart)) return; int end; if (para->lines() == 1) end = para->length(); else para->lineStartOfLine(1, &end); idx = indexOfLineStart; while (idx < end-1 && para->at(idx)->x < tmpX) ++idx; if (idx > indexOfLineStart && para->at(idx)->x - tmpX > tmpX - para->at(idx-1)->x) --idx; } else { ++line; int end; if (line == para->lines() - 1) end = para->length(); else para->lineStartOfLine(line + 1, &end); if (!para->lineStartOfLine(line, &indexOfLineStart)) return; idx = indexOfLineStart; while (idx < end-1 && para->at(idx)->x < tmpX) ++idx; if (idx > indexOfLineStart && para->at(idx)->x - tmpX > tmpX - para->at(idx-1)->x) --idx; } fixCursorPosition();}void Q3TextCursor::gotoLineEnd(){ tmpX = -1; int indexOfLineStart; int line; Q3TextStringChar *c = para->lineStartOfChar(idx, &indexOfLineStart, &line); if (!c) return; if (line == para->lines() - 1) { idx = para->length() - 1; } else { c = para->lineStartOfLine(++line, &indexOfLineStart); indexOfLineStart--; idx = indexOfLineStart; }}void Q3TextCursor::gotoLineStart(){ tmpX = -1; int indexOfLineStart; int line; Q3TextStringChar *c = para->lineStartOfChar(idx, &indexOfLineStart, &line); if (!c) return; idx = indexOfLineStart;}void Q3TextCursor::gotoHome(){ if (topParagraph()->document()) gotoPosition(topParagraph()->document()->firstParagraph()); else gotoLineStart();}void Q3TextCursor::gotoEnd(){ if (topParagraph()->document() && topParagraph()->document()->lastParagraph()->isValid()) gotoPosition(topParagraph()->document()->lastParagraph(), topParagraph()->document()->lastParagraph()->length() - 1); else gotoLineEnd();}void Q3TextCursor::gotoPageUp(int visibleHeight){ int targetY = globalY() - visibleHeight; Q3TextParagraph* old; int index; do { old = para; index = idx; gotoUp(); } while ((old != para || index != idx) && globalY() > targetY);}void Q3TextCursor::gotoPageDown(int visibleHeight){ int targetY = globalY() + visibleHeight; Q3TextParagraph* old; int index; do { old = para; index = idx; gotoDown(); } while ((old != para || index != idx) && globalY() < targetY);}void Q3TextCursor::gotoWordRight(){ if (para->string()->isRightToLeft()) gotoPreviousWord(); else gotoNextWord();}void Q3TextCursor::gotoWordLeft(){ if (para->string()->isRightToLeft()) gotoNextWord(); else gotoPreviousWord();}static bool is_seperator(const QChar &c, bool onlySpace){ if (onlySpace) return c.isSpace(); return c.isSpace() || c == QLatin1Char('\t') || c == QLatin1Char('.') || c == QLatin1Char(',') || c == QLatin1Char(':') || c == QLatin1Char(';') || c == QLatin1Char('-') || c == QLatin1Char('<') || c == QLatin1Char('>') || c == QLatin1Char('[') || c == QLatin1Char(']') || c == QLatin1Char('(') || c == QLatin1Char(')') || c == QLatin1Char('{') || c == QLatin1Char('}');}void Q3TextCursor::gotoPreviousWord(bool onlySpace){ gotoPreviousLetter(); tmpX = -1; Q3TextString *s = para->string(); bool allowSame = false; if (idx == ((int)s->length()-1)) return; for (int i = idx; i >= 0; --i) { if (is_seperator(s->at(i).c, onlySpace)) { if (!allowSame) continue; idx = i + 1; return; } if (!allowSame && !is_seperator(s->at(i).c, onlySpace)) allowSame = true; } idx = 0;}void Q3TextCursor::gotoNextWord(bool onlySpace){ tmpX = -1; Q3TextString *s = para->string(); bool allowSame = false; for (int i = idx; i < (int)s->length(); ++i) { if (!is_seperator(s->at(i).c, onlySpace)) { if (!allowSame) continue; idx = i; return; } if (!allowSame && is_seperator(s->at(i).c, onlySpace)) allowSame = true; } if (idx < ((int)s->length()-1)) { gotoLineEnd(); } else if (para->next()) { Q3TextParagraph *p = para->next(); while (p && !p->isVisible()) p = p->next(); if (s) { para = p; idx = 0; } } else { gotoLineEnd(); }}bool Q3TextCursor::atParagStart(){ return idx == 0;}bool Q3TextCursor::atParagEnd(){ return idx == para->length() - 1;}void Q3TextCursor::splitAndInsertEmptyParagraph(bool ind, bool updateIds){ if (!para->document()) return; tmpX = -1; Q3TextFormat *f = 0; if (para->document()->useFormatCollection()) { f = para->at(idx)->format(); if (idx == para->length() - 1 && idx > 0) f = para->at(idx - 1)->format(); if (f->isMisspelled()) { f->removeRef(); f = para->document()->formatCollection()->format(f->font(), f->color()); } } if (atParagEnd()) { Q3TextParagraph *n = para->next(); Q3TextParagraph *s = para->document()->createParagraph(para->document(), para, n, updateIds); if (f) s->setFormat(0, 1, f, true); s->copyParagData(para); if (ind) { int oi, ni; s->indent(&oi, &ni); para = s; idx = ni; } else { para = s; idx = 0; } } else if (atParagStart()) { Q3TextParagraph *p = para->prev(); Q3TextParagraph *s = para->document()->createParagraph(para->document(), p, para, updateIds); if (f) s->setFormat(0, 1, f, true); s->copyParagData(para); if (ind) { s->indent(); s->format(); indent(); para->format(); } } else { QString str = para->string()->toString().mid(idx, 0xFFFFFF); Q3TextParagraph *n = para->next(); Q3TextParagraph *s = para->document()->createParagraph(para->document(), para, n, updateIds); s->copyParagData(para); s->remove(0, 1); s->append(str, true); for (int i = 0; i < str.length(); ++i) { Q3TextStringChar* tsc = para->at(idx + i); s->setFormat(i, 1, tsc->format(), true);#ifndef QT_NO_TEXTCUSTOMITEM if (tsc->isCustom()) { Q3TextCustomItem * item = tsc->customItem(); s->at(i)->setCustomItem(item); tsc->loseCustomItem(); }#endif if (tsc->isAnchor()) s->at(i)->setAnchor(tsc->anchorName(), tsc->anchorHref()); } para->truncate(idx); if (ind) { int oi, ni; s->indent(&oi, &ni); para = s; idx = ni; } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -