summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Nilsen <bjorn.nilsen@nokia.com>2011-01-04 18:29:39 +0100
committerBjørn Erik Nilsen <bjorn.nilsen@nokia.com>2011-01-04 18:38:20 +0100
commit995e3ed3c72f9eb05a2fc6cecf325546289218c8 (patch)
tree16ece51bd50aa6c5086b0ce424c0a97f84a5e452
parent7136f5b90787741e96689c13419aea23244db275 (diff)
Make Virtual Keyboard / TextInput working.
Not rock solid, but it's better than nothing.
-rw-r--r--src/canvas/qxgraphicsview.cpp6
-rw-r--r--src/graphicsitems/qxitem.cpp32
-rw-r--r--src/graphicsitems/qxitem.h1
-rw-r--r--src/graphicsitems/qxitem_p.h6
-rw-r--r--src/graphicsitems/qxtextinput.cpp19
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)