aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den-exter@nokia.com>2012-06-28 12:50:15 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-04 03:27:48 +0200
commit8c27b2ffebc7e8004113091de46b17ab455c8648 (patch)
tree8b92b261c016d9cd82862ceb2a6fb6931cd2b3ba /src/quick
parent45d98ceb20c5a45ed3634b7660b81fd8110c7fcd (diff)
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 <martin.jones@nokia.com>
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/items/qquicktextcontrol.cpp110
-rw-r--r--src/quick/items/qquicktextcontrol_p.h5
-rw-r--r--src/quick/items/qquicktextcontrol_p_p.h5
-rw-r--r--src/quick/items/qquicktextedit.cpp2
4 files changed, 12 insertions, 110 deletions
diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp
index e7b8873fc5..23bf2a779e 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<QTextFrame *> children = frame->childFrames();
-
- const QList<QTextFrame *>::ConstIterator firstFrame = qLowerBound(children.constBegin(), children.constEnd(),
- cursor.selectionStart(), firstFramePosLessThanCursorPos);
- const QList<QTextFrame *>::ConstIterator lastFrame = qUpperBound(children.constBegin(), children.constEnd(),
- cursor.selectionEnd(), cursorPosLessThanLastFramePos);
- for (QList<QTextFrame *>::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 b1871b7978..e8abfc090e 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 cf60dd91b0..24fa6daa2f 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 6c070ad565..1e737e458d 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()));