diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jsruntime/qv4globalobject_p.h | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4mathobject.cpp | 19 | ||||
-rw-r--r-- | src/qml/qml/qqmlpropertycache_p.h | 16 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetype.cpp | 9 | ||||
-rw-r--r-- | src/quick/items/qquickitem.cpp | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktextcontrol.cpp | 19 | ||||
-rw-r--r-- | src/quick/items/qquicktextcontrol_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 7 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 50 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquickwindowmodule.cpp | 10 |
11 files changed, 98 insertions, 37 deletions
diff --git a/src/qml/jsruntime/qv4globalobject_p.h b/src/qml/jsruntime/qv4globalobject_p.h index e00a3445da..ea7a3b06ce 100644 --- a/src/qml/jsruntime/qv4globalobject_p.h +++ b/src/qml/jsruntime/qv4globalobject_p.h @@ -71,7 +71,6 @@ struct Q_QML_EXPORT EvalFunction : FunctionObject ReturnedValue evalCall(CallData *callData, bool directCall) const; - using Object::construct; static ReturnedValue call(const Managed *that, CallData *callData); }; diff --git a/src/qml/jsruntime/qv4mathobject.cpp b/src/qml/jsruntime/qv4mathobject.cpp index df1c8c6049..5528409b40 100644 --- a/src/qml/jsruntime/qv4mathobject.cpp +++ b/src/qml/jsruntime/qv4mathobject.cpp @@ -86,17 +86,18 @@ Heap::MathObject::MathObject() m->defineDefaultProperty(QStringLiteral("tan"), QV4::MathObject::method_tan, 1); } -/* copies the sign from y to x and returns the result */ -static double copySign(double x, double y) +#ifdef Q_OS_ANDROID +// C++11's std::copysign is missing in the std namespace, so get it from the root namespace (math.h) +static Q_ALWAYS_INLINE double copySign(double x, double y) { - uchar *xch = (uchar *)&x; - uchar *ych = (uchar *)&y; - if (QSysInfo::ByteOrder == QSysInfo::BigEndian) - xch[0] = (xch[0] & 0x7f) | (ych[0] & 0x80); - else - xch[7] = (xch[7] & 0x7f) | (ych[7] & 0x80); - return x; + return ::copysign(x, y); +} +#else // Ok, we have a proper C++11 standard library +static Q_ALWAYS_INLINE double copySign(double x, double y) +{ + return std::copysign(x, y); } +#endif ReturnedValue MathObject::method_abs(CallContext *context) { diff --git a/src/qml/qml/qqmlpropertycache_p.h b/src/qml/qml/qqmlpropertycache_p.h index 4fb84198d9..b2171dd86b 100644 --- a/src/qml/qml/qqmlpropertycache_p.h +++ b/src/qml/qml/qqmlpropertycache_p.h @@ -496,6 +496,14 @@ int QQmlPropertyRawData::encodedIndex() const return isValueTypeVirtual()?QQmlPropertyData::encodeValueTypePropertyIndex(coreIndex, valueTypeCoreIndex):coreIndex; } +inline QQmlPropertyData *QQmlPropertyCache::ensureResolved(QQmlPropertyData *p) const +{ + if (p && p->notFullyResolved()) + resolve(p); + + return p; +} + inline QQmlPropertyData *QQmlPropertyCache::property(int index) const { if (index < 0 || index >= (propertyIndexCacheStart + propertyIndexCache.count())) @@ -556,14 +564,6 @@ int QQmlPropertyCache::signalOffset() const return signalHandlerIndexCacheStart; } -inline QQmlPropertyData *QQmlPropertyCache::ensureResolved(QQmlPropertyData *p) const -{ - if (p && p->notFullyResolved()) - resolve(p); - - return p; -} - QQmlMetaObject::QQmlMetaObject() { } diff --git a/src/qml/qml/qqmlvaluetype.cpp b/src/qml/qml/qqmlvaluetype.cpp index 28bbaf0e92..44fd47244d 100644 --- a/src/qml/qml/qqmlvaluetype.cpp +++ b/src/qml/qml/qqmlvaluetype.cpp @@ -523,7 +523,7 @@ void QQmlEasingValueType::setBezierCurve(const QVariantList &customCurveVariant) QVariantList variantList = customCurveVariant; if ((variantList.count() % 6) == 0) { bool allRealsOk = true; - QList<qreal> reals; + QVector<qreal> reals; const int variantListCount = variantList.count(); reals.reserve(variantListCount); for (int i = 0; i < variantListCount; i++) { @@ -557,9 +557,10 @@ void QQmlEasingValueType::setBezierCurve(const QVariantList &customCurveVariant) QVariantList QQmlEasingValueType::bezierCurve() const { QVariantList rv; - QVector<QPointF> points = v.toCubicSpline(); - for (int ii = 0; ii < points.count(); ++ii) - rv << QVariant(points.at(ii).x()) << QVariant(points.at(ii).y()); + const QVector<QPointF> points = v.toCubicSpline(); + rv.reserve(points.size() * 2); + for (const auto &point : points) + rv << QVariant(point.x()) << QVariant(point.y()); return rv; } diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index ea2cb5aa5f..1100b12cbc 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -4152,6 +4152,7 @@ QVariant QQuickItem::inputMethodQuery(Qt::InputMethodQuery query) const v = (bool)(flags() & ItemAcceptsInputMethod); break; case Qt::ImHints: + case Qt::ImAnchorRectangle: case Qt::ImCursorRectangle: case Qt::ImFont: case Qt::ImCursorPosition: diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index 127b51948a..8b6cc221d5 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -1399,10 +1399,16 @@ QVariant QQuickTextControl::inputMethodQuery(Qt::InputMethodQuery property, QVar switch (property) { case Qt::ImCursorRectangle: return cursorRect(); + case Qt::ImAnchorRectangle: + return anchorRect(); case Qt::ImFont: return QVariant(d->cursor.charFormat().font()); - case Qt::ImCursorPosition: + case Qt::ImCursorPosition: { + const QPointF pt = argument.toPointF(); + if (!pt.isNull()) + return QVariant(d->doc->documentLayout()->hitTest(pt, Qt::FuzzyHit) - block.position()); return QVariant(d->cursor.position() - block.position()); + } case Qt::ImSurroundingText: return QVariant(block.text()); case Qt::ImCurrentSelection: @@ -1527,6 +1533,17 @@ void QQuickTextControl::setCursorVisible(bool visible) && (d->interactionFlags & (Qt::TextEditable | Qt::TextSelectableByKeyboard))); } +QRectF QQuickTextControl::anchorRect() const +{ + Q_D(const QQuickTextControl); + QRectF rect; + QTextCursor cursor = d->cursor; + if (!cursor.isNull()) { + rect = d->rectForPosition(cursor.anchor()); + } + return rect; +} + QRectF QQuickTextControl::cursorRect(const QTextCursor &cursor) const { Q_D(const QQuickTextControl); diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h index cee9cff064..602e457cb8 100644 --- a/src/quick/items/qquicktextcontrol_p.h +++ b/src/quick/items/qquicktextcontrol_p.h @@ -98,6 +98,7 @@ public: void setOverwriteMode(bool overwrite); bool cursorVisible() const; void setCursorVisible(bool visible); + QRectF anchorRect() const; QRectF cursorRect(const QTextCursor &cursor) const; QRectF cursorRect() const; QRectF selectionRect(const QTextCursor &cursor) const; diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index a44f549b37..8bb788d008 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -541,7 +541,7 @@ void QQuickTextEdit::setFont(const QFont &font) updateSize(); updateWholeDocument(); #ifndef QT_NO_IM - updateInputMethod(Qt::ImCursorRectangle | Qt::ImFont); + updateInputMethod(Qt::ImCursorRectangle | Qt::ImAnchorRectangle | Qt::ImFont); #endif } emit fontChanged(d->sourceFont); @@ -1729,6 +1729,7 @@ void QQuickTextEdit::select(int start, int end) // QTBUG-11100 updateSelection(); + updateInputMethod(); } /*! @@ -1901,7 +1902,11 @@ QVariant QQuickTextEdit::inputMethodQuery(Qt::InputMethodQuery property, QVarian v = (int)d->effectiveInputMethodHints(); break; default: + if (property == Qt::ImCursorPosition && !argument.isNull()) + argument = QVariant(argument.toPointF() - QPointF(d->xoff, d->yoff)); v = d->control->inputMethodQuery(property, argument); + if (property == Qt::ImCursorRectangle || property == Qt::ImAnchorRectangle) + v = QVariant(v.toRectF().translated(d->xoff, d->yoff)); break; } return v; diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 8bf854aac2..f361d46424 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -401,7 +401,7 @@ void QQuickTextInput::setFont(const QFont &font) d->updateLayout(); updateCursorRectangle(); #ifndef QT_NO_IM - updateInputMethod(Qt::ImCursorRectangle | Qt::ImFont); + updateInputMethod(Qt::ImCursorRectangle | Qt::ImFont | Qt::ImAnchorRectangle); #endif } emit fontChanged(d->sourceFont); @@ -1044,6 +1044,36 @@ void QQuickTextInput::q_validatorChanged() } #endif // QT_NO_VALIDATOR +QRectF QQuickTextInputPrivate::anchorRectangle() const +{ + QRectF rect; + int a; + // Unfortunately we cannot use selectionStart() and selectionEnd() + // since they always assume that the selectionStart is logically before selectionEnd. + // To rely on that would cause havoc if the user was interactively moving the end selection + // handle to become before the start selection + if (m_selstart == m_selend) + // This is to handle the case when there is "no selection" while moving the handle onto the + // same position as the other handle (in which case it would hide the selection handles) + a = m_cursor; + else + a = m_selstart == m_cursor ? m_selend : m_selstart; + if (a >= 0) { +#ifndef QT_NO_IM + a += m_preeditCursor; +#endif + if (m_echoMode == QQuickTextInput::NoEcho) + a = 0; + QTextLine l = m_textLayout.lineForTextPosition(a); + if (l.isValid()) { + qreal x = l.cursorToX(a) - hscroll; + qreal y = l.y() - vscroll; + rect.setRect(x, y, 1, l.height()); + } + } + return rect; +} + void QQuickTextInputPrivate::checkIsValid() { Q_Q(QQuickTextInput); @@ -1889,10 +1919,16 @@ QVariant QQuickTextInput::inputMethodQuery(Qt::InputMethodQuery property, QVaria return QVariant((int) d->effectiveInputMethodHints()); case Qt::ImCursorRectangle: return cursorRectangle(); + case Qt::ImAnchorRectangle: + return d->anchorRectangle(); case Qt::ImFont: return font(); - case Qt::ImCursorPosition: + case Qt::ImCursorPosition: { + const QPointF pt = argument.toPointF(); + if (!pt.isNull()) + return QVariant(d->positionAt(pt)); return QVariant(d->m_cursor); + } case Qt::ImSurroundingText: if (d->m_echoMode == PasswordEchoOnEdit && !d->m_passwordEchoEditing) { return QVariant(displayText()); @@ -2689,7 +2725,7 @@ void QQuickTextInput::updateCursorRectangle(bool scroll) d->cursorItem->setHeight(r.height()); } #ifndef QT_NO_IM - updateInputMethod(Qt::ImCursorRectangle); + updateInputMethod(Qt::ImCursorRectangle | Qt::ImAnchorRectangle); #endif } @@ -3223,8 +3259,8 @@ void QQuickTextInputPrivate::setSelection(int start, int length) emit q->selectionChanged(); emitCursorPositionChanged(); #ifndef QT_NO_IM - q->updateInputMethod(Qt::ImCursorRectangle | Qt::ImAnchorPosition - | Qt::ImCursorPosition | Qt::ImCurrentSelection); + q->updateInputMethod(Qt::ImCursorRectangle | Qt::ImAnchorRectangle | Qt::ImCursorPosition | Qt::ImAnchorPosition + | Qt::ImCurrentSelection); #endif } @@ -3422,8 +3458,8 @@ void QQuickTextInputPrivate::processInputMethodEvent(QInputMethodEvent *event) if (selectionChange) { emit q->selectionChanged(); - q->updateInputMethod(Qt::ImCursorRectangle | Qt::ImAnchorPosition - | Qt::ImCursorPosition | Qt::ImCurrentSelection); + q->updateInputMethod(Qt::ImCursorRectangle | Qt::ImAnchorRectangle + | Qt::ImCurrentSelection); } } #endif // QT_NO_IM diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index d5a138945d..e6bd29bf67 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -342,6 +342,8 @@ public: int selectionStart() const { return hasSelectedText() ? m_selstart : -1; } int selectionEnd() const { return hasSelectedText() ? m_selend : -1; } + QRectF anchorRectangle() const; + int positionAt(qreal x, qreal y, QTextLine::CursorPosition position) const; int positionAt(const QPointF &point, QTextLine::CursorPosition position = QTextLine::CursorBetweenCharacters) const { return positionAt(point.x(), point.y(), position); diff --git a/src/quick/items/qquickwindowmodule.cpp b/src/quick/items/qquickwindowmodule.cpp index 124df8f676..c624d162a9 100644 --- a/src/quick/items/qquickwindowmodule.cpp +++ b/src/quick/items/qquickwindowmodule.cpp @@ -77,18 +77,16 @@ QQuickWindowQmlImpl::QQuickWindowQmlImpl(QWindow *parent) void QQuickWindowQmlImpl::setVisible(bool visible) { Q_D(QQuickWindowQmlImpl); - if (!d->complete) - d->visible = visible; - else if (!transientParent() || transientParent()->isVisible()) + d->visible = visible; + if (d->complete && (!transientParent() || transientParent()->isVisible())) QQuickWindow::setVisible(visible); } void QQuickWindowQmlImpl::setVisibility(Visibility visibility) { Q_D(QQuickWindowQmlImpl); - if (!d->complete) - d->visibility = visibility; - else + d->visibility = visibility; + if (d->complete) QQuickWindow::setVisibility(visibility); } |