From 8c27b2ffebc7e8004113091de46b17ab455c8648 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Thu, 28 Jun 2012 12:50:15 +1000 Subject: [PATCH] Don't calculate selection rects unnecessarily. QQuickTextEdit ignores the updateRequest QRect arguments, so don't bother calculating them. Change-Id: Icb9126ab799c6b216eb0c4b9e3ff3f6a4bf8f03c Reviewed-by: Martin Jones --- src/quick/items/qquicktextcontrol.cpp | 110 +++----------------------------- src/quick/items/qquicktextcontrol_p.h | 5 +- src/quick/items/qquicktextcontrol_p_p.h | 5 -- src/quick/items/qquicktextedit.cpp | 2 +- 4 files changed, 12 insertions(+), 110 deletions(-) diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index e7b8873..23bf2a7 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -393,7 +393,7 @@ void QQuickTextControlPrivate::setCursorPosition(int pos, QTextCursor::MoveMode void QQuickTextControlPrivate::repaintCursor() { Q_Q(QQuickTextControl); - emit q->updateCursorRequest(cursorRectPlusUnicodeDirectionMarkers(cursor)); + emit q->updateCursorRequest(); } void QQuickTextControlPrivate::repaintOldAndNewSelection(const QTextCursor &oldSelection) @@ -409,17 +409,17 @@ void QQuickTextControlPrivate::repaintOldAndNewSelection(const QTextCursor &oldS QTextCursor differenceSelection(doc); differenceSelection.setPosition(oldSelection.position()); differenceSelection.setPosition(cursor.position(), QTextCursor::KeepAnchor); - emit q->updateRequest(q->selectionRect(differenceSelection)); + emit q->updateRequest(); } else { if (!oldSelection.hasSelection() && !cursor.hasSelection()) { if (!oldSelection.isNull()) - emit q->updateCursorRequest(q->selectionRect(oldSelection) | cursorRectPlusUnicodeDirectionMarkers(oldSelection)); - emit q->updateCursorRequest(q->selectionRect() | cursorRectPlusUnicodeDirectionMarkers(cursor)); + emit q->updateCursorRequest(); + emit q->updateCursorRequest(); } else { if (!oldSelection.isNull()) - emit q->updateRequest(q->selectionRect(oldSelection) | cursorRectPlusUnicodeDirectionMarkers(oldSelection)); - emit q->updateRequest(q->selectionRect() | cursorRectPlusUnicodeDirectionMarkers(cursor)); + emit q->updateRequest(); + emit q->updateRequest(); } } } @@ -478,8 +478,8 @@ void QQuickTextControlPrivate::_q_documentLayoutChanged() { Q_Q(QQuickTextControl); QAbstractTextDocumentLayout *layout = doc->documentLayout(); - QObject::connect(layout, SIGNAL(update(QRectF)), q, SIGNAL(updateRequest(QRectF))); - QObject::connect(layout, SIGNAL(updateBlock(QTextBlock)), q, SLOT(_q_updateBlock(QTextBlock))); + QObject::connect(layout, SIGNAL(update(QRectF)), q, SIGNAL(updateRequest())); + QObject::connect(layout, SIGNAL(updateBlock(QTextBlock)), q, SIGNAL(updateRequest())); QObject::connect(layout, SIGNAL(documentSizeChanged(QSizeF)), q, SIGNAL(documentSizeChanged(QSizeF))); } @@ -961,14 +961,6 @@ process: updateCurrentCharFormat(); } -void QQuickTextControlPrivate::_q_updateBlock(const QTextBlock &block) -{ - Q_Q(QQuickTextControl); - QRectF br = q->blockBoundingRect(block); - br.setRight(qreal(INT_MAX)); // the block might have shrunk - emit q->updateRequest(br); -} - QRectF QQuickTextControlPrivate::rectForPosition(int position) const { Q_Q(const QQuickTextControl); @@ -1011,82 +1003,6 @@ QRectF QQuickTextControlPrivate::rectForPosition(int position) const return r; } -static inline bool firstFramePosLessThanCursorPos(QTextFrame *frame, int position) -{ - return frame->firstPosition() < position; -} - -static inline bool cursorPosLessThanLastFramePos(int position, QTextFrame *frame) -{ - return position < frame->lastPosition(); -} - -static QRectF boundingRectOfFloatsInSelection(const QTextCursor &cursor) -{ - QRectF r; - QTextFrame *frame = cursor.currentFrame(); - const QList children = frame->childFrames(); - - const QList::ConstIterator firstFrame = qLowerBound(children.constBegin(), children.constEnd(), - cursor.selectionStart(), firstFramePosLessThanCursorPos); - const QList::ConstIterator lastFrame = qUpperBound(children.constBegin(), children.constEnd(), - cursor.selectionEnd(), cursorPosLessThanLastFramePos); - for (QList::ConstIterator it = firstFrame; it != lastFrame; ++it) { - if ((*it)->frameFormat().position() != QTextFrameFormat::InFlow) - r |= frame->document()->documentLayout()->frameBoundingRect(*it); - } - return r; -} - -QRectF QQuickTextControl::selectionRect(const QTextCursor &cursor) const -{ - Q_D(const QQuickTextControl); - - QRectF r = d->rectForPosition(cursor.selectionStart()); - - if (cursor.hasComplexSelection() && cursor.currentTable()) { - QTextTable *table = cursor.currentTable(); - - r = d->doc->documentLayout()->frameBoundingRect(table); - } else if (cursor.hasSelection()) { - const int position = cursor.selectionStart(); - const int anchor = cursor.selectionEnd(); - const QTextBlock posBlock = d->doc->findBlock(position); - const QTextBlock anchorBlock = d->doc->findBlock(anchor); - if (posBlock == anchorBlock && posBlock.isValid() && posBlock.layout()->lineCount()) { - const QTextLine posLine = posBlock.layout()->lineForTextPosition(position - posBlock.position()); - const QTextLine anchorLine = anchorBlock.layout()->lineForTextPosition(anchor - anchorBlock.position()); - - const int firstLine = qMin(posLine.lineNumber(), anchorLine.lineNumber()); - const int lastLine = qMax(posLine.lineNumber(), anchorLine.lineNumber()); - const QTextLayout *layout = posBlock.layout(); - r = QRectF(); - for (int i = firstLine; i <= lastLine; ++i) { - r |= layout->lineAt(i).rect(); - r |= layout->lineAt(i).naturalTextRect(); // might be bigger in the case of wrap not enabled - } - r.translate(blockBoundingRect(posBlock).topLeft()); - } else { - QRectF anchorRect = d->rectForPosition(cursor.selectionEnd()); - r |= anchorRect; - r |= boundingRectOfFloatsInSelection(cursor); - QRectF frameRect(d->doc->documentLayout()->frameBoundingRect(cursor.currentFrame())); - r.setLeft(frameRect.left()); - r.setRight(frameRect.right()); - } - if (r.isValid()) - r.adjust(-1, -1, 1, 1); - } - - return r; -} - -QRectF QQuickTextControl::selectionRect() const -{ - Q_D(const QQuickTextControl); - return selectionRect(d->cursor); -} - void QQuickTextControlPrivate::mousePressEvent(QMouseEvent *e, const QPointF &pos) { Q_Q(QQuickTextControl); @@ -1452,7 +1368,7 @@ QVariant QQuickTextControl::inputMethodQuery(Qt::InputMethodQuery property) cons void QQuickTextControlPrivate::focusEvent(QFocusEvent *e) { Q_Q(QQuickTextControl); - emit q->updateRequest(q->selectionRect()); + emit q->updateRequest(); hasFocus = e->gotFocus(); if (e->gotFocus()) { setBlinkingCursorEnabled(interactionFlags & (Qt::TextEditable | Qt::TextSelectableByKeyboard)); @@ -1504,14 +1420,6 @@ QRectF QQuickTextControl::cursorRect() const return cursorRect(d->cursor); } -QRectF QQuickTextControlPrivate::cursorRectPlusUnicodeDirectionMarkers(const QTextCursor &cursor) const -{ - if (cursor.isNull()) - return QRectF(); - - return rectForPosition(cursor.position()).adjusted(-4, 0, 4, 0); -} - QString QQuickTextControl::anchorAt(const QPointF &pos) const { Q_D(const QQuickTextControl); diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h index b1871b7..e8abfc0 100644 --- a/src/quick/items/qquicktextcontrol_p.h +++ b/src/quick/items/qquicktextcontrol_p.h @@ -148,8 +148,8 @@ Q_SIGNALS: void cursorPositionChanged(); // control signals - void updateCursorRequest(const QRectF &rect = QRectF()); - void updateRequest(const QRectF &rect = QRectF()); + void updateCursorRequest(); + void updateRequest(); void documentSizeChanged(const QSizeF &); void cursorRectangleChanged(); void linkActivated(const QString &link); @@ -175,7 +175,6 @@ private: Q_DISABLE_COPY(QQuickTextControl) Q_PRIVATE_SLOT(d_func(), void _q_updateCurrentCharFormatAndSelection()) Q_PRIVATE_SLOT(d_func(), void _q_emitCursorPosChanged(const QTextCursor &)) - Q_PRIVATE_SLOT(d_func(), void _q_updateBlock(const QTextBlock &)) Q_PRIVATE_SLOT(d_func(), void _q_documentLayoutChanged()) }; diff --git a/src/quick/items/qquicktextcontrol_p_p.h b/src/quick/items/qquicktextcontrol_p_p.h index cf60dd9..24fa6da 100644 --- a/src/quick/items/qquicktextcontrol_p_p.h +++ b/src/quick/items/qquicktextcontrol_p_p.h @@ -108,11 +108,7 @@ public: void _q_setCursorAfterUndoRedo(int undoPosition, int charsAdded, int charsRemoved); - QRectF cursorRectPlusUnicodeDirectionMarkers(const QTextCursor &cursor) const; QRectF rectForPosition(int position) const; - QRectF selectionRect(const QTextCursor &cursor) const; - inline QRectF selectionRect() const - { return selectionRect(this->cursor); } void keyPressEvent(QKeyEvent *e); void mousePressEvent(QMouseEvent *event, const QPointF &pos); @@ -163,7 +159,6 @@ public: bool cursorRectangleChanged : 1; void _q_copyLink(); - void _q_updateBlock(const QTextBlock &); void _q_documentLayoutChanged(); }; diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 6c070ad..1e737e4 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -1733,7 +1733,7 @@ void QQuickTextEditPrivate::init() control->setAcceptRichText(false); control->setCursorIsFocusIndicator(true); - qmlobject_connect(control, QQuickTextControl, SIGNAL(updateRequest(QRectF)), q, QQuickTextEdit, SLOT(updateDocument())); + qmlobject_connect(control, QQuickTextControl, SIGNAL(updateRequest()), q, QQuickTextEdit, SLOT(updateDocument())); qmlobject_connect(control, QQuickTextControl, SIGNAL(updateCursorRequest()), q, QQuickTextEdit, SLOT(updateCursor())); qmlobject_connect(control, QQuickTextControl, SIGNAL(textChanged()), q, QQuickTextEdit, SLOT(q_textChanged())); qmlobject_connect(control, QQuickTextControl, SIGNAL(selectionChanged()), q, QQuickTextEdit, SIGNAL(selectedTextChanged())); -- 2.7.4