summaryrefslogtreecommitdiffstats
path: root/src/declarative/fx/qfxkeyproxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/fx/qfxkeyproxy.cpp')
-rw-r--r--src/declarative/fx/qfxkeyproxy.cpp46
1 files changed, 33 insertions, 13 deletions
diff --git a/src/declarative/fx/qfxkeyproxy.cpp b/src/declarative/fx/qfxkeyproxy.cpp
index f234a0f..e4b4269 100644
--- a/src/declarative/fx/qfxkeyproxy.cpp
+++ b/src/declarative/fx/qfxkeyproxy.cpp
@@ -82,13 +82,15 @@ QML_DEFINE_TYPE(QFxKeyProxy,KeyProxy)
class QFxKeyProxyPrivate
{
public:
- QFxKeyProxyPrivate() : inPress(false), inRelease(false), inIM(false) {}
+ QFxKeyProxyPrivate() : inPress(false), inRelease(false), inIM(false), imeItem(0) {}
QList<QFxItem *> targets;
//loop detection
bool inPress:1;
bool inRelease:1;
bool inIM:1;
+
+ QFxItem *imeItem;
};
QFxKeyProxy::QFxKeyProxy(QFxItem *parent)
@@ -124,11 +126,12 @@ void QFxKeyProxy::keyPressEvent(QKeyEvent *e)
d->inPress = true;
for (int ii = 0; ii < d->targets.count(); ++ii) {
QFxItem *i = qobject_cast<QFxItem *>(scene()->focusItem(d->targets.at(ii)));
- if (i)
+ if (i) {
scene()->sendEvent(i, e);
- if (e->isAccepted()) {
- d->inPress = false;
- return;
+ if (e->isAccepted()) {
+ d->inPress = false;
+ return;
+ }
}
}
d->inPress = false;
@@ -143,11 +146,12 @@ void QFxKeyProxy::keyReleaseEvent(QKeyEvent *e)
d->inRelease = true;
for (int ii = 0; ii < d->targets.count(); ++ii) {
QFxItem *i = qobject_cast<QFxItem *>(scene()->focusItem(d->targets.at(ii)));
- if (i)
+ if (i) {
scene()->sendEvent(i, e);
- if (e->isAccepted()) {
- d->inRelease = false;
- return;
+ if (e->isAccepted()) {
+ d->inRelease = false;
+ return;
+ }
}
}
d->inRelease = false;
@@ -162,15 +166,31 @@ void QFxKeyProxy::inputMethodEvent(QInputMethodEvent *e)
d->inIM = true;
for (int ii = 0; ii < d->targets.count(); ++ii) {
QFxItem *i = qobject_cast<QFxItem *>(scene()->focusItem(d->targets.at(ii)));
- if (i)
+ if (i && (i->options() & AcceptsInputMethods)) {
scene()->sendEvent(i, e);
- if (e->isAccepted()) {
- d->inIM = false;
- return;
+ if (e->isAccepted()) {
+ d->imeItem = i;
+ d->inIM = false;
+ return;
+ }
}
}
d->inIM = false;
}
}
+QVariant QFxKeyProxy::inputMethodQuery(Qt::InputMethodQuery query) const
+{
+ for (int ii = 0; ii < d->targets.count(); ++ii) {
+ QFxItem *i = qobject_cast<QFxItem *>(scene()->focusItem(d->targets.at(ii)));
+ if (i && (i->options() & AcceptsInputMethods) && i == d->imeItem) { //### how robust is i == d->imeItem check?
+ QVariant v = i->inputMethodQuery(query);
+ if (v.type() == QVariant::RectF)
+ v = mapRectFromItem(i, v.toRectF()); //### cost?
+ return v;
+ }
+ }
+ return QFxItem::inputMethodQuery(query);
+}
+
QT_END_NAMESPACE