diff options
Diffstat (limited to 'src/quick/items/qquicktextedit.cpp')
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 132 |
1 files changed, 102 insertions, 30 deletions
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index d087a1b8f3..feabbba864 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -61,6 +61,7 @@ #include <private/qtextengine_p.h> #include <private/qsgadaptationlayer_p.h> +#include "qquicktextdocument.h" QT_BEGIN_NAMESPACE @@ -634,6 +635,13 @@ void QQuickTextEditPrivate::mirrorChange() } } +#ifndef QT_NO_IM +Qt::InputMethodHints QQuickTextEditPrivate::effectiveInputMethodHints() const +{ + return inputMethodHints | Qt::ImhMultiLine; +} +#endif + QQuickTextEdit::VAlignment QQuickTextEdit::vAlign() const { Q_D(const QQuickTextEdit); @@ -1230,6 +1238,44 @@ void QQuickTextEdit::componentComplete() if (d->cursorComponent && isCursorVisible()) QQuickTextUtil::createCursor(d); } + +/*! + \qmlproperty bool QtQuick2::TextEdit::selectByKeyboard + \since QtQuick 2.1 + + Defaults to true when the editor is editable, and false + when read-only. + + If true, the user can use the keyboard to select text + even if the editor is read-only. If false, the user + cannot use the keyboard to select text even if the + editor is editable. + + \sa readOnly +*/ +bool QQuickTextEdit::selectByKeyboard() const +{ + Q_D(const QQuickTextEdit); + if (d->selectByKeyboardSet) + return d->selectByKeyboard; + return !isReadOnly(); +} + +void QQuickTextEdit::setSelectByKeyboard(bool on) +{ + Q_D(QQuickTextEdit); + bool was = selectByKeyboard(); + if (!d->selectByKeyboardSet || was != on) { + d->selectByKeyboardSet = true; + d->selectByKeyboard = on; + if (on) + d->control->setTextInteractionFlags(d->control->textInteractionFlags() | Qt::TextSelectableByKeyboard); + else + d->control->setTextInteractionFlags(d->control->textInteractionFlags() & ~Qt::TextSelectableByKeyboard); + emit selectByKeyboardChanged(on); + } +} + /*! \qmlproperty bool QtQuick2::TextEdit::selectByMouse @@ -1308,8 +1354,12 @@ void QQuickTextEdit::setReadOnly(bool r) Qt::TextInteractionFlags flags = Qt::LinksAccessibleByMouse; if (d->selectByMouse) flags = flags | Qt::TextSelectableByMouse; + if (d->selectByKeyboardSet && d->selectByKeyboard) + flags = flags | Qt::TextSelectableByKeyboard; + else if (!d->selectByKeyboardSet && !r) + flags = flags | Qt::TextSelectableByKeyboard; if (!r) - flags = flags | Qt::TextSelectableByKeyboard | Qt::TextEditable; + flags = flags | Qt::TextEditable; d->control->setTextInteractionFlags(flags); if (!r) d->control->moveCursor(QTextCursor::End); @@ -1319,6 +1369,8 @@ void QQuickTextEdit::setReadOnly(bool r) #endif q_canPasteChanged(); emit readOnlyChanged(r); + if (!d->selectByKeyboardSet) + emit selectByKeyboardChanged(!r); } bool QQuickTextEdit::isReadOnly() const @@ -1531,7 +1583,7 @@ void QQuickTextEdit::mousePressEvent(QMouseEvent *event) d->control->processEvent(event, QPointF(-d->xoff, -d->yoff)); if (d->focusOnPress){ bool hadActiveFocus = hasActiveFocus(); - forceActiveFocus(); + forceActiveFocus(Qt::MouseFocusReason); // re-open input panel on press if already focused #ifndef QT_NO_IM if (hasActiveFocus() && hadActiveFocus && !isReadOnly()) @@ -1593,30 +1645,7 @@ void QQuickTextEdit::inputMethodEvent(QInputMethodEvent *event) if (wasComposing != isInputMethodComposing()) emit inputMethodComposingChanged(); } -#endif // QT_NO_IM -void QQuickTextEdit::itemChange(ItemChange change, const ItemChangeData &value) -{ - Q_D(QQuickTextEdit); - if (change == ItemActiveFocusHasChanged) { - setCursorVisible(value.boolValue); - QFocusEvent focusEvent(value.boolValue ? QEvent::FocusIn : QEvent::FocusOut); - d->control->processEvent(&focusEvent, QPointF(-d->xoff, -d->yoff)); - if (value.boolValue) { - q_updateAlignment(); -#ifndef QT_NO_IM - connect(qApp->inputMethod(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), - this, SLOT(q_updateAlignment())); - } else { - disconnect(qApp->inputMethod(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), - this, SLOT(q_updateAlignment())); -#endif - } - } - QQuickItem::itemChange(change, value); -} - -#ifndef QT_NO_IM /*! \overload Returns the value of the given \a property. @@ -1631,7 +1660,7 @@ QVariant QQuickTextEdit::inputMethodQuery(Qt::InputMethodQuery property) const v = (bool)(flags() & ItemAcceptsInputMethod); break; case Qt::ImHints: - v = (int)inputMethodHints(); + v = (int)d->effectiveInputMethodHints(); break; default: v = d->control->inputMethodQuery(property); @@ -2062,12 +2091,36 @@ void QQuickTextEditPrivate::updateDefaultTextOption() void QQuickTextEdit::focusInEvent(QFocusEvent *event) { - Q_D(const QQuickTextEdit); + Q_D(QQuickTextEdit); + d->handleFocusEvent(event); + QQuickImplicitSizeItem::focusInEvent(event); +} + +void QQuickTextEdit::focusOutEvent(QFocusEvent *event) +{ + Q_D(QQuickTextEdit); + d->handleFocusEvent(event); + QQuickImplicitSizeItem::focusOutEvent(event); +} + +void QQuickTextEditPrivate::handleFocusEvent(QFocusEvent *event) +{ + Q_Q(QQuickTextEdit); + bool focus = event->type() == QEvent::FocusIn; + q->setCursorVisible(focus); + control->processEvent(event, QPointF(-xoff, -yoff)); + if (focus) { + q->q_updateAlignment(); #ifndef QT_NO_IM - if (d->focusOnPress && !isReadOnly()) - qGuiApp->inputMethod()->show(); + if (focusOnPress && !q->isReadOnly()) + qGuiApp->inputMethod()->show(); + q->connect(qApp->inputMethod(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + q, SLOT(q_updateAlignment())); + } else { + q->disconnect(qApp->inputMethod(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)), + q, SLOT(q_updateAlignment())); #endif - QQuickImplicitSizeItem::focusInEvent(event); + } } void QQuickTextEdit::q_canPasteChanged() @@ -2179,4 +2232,23 @@ void QQuickTextEdit::remove(int start, int end) d->control->updateCursorRectangle(false); } +/*! + \qmlproperty TextDocument QtQuick2::TextEdit::textDocument + \since QtQuick 2.1 + + Returns the QQuickTextDocument of this TextEdit. + It can be used to implement syntax highlighting using + \l QSyntaxHighlighter. + + \sa QQuickTextDocument +*/ + +QQuickTextDocument *QQuickTextEdit::textDocument() +{ + Q_D(QQuickTextEdit); + if (!d->quickDocument) + d->quickDocument = new QQuickTextDocument(this); + return d->quickDocument; +} + QT_END_NAMESPACE |