diff options
author | Jan Arve Sæther <jan-arve.saether@theqtcompany.com> | 2015-11-26 10:37:24 +0100 |
---|---|---|
committer | Jan Arve Sæther <jan-arve.saether@theqtcompany.com> | 2016-04-06 12:26:34 +0000 |
commit | 0bb645b1ccc5a9d57b21cf0b2c4306b8e48c611c (patch) | |
tree | bf868b455287bffb5b0cab804765802bd3214f1f /src/gui | |
parent | 9b699fa839f560a9ea9da69c8975b9aa4654ab8b (diff) | |
download | qtbase-0bb645b1ccc5a9d57b21cf0b2c4306b8e48c611c.tar.gz |
Add support for ImhAnchorRectangle
Adds the following API:
* QInputMethod::anchorRectangle()
* QPlatformInputContext::setSelectionOnFocusObject()
This will be used for determining how to display selection handles.
Change-Id: If57e3fd58ff0f1ba7899f7dd62bfa9c006028667
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@theqtcompany.com>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/kernel/qinputmethod.cpp | 40 | ||||
-rw-r--r-- | src/gui/kernel/qinputmethod.h | 3 | ||||
-rw-r--r-- | src/gui/kernel/qplatforminputcontext.cpp | 27 | ||||
-rw-r--r-- | src/gui/kernel/qplatforminputcontext.h | 2 |
4 files changed, 62 insertions, 10 deletions
diff --git a/src/gui/kernel/qinputmethod.cpp b/src/gui/kernel/qinputmethod.cpp index ca988f2523..b81e166d3a 100644 --- a/src/gui/kernel/qinputmethod.cpp +++ b/src/gui/kernel/qinputmethod.cpp @@ -97,6 +97,7 @@ void QInputMethod::setInputItemTransform(const QTransform &transform) d->inputItemTransform = transform; emit cursorRectangleChanged(); + emit anchorRectangleChanged(); } @@ -126,6 +127,19 @@ void QInputMethod::setInputItemRectangle(const QRectF &rect) d->inputRectangle = rect; } +static QRectF inputMethodQueryRectangle_helper(Qt::InputMethodQuery imquery, const QTransform &xform) +{ + QRectF r; + if (QObject *focusObject = qGuiApp->focusObject()) { + QInputMethodQueryEvent query(imquery); + QGuiApplication::sendEvent(focusObject, &query); + r = query.value(imquery).toRectF(); + if (r.isValid()) + r = xform.mapRect(r); + } + return r; +} + /*! \property QInputMethod::cursorRectangle \brief Input item's cursor rectangle in window coordinates. @@ -136,18 +150,20 @@ void QInputMethod::setInputItemRectangle(const QRectF &rect) QRectF QInputMethod::cursorRectangle() const { Q_D(const QInputMethod); + return inputMethodQueryRectangle_helper(Qt::ImCursorRectangle, d->inputItemTransform); +} - QObject *focusObject = qGuiApp->focusObject(); - if (!focusObject) - return QRectF(); - - QInputMethodQueryEvent query(Qt::ImCursorRectangle); - QGuiApplication::sendEvent(focusObject, &query); - QRectF r = query.value(Qt::ImCursorRectangle).toRectF(); - if (!r.isValid()) - return QRectF(); +/*! + \property QInputMethod::anchorRectangle + \brief Input item's anchor rectangle in window coordinates. - return d->inputItemTransform.mapRect(r); + Anchor rectangle is often used by various text editing controls + like text prediction popups for following the text selection. +*/ +QRectF QInputMethod::anchorRectangle() const +{ + Q_D(const QInputMethod); + return inputMethodQueryRectangle_helper(Qt::ImAnchorRectangle, d->inputItemTransform); } /*! @@ -300,6 +316,10 @@ void QInputMethod::update(Qt::InputMethodQueries queries) if (queries & Qt::ImCursorRectangle) emit cursorRectangleChanged(); + + if (queries & (Qt::ImAnchorRectangle)) + emit anchorRectangleChanged(); + } /*! diff --git a/src/gui/kernel/qinputmethod.h b/src/gui/kernel/qinputmethod.h index 68dc679d14..22e4677eaa 100644 --- a/src/gui/kernel/qinputmethod.h +++ b/src/gui/kernel/qinputmethod.h @@ -55,6 +55,7 @@ class Q_GUI_EXPORT QInputMethod : public QObject Q_OBJECT Q_DECLARE_PRIVATE(QInputMethod) Q_PROPERTY(QRectF cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged) + Q_PROPERTY(QRectF anchorRectangle READ anchorRectangle NOTIFY anchorRectangleChanged) Q_PROPERTY(QRectF keyboardRectangle READ keyboardRectangle NOTIFY keyboardRectangleChanged) Q_PROPERTY(bool visible READ isVisible NOTIFY visibleChanged) Q_PROPERTY(bool animating READ isAnimating NOTIFY animatingChanged) @@ -70,6 +71,7 @@ public: // in window coordinates QRectF cursorRectangle() const; // ### what if we have rotations for the item? + QRectF anchorRectangle() const; // ### ditto // keyboard geometry in window coords QRectF keyboardRectangle() const; @@ -102,6 +104,7 @@ public Q_SLOTS: Q_SIGNALS: void cursorRectangleChanged(); + void anchorRectangleChanged(); void keyboardRectangleChanged(); void visibleChanged(); void animatingChanged(); diff --git a/src/gui/kernel/qplatforminputcontext.cpp b/src/gui/kernel/qplatforminputcontext.cpp index bad6422cb8..3f59116e9a 100644 --- a/src/gui/kernel/qplatforminputcontext.cpp +++ b/src/gui/kernel/qplatforminputcontext.cpp @@ -43,6 +43,8 @@ #include "private/qkeymapper_p.h" #include <qpa/qplatforminputcontext_p.h> +#include <QtGui/qtransform.h> + QT_BEGIN_NAMESPACE /*! @@ -267,5 +269,30 @@ void QPlatformInputContextPrivate::setInputMethodAccepted(bool accepted) QPlatformInputContextPrivate::s_inputMethodAccepted = accepted; } +/*! + * \brief QPlatformInputContext::setSelectionOnFocusObject + * \param anchorPos Beginning of selection in currently active window coordinates + * \param cursorPos End of selection in currently active window coordinates + */ +void QPlatformInputContext::setSelectionOnFocusObject(const QPointF &anchorPos, const QPointF &cursorPos) +{ + QObject *focus = qApp->focusObject(); + if (!focus) + return; + + QInputMethod *im = QGuiApplication::inputMethod(); + const QTransform mapToLocal = im->inputItemTransform().inverted(); + bool success; + int anchor = QInputMethod::queryFocusObject(Qt::ImCursorPosition, anchorPos * mapToLocal).toInt(&success); + if (success) { + int cursor = QInputMethod::queryFocusObject(Qt::ImCursorPosition, cursorPos * mapToLocal).toInt(&success); + if (success) { + QList<QInputMethodEvent::Attribute> imAttributes; + imAttributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Selection, anchor, cursor - anchor, QVariant())); + QInputMethodEvent event(QString(), imAttributes); + QGuiApplication::sendEvent(focus, &event); + } + } +} QT_END_NAMESPACE diff --git a/src/gui/kernel/qplatforminputcontext.h b/src/gui/kernel/qplatforminputcontext.h index 24c6178541..7afa6b82f2 100644 --- a/src/gui/kernel/qplatforminputcontext.h +++ b/src/gui/kernel/qplatforminputcontext.h @@ -95,6 +95,8 @@ public: virtual void setFocusObject(QObject *object); bool inputMethodAccepted() const; + static void setSelectionOnFocusObject(const QPointF &anchorPos, const QPointF &cursorPos); + private: friend class QGuiApplication; friend class QGuiApplicationPrivate; |