aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/items/qquicktextcontrol.cpp77
-rw-r--r--src/quick/items/qquicktextcontrol_p.h2
-rw-r--r--src/quick/items/qquicktextcontrol_p_p.h6
-rw-r--r--src/quick/items/qquicktextedit.cpp26
-rw-r--r--src/quick/items/qquicktextedit_p_p.h2
5 files changed, 47 insertions, 66 deletions
diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp
index 23bf2a779e..d2ff4dc649 100644
--- a/src/quick/items/qquicktextcontrol.cpp
+++ b/src/quick/items/qquicktextcontrol.cpp
@@ -71,6 +71,8 @@
#include <qstylehints.h>
#include <qmetaobject.h>
+#include <private/qqmlglobal_p.h>
+
// ### these should come from QStyleHints
const int textCursorWidth = 1;
const bool fullWidthSelection = true;
@@ -279,16 +281,7 @@ void QQuickTextControlPrivate::updateCurrentCharFormat()
cursorRectangleChanged = true;
}
-void QQuickTextControlPrivate::init(Qt::TextFormat format, const QString &text, QTextDocument *document)
-{
- Q_Q(QQuickTextControl);
- setContent(format, text, document);
-
- doc->setUndoRedoEnabled(interactionFlags & Qt::TextEditable);
- q->setCursorWidth(-1);
-}
-
-void QQuickTextControlPrivate::setContent(Qt::TextFormat format, const QString &text, QTextDocument *document)
+void QQuickTextControlPrivate::setContent(Qt::TextFormat format, const QString &text)
{
Q_Q(QQuickTextControl);
@@ -298,33 +291,11 @@ void QQuickTextControlPrivate::setContent(Qt::TextFormat format, const QString &
// set char format then.
const QTextCharFormat charFormatForInsertion = cursor.charFormat();
- bool clearDocument = true;
- if (!doc) {
- if (document) {
- doc = document;
- clearDocument = false;
- } else {
- doc = new QTextDocument(q);
- }
- _q_documentLayoutChanged();
- cursor = QTextCursor(doc);
-
-// #### doc->documentLayout()->setPaintDevice(viewport);
-
- QObject::connect(doc, SIGNAL(contentsChanged()), q, SLOT(_q_updateCurrentCharFormatAndSelection()));
- QObject::connect(doc, SIGNAL(cursorPositionChanged(QTextCursor)), q, SLOT(_q_emitCursorPosChanged(QTextCursor)));
- QObject::connect(doc, SIGNAL(documentLayoutChanged()), q, SLOT(_q_documentLayoutChanged()));
- }
-
bool previousUndoRedoState = doc->isUndoRedoEnabled();
- if (!document)
- doc->setUndoRedoEnabled(false);
+ doc->setUndoRedoEnabled(false);
- //Saving the index save some time.
- static int contentsChangedIndex = QMetaMethod::fromSignal(&QTextDocument::contentsChanged).methodIndex();
- static int textChangedIndex = QMetaMethod::fromSignal(&QQuickTextControl::textChanged).methodIndex();
// avoid multiple textChanged() signals being emitted
- QMetaObject::disconnect(doc, contentsChangedIndex, q, textChangedIndex);
+ qmlobject_disconnect(doc, QTextDocument, SIGNAL(contentsChanged()), q, QQuickTextControl, SIGNAL(textChanged()));
if (!text.isEmpty()) {
// clear 'our' cursor for insertion to prevent
@@ -354,18 +325,16 @@ void QQuickTextControlPrivate::setContent(Qt::TextFormat format, const QString &
doc->setUndoRedoEnabled(false);
}
cursor = QTextCursor(doc);
- } else if (clearDocument) {
+ } else {
doc->clear();
}
cursor.setCharFormat(charFormatForInsertion);
- QMetaObject::connect(doc, contentsChangedIndex, q, textChangedIndex);
+ qmlobject_connect(doc, QTextDocument, SIGNAL(contentsChanged()), q, QQuickTextControl, SIGNAL(textChanged()));
emit q->textChanged();
- if (!document)
- doc->setUndoRedoEnabled(previousUndoRedoState);
+ doc->setUndoRedoEnabled(previousUndoRedoState);
_q_updateCurrentCharFormatAndSelection();
- if (!document)
- doc->setModified(false);
+ doc->setModified(false);
q->updateCursorRectangle(true);
emit q->cursorPositionChanged();
@@ -474,16 +443,6 @@ void QQuickTextControlPrivate::_q_emitCursorPosChanged(const QTextCursor &someCu
}
}
-void QQuickTextControlPrivate::_q_documentLayoutChanged()
-{
- Q_Q(QQuickTextControl);
- QAbstractTextDocumentLayout *layout = doc->documentLayout();
- 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)));
-
-}
-
void QQuickTextControlPrivate::setBlinkingCursorEnabled(bool enable)
{
Q_Q(QQuickTextControl);
@@ -611,7 +570,23 @@ QQuickTextControl::QQuickTextControl(QTextDocument *doc, QObject *parent)
: QObject(*new QQuickTextControlPrivate, parent)
{
Q_D(QQuickTextControl);
- d->init(Qt::PlainText, QString(), doc);
+ Q_ASSERT(doc);
+
+ QAbstractTextDocumentLayout *layout = doc->documentLayout();
+ qmlobject_connect(layout, QAbstractTextDocumentLayout, SIGNAL(update(QRectF)), this, QQuickTextControl, SIGNAL(updateRequest()));
+ qmlobject_connect(layout, QAbstractTextDocumentLayout, SIGNAL(updateBlock(QTextBlock)), this, QQuickTextControl, SIGNAL(updateRequest()));
+ qmlobject_connect(doc, QTextDocument, SIGNAL(contentsChanged()), this, QQuickTextControl, SIGNAL(textChanged()));
+ qmlobject_connect(doc, QTextDocument, SIGNAL(contentsChanged()), this, QQuickTextControl, SLOT(_q_updateCurrentCharFormatAndSelection()));
+ qmlobject_connect(doc, QTextDocument, SIGNAL(cursorPositionChanged(QTextCursor)), this, QQuickTextControl, SLOT(_q_emitCursorPosChanged(QTextCursor)));
+
+ layout->setProperty("cursorWidth", textCursorWidth);
+
+ d->doc = doc;
+ d->cursor = QTextCursor(doc);
+ d->lastCharFormat = d->cursor.charFormat();
+ doc->setPageSize(QSizeF(0, 0));
+ doc->setModified(false);
+ doc->setUndoRedoEnabled(true);
}
QQuickTextControl::~QQuickTextControl()
diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h
index e8abfc090e..293a465ca2 100644
--- a/src/quick/items/qquicktextcontrol_p.h
+++ b/src/quick/items/qquicktextcontrol_p.h
@@ -150,7 +150,6 @@ Q_SIGNALS:
// control signals
void updateCursorRequest();
void updateRequest();
- void documentSizeChanged(const QSizeF &);
void cursorRectangleChanged();
void linkActivated(const QString &link);
@@ -175,7 +174,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_documentLayoutChanged())
};
diff --git a/src/quick/items/qquicktextcontrol_p_p.h b/src/quick/items/qquicktextcontrol_p_p.h
index 24fa6daa2f..b41804206a 100644
--- a/src/quick/items/qquicktextcontrol_p_p.h
+++ b/src/quick/items/qquicktextcontrol_p_p.h
@@ -76,10 +76,7 @@ public:
void updateCurrentCharFormat();
- void init(Qt::TextFormat format = Qt::RichText, const QString &text = QString(),
- QTextDocument *document = 0);
- void setContent(Qt::TextFormat format = Qt::RichText, const QString &text = QString(),
- QTextDocument *document = 0);
+ void setContent(Qt::TextFormat format, const QString &text);
void paste(const QMimeData *source);
@@ -159,7 +156,6 @@ public:
bool cursorRectangleChanged : 1;
void _q_copyLink();
- void _q_documentLayoutChanged();
};
QT_END_NAMESPACE
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp
index d09c432b93..41b6e9472d 100644
--- a/src/quick/items/qquicktextedit.cpp
+++ b/src/quick/items/qquicktextedit.cpp
@@ -260,7 +260,9 @@ void QQuickTextEdit::setText(const QString &text)
d->document->clearResources();
d->richText = d->format == RichText || (d->format == AutoText && Qt::mightBeRichText(text));
- if (d->richText) {
+ if (!isComponentComplete()) {
+ d->text = text;
+ } else if (d->richText) {
#ifndef QT_NO_TEXTHTMLPARSER
d->control->setHtml(text);
#else
@@ -326,12 +328,14 @@ void QQuickTextEdit::setTextFormat(TextFormat format)
d->richText = format == RichText || (format == AutoText && (wasRich || Qt::mightBeRichText(text())));
#ifndef QT_NO_TEXTHTMLPARSER
- if (wasRich && !d->richText) {
- d->control->setPlainText(!d->textCached ? d->control->toHtml() : d->text);
- updateSize();
- } else if (!wasRich && d->richText) {
- d->control->setHtml(!d->textCached ? d->control->toPlainText() : d->text);
- updateSize();
+ if (isComponentComplete()) {
+ if (wasRich && !d->richText) {
+ d->control->setPlainText(!d->textCached ? d->control->toHtml() : d->text);
+ updateSize();
+ } else if (!wasRich && d->richText) {
+ d->control->setHtml(!d->textCached ? d->control->toPlainText() : d->text);
+ updateSize();
+ }
}
#endif
@@ -1161,6 +1165,14 @@ void QQuickTextEdit::componentComplete()
QQuickImplicitSizeItem::componentComplete();
d->document->setBaseUrl(baseUrl(), d->richText);
+#ifndef QT_NO_TEXTHTML_PARSER
+ if (d->richText)
+ d->control->setHtml(d->text);
+ else
+#endif
+ if (!d->text.isEmpty())
+ d->control->setPlainText(d->text);
+
if (d->dirty) {
d->determineHorizontalAlignment();
d->updateDefaultTextOption();
diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h
index 1fb82110ea..6e15736b0b 100644
--- a/src/quick/items/qquicktextedit_p_p.h
+++ b/src/quick/items/qquicktextedit_p_p.h
@@ -82,7 +82,7 @@ public:
, documentDirty(true), dirty(false), richText(false), cursorVisible(false), cursorPending(false)
, focusOnPress(true), persistentSelection(false), requireImplicitWidth(false)
, selectByMouse(false), canPaste(false), canPasteValid(false), hAlignImplicit(true)
- , textCached(false), inLayout(false)
+ , textCached(true), inLayout(false)
{
}