summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den.exter@jollamobile.com>2012-11-22 11:11:29 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-11-23 00:08:56 +0100
commitb2165ea510293f9841570ed9572512ca3f048ae0 (patch)
tree8daa8f32164e63af09dcb32ce7b8a51ea07003a8
parent497978e6c2d7602448ca6fd8dd8da32813c6705b (diff)
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 <martin.jones@jollamobile.com>
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit.cpp11
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit_p_p.h10
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput.cpp19
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput_p_p.h7
4 files changed, 32 insertions, 15 deletions
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 <QFontMetrics>
#include <QPainter>
#include <QTextBoundaryFinder>
+#include <QMimeData>
#include <qstyle.h>
#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;