From b2165ea510293f9841570ed9572512ca3f048ae0 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Thu, 22 Nov 2012 11:11:29 +1000 Subject: Port TextInput/TextEdit clipboard optimizations from QtQuick 2.0 Don't check if the clipboard has content until necessary as the check can block for an extended period. Port of 3db5afa71443533eee6825a5fb0da29498f96b94 from qtdeclarative. Change-Id: I606af79cbf10b147aa1bb6c182b0a84aabbc5257 Reviewed-by: Martin Jones --- .../graphicsitems/qdeclarativetextedit.cpp | 11 ++++++++--- .../graphicsitems/qdeclarativetextedit_p_p.h | 10 ++++++---- .../graphicsitems/qdeclarativetextinput.cpp | 19 ++++++++++++++----- .../graphicsitems/qdeclarativetextinput_p_p.h | 7 ++++--- 4 files changed, 32 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp index 07ae0e95..ed65c8e8 100644 --- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp @@ -1139,6 +1139,7 @@ void QDeclarativeTextEdit::setReadOnly(bool r) if (!r) d->control->moveCursor(QTextCursor::End); + q_canPasteChanged(); emit readOnlyChanged(r); } @@ -1508,6 +1509,10 @@ void QDeclarativeTextEdit::updateImgCache(const QRectF &rf) bool QDeclarativeTextEdit::canPaste() const { Q_D(const QDeclarativeTextEdit); + if (!d->canPasteValid) { + d->canPaste = d->control->canPaste(); + d->canPasteValid = true; + } return d->canPaste; } @@ -1565,9 +1570,7 @@ void QDeclarativeTextEditPrivate::init() QObject::connect(control, SIGNAL(microFocusChanged()), q, SLOT(moveCursorDelegate())); QObject::connect(control, SIGNAL(linkActivated(QString)), q, SIGNAL(linkActivated(QString))); #ifndef QT_NO_CLIPBOARD - QObject::connect(q, SIGNAL(readOnlyChanged(bool)), q, SLOT(q_canPasteChanged())); QObject::connect(QApplication::clipboard(), SIGNAL(dataChanged()), q, SLOT(q_canPasteChanged())); - canPaste = control->canPaste(); #endif document = control->document(); @@ -1888,7 +1891,9 @@ void QDeclarativeTextEdit::q_canPasteChanged() Q_D(QDeclarativeTextEdit); bool old = d->canPaste; d->canPaste = d->control->canPaste(); - if(old!=d->canPaste) + bool changed = old != d->canPaste || !d->canPasteValid; + d->canPasteValid = true; + if (changed) emit canPasteChanged(); } diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h index 9fb736ac..25f389f6 100644 --- a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h +++ b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h @@ -71,9 +71,10 @@ public: : color("black"), hAlign(QDeclarativeTextEdit::AlignLeft), vAlign(QDeclarativeTextEdit::AlignTop), imgDirty(true), dirty(false), richText(false), cursorVisible(false), focusOnPress(true), showInputPanelOnFocus(true), clickCausedFocus(false), persistentSelection(true), requireImplicitWidth(false), - hAlignImplicit(true), rightToLeftText(false), textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0), + hAlignImplicit(true), rightToLeftText(false), selectByMouse(false), canPaste(false), canPasteValid(false), + textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0), cursorComponent(0), cursor(0), format(QDeclarativeTextEdit::AutoText), document(0), wrapMode(QDeclarativeTextEdit::NoWrap), - mouseSelectionMode(QDeclarativeTextEdit::SelectCharacters), selectByMouse(false), canPaste(false), + mouseSelectionMode(QDeclarativeTextEdit::SelectCharacters), yoff(0) { } @@ -112,6 +113,9 @@ public: bool requireImplicitWidth:1; bool hAlignImplicit:1; bool rightToLeftText:1; + bool selectByMouse : 1; + mutable bool canPaste : 1; + mutable bool canPasteValid : 1; qreal textMargin; int lastSelectionStart; int lastSelectionEnd; @@ -123,8 +127,6 @@ public: QDeclarativeTextEdit::WrapMode wrapMode; QDeclarativeTextEdit::SelectionMode mouseSelectionMode; int lineCount; - bool selectByMouse; - bool canPaste; int yoff; QSize paintedSize; }; diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp index 8c13faeb..46f4b810 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #ifndef QT_NO_LINEEDIT @@ -454,6 +455,7 @@ void QDeclarativeTextInput::setReadOnly(bool ro) setFlag(QGraphicsItem::ItemAcceptsInputMethod, !ro); d->control->setReadOnly(ro); + q_canPasteChanged(); emit readOnlyChanged(ro); } @@ -1615,6 +1617,11 @@ void QDeclarativeTextInput::setMouseSelectionMode(SelectionMode mode) bool QDeclarativeTextInput::canPaste() const { Q_D(const QDeclarativeTextInput); + if (!d->canPasteValid) { + if (const QMimeData *mimeData = QApplication::clipboard()->mimeData()) + d->canPaste = !d->control->isReadOnly() && mimeData->hasText(); + d->canPasteValid = true; + } return d->canPaste; } @@ -1867,11 +1874,8 @@ void QDeclarativeTextInputPrivate::init() q->connect(control, SIGNAL(updateNeeded(QRect)), q, SLOT(updateRect(QRect))); #ifndef QT_NO_CLIPBOARD - q->connect(q, SIGNAL(readOnlyChanged(bool)), - q, SLOT(q_canPasteChanged())); q->connect(QApplication::clipboard(), SIGNAL(dataChanged()), q, SLOT(q_canPasteChanged())); - canPaste = !control->isReadOnly() && QApplication::clipboard()->text().length() != 0; #endif // QT_NO_CLIPBOARD q->connect(control, SIGNAL(updateMicroFocus()), q, SLOT(updateCursorRectangle())); @@ -1994,9 +1998,14 @@ void QDeclarativeTextInput::q_canPasteChanged() Q_D(QDeclarativeTextInput); bool old = d->canPaste; #ifndef QT_NO_CLIPBOARD - d->canPaste = !d->control->isReadOnly() && QApplication::clipboard()->text().length() != 0; + if (const QMimeData *mimeData = QApplication::clipboard()->mimeData()) + d->canPaste = !d->control->isReadOnly() && mimeData->hasText(); + else + d->canPaste = false; #endif - if(d->canPaste != old) + bool changed = d->canPaste != old || !d->canPasteValid; + d->canPasteValid = true; + if (changed) emit canPasteChanged(); } diff --git a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h index 13325f63..554fbc12 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h +++ b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h @@ -76,8 +76,8 @@ public: mouseSelectionMode(QDeclarativeTextInput::SelectCharacters), inputMethodHints(Qt::ImhNone), hscroll(0), oldScroll(0), oldValidity(false), focused(false), focusOnPress(true), showInputPanelOnFocus(true), clickCausedFocus(false), cursorVisible(false), - autoScroll(true), selectByMouse(false), canPaste(false), hAlignImplicit(true), - selectPressed(false) + autoScroll(true), selectByMouse(false), canPaste(false), canPasteValid(false) + , hAlignImplicit(true), selectPressed(false) { } @@ -134,7 +134,8 @@ public: bool cursorVisible:1; bool autoScroll:1; bool selectByMouse:1; - bool canPaste:1; + mutable bool canPaste:1; + mutable bool canPasteValid:1; bool hAlignImplicit:1; bool selectPressed:1; -- cgit v1.2.3