summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorJan Arve Sæther <jan-arve.saether@theqtcompany.com>2015-11-26 10:37:24 +0100
committerJan Arve Sæther <jan-arve.saether@theqtcompany.com>2016-04-06 12:26:34 +0000
commit0bb645b1ccc5a9d57b21cf0b2c4306b8e48c611c (patch)
treebf868b455287bffb5b0cab804765802bd3214f1f /src/gui
parent9b699fa839f560a9ea9da69c8975b9aa4654ab8b (diff)
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.cpp40
-rw-r--r--src/gui/kernel/qinputmethod.h3
-rw-r--r--src/gui/kernel/qplatforminputcontext.cpp27
-rw-r--r--src/gui/kernel/qplatforminputcontext.h2
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;