diff options
author | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2011-01-04 18:29:39 +0100 |
---|---|---|
committer | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2011-01-04 18:38:20 +0100 |
commit | 995e3ed3c72f9eb05a2fc6cecf325546289218c8 (patch) | |
tree | 16ece51bd50aa6c5086b0ce424c0a97f84a5e452 | |
parent | 7136f5b90787741e96689c13419aea23244db275 (diff) |
Make Virtual Keyboard / TextInput working.
Not rock solid, but it's better than nothing.
-rw-r--r-- | src/canvas/qxgraphicsview.cpp | 6 | ||||
-rw-r--r-- | src/graphicsitems/qxitem.cpp | 32 | ||||
-rw-r--r-- | src/graphicsitems/qxitem.h | 1 | ||||
-rw-r--r-- | src/graphicsitems/qxitem_p.h | 6 | ||||
-rw-r--r-- | src/graphicsitems/qxtextinput.cpp | 19 |
5 files changed, 36 insertions, 28 deletions
diff --git a/src/canvas/qxgraphicsview.cpp b/src/canvas/qxgraphicsview.cpp index 6c3e257..af661b8 100644 --- a/src/canvas/qxgraphicsview.cpp +++ b/src/canvas/qxgraphicsview.cpp @@ -165,6 +165,8 @@ QxGraphicsView::QxGraphicsView(QWidget *parent) d->animationDriver.install(); else printf("Not using VSync Animation Driver\n"); + + setFocusPolicy(Qt::StrongFocus); } QxGraphicsView::~QxGraphicsView() @@ -362,6 +364,8 @@ bool QxGraphicsViewPrivate::deliverInitialMouseEvent(QxItem *o, QMouseEvent *e) void QxGraphicsView::mousePressEvent(QMouseEvent *e) { if (d->deliverInitialMouseEvent(d->root, e)) { + if (d->mouseGrabber && d->mouseGrabber->focusItem()) + d->setFocusItem(d->mouseGrabber->focusItem()); e->accept(); } else { #ifdef Q_WS_QPA @@ -502,6 +506,7 @@ void QxGraphicsViewPrivate::setFocusItem(QxItem *item) focusItem = 0; QFocusEvent event(QEvent::FocusOut, Qt::OtherFocusReason); QCoreApplication::sendEvent(prevFocusItem, &event); + prevFocusItem->d_func()->view = 0; } QxItem *fi = item; @@ -517,6 +522,7 @@ void QxGraphicsViewPrivate::setFocusItem(QxItem *item) //give focus to new focus item if (focusItem) { + focusItem->d_func()->view = q; focusItem->d_func()->inActiveFocusChain = true; QFocusEvent event(QEvent::FocusOut, Qt::OtherFocusReason); QCoreApplication::sendEvent(focusItem, &event); diff --git a/src/graphicsitems/qxitem.cpp b/src/graphicsitems/qxitem.cpp index 7d6ca35..4af41e7 100644 --- a/src/graphicsitems/qxitem.cpp +++ b/src/graphicsitems/qxitem.cpp @@ -559,13 +559,12 @@ void QxKeysAttached::keyPressed(QKeyEvent *event, bool post) // first process forwards // XXX akennedy - /* - if (d->item && d->item->scene()) { + if (d->item) { d->inPress = true; for (int ii = 0; ii < d->targets.count(); ++ii) { - QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii)); + QxItem *i = d->finalFocusProxy(d->targets.at(ii)); if (i) { - d->item->scene()->sendEvent(i, event); + QCoreApplication::sendEvent(i, event); if (event->isAccepted()) { d->inPress = false; return; @@ -590,7 +589,6 @@ void QxKeysAttached::keyPressed(QKeyEvent *event, bool post) emit pressed(&ke); event->setAccepted(ke.isAccepted()); - */ if (!event->isAccepted()) QxItemKeyFilter::keyPressed(event, post); } @@ -604,13 +602,12 @@ void QxKeysAttached::keyReleased(QKeyEvent *event, bool post) } // XXX akennedy - /* - if (d->item && d->item->scene()) { + if (d->item) { d->inRelease = true; for (int ii = 0; ii < d->targets.count(); ++ii) { - QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii)); + QxItem *i = d->finalFocusProxy(d->targets.at(ii)); if (i) { - d->item->scene()->sendEvent(i, event); + QCoreApplication::sendEvent(i, event); if (event->isAccepted()) { d->inRelease = false; return; @@ -619,7 +616,6 @@ void QxKeysAttached::keyReleased(QKeyEvent *event, bool post) } d->inRelease = false; } - */ QxKeyEvent ke(*event); emit released(&ke); @@ -2315,6 +2311,22 @@ QScriptValue QxItem::mapToItem(const QScriptValue &item, qreal x, qreal y) const return sv; } +QxItem *QxItem::childAt(qreal x, qreal y) const +{ + // Copied from QDeclarativeItem + const QList<QxItem *> children = childItems(); + for (int i = children.count() - 1; i >= 0; --i) { + if (QxItem *child = children.at(i)) { + if (child->isVisible() && child->x() <= x + && child->x() + child->width() >= x + && child->y() <= y + && child->y() + child->height() >= y) + return child; + } + } + return 0; +} + void QxItem::forceFocus() { setFocus(true); diff --git a/src/graphicsitems/qxitem.h b/src/graphicsitems/qxitem.h index 0345023..19bdf1d 100644 --- a/src/graphicsitems/qxitem.h +++ b/src/graphicsitems/qxitem.h @@ -234,6 +234,7 @@ public: Q_INVOKABLE QScriptValue mapFromItem(const QScriptValue &item, qreal x, qreal y) const; Q_INVOKABLE QScriptValue mapToItem(const QScriptValue &item, qreal x, qreal y) const; Q_INVOKABLE void forceFocus(); + Q_INVOKABLE QxItem *childAt(qreal x, qreal y) const; Q_SIGNALS: void xChanged(); diff --git a/src/graphicsitems/qxitem_p.h b/src/graphicsitems/qxitem_p.h index bf623b5..2a6c3b2 100644 --- a/src/graphicsitems/qxitem_p.h +++ b/src/graphicsitems/qxitem_p.h @@ -492,10 +492,10 @@ public: bool isConnected(const char *signalName); - QGraphicsItem *finalFocusProxy(QGraphicsItem *item) const + QxItem *finalFocusProxy(QxItem *item) const { - QGraphicsItem *fp; - while ((fp = item->focusProxy())) + QxItem *fp; + while ((fp = item->focusItem())) item = fp; return item; } diff --git a/src/graphicsitems/qxtextinput.cpp b/src/graphicsitems/qxtextinput.cpp index 45cdadf..0ed4563 100644 --- a/src/graphicsitems/qxtextinput.cpp +++ b/src/graphicsitems/qxtextinput.cpp @@ -1334,15 +1334,10 @@ void QxTextInput::moveCursorSelection(int position) void QxTextInput::openSoftwareInputPanel() { QEvent event(QEvent::RequestSoftwareInputPanel); - /* XXX if (qApp) { - if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) { - if (view->scene() && view->scene() == scene()) { - QApplication::sendEvent(view, &event); - } - } + if (QxGraphicsView *view = qobject_cast<QxGraphicsView *>(qApp->focusWidget())) + QApplication::sendEvent(view, &event); } - */ } /*! @@ -1387,16 +1382,10 @@ void QxTextInput::openSoftwareInputPanel() void QxTextInput::closeSoftwareInputPanel() { QEvent event(QEvent::CloseSoftwareInputPanel); - /* XXX if (qApp) { - QEvent event(QEvent::CloseSoftwareInputPanel); - if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) { - if (view->scene() && view->scene() == scene()) { - QApplication::sendEvent(view, &event); - } - } + if (QxGraphicsView *view = qobject_cast<QxGraphicsView *>(qApp->focusWidget())) + QApplication::sendEvent(view, &event); } - */ } void QxTextInput::focusInEvent(QFocusEvent *event) |