diff options
author | Sami Lempinen <sami.lempinen@nokia.com> | 2011-08-23 11:33:16 (GMT) |
---|---|---|
committer | Sami Lempinen <sami.lempinen@nokia.com> | 2011-08-23 11:33:16 (GMT) |
commit | a28832bb61e7e60ac0fb856daf27b78ff1728520 (patch) | |
tree | d8ecd2387568814a68bf8b8713f3abed9ff9f275 /src/plugins/platforms/uikit/quikiteventloop.mm | |
parent | 59f33898919391d3aa4baa6849556965ae7d08ce (diff) | |
parent | 2f5855e8d891a7e93bdb721243f1c0b10fcb5ad9 (diff) | |
download | Qt-a28832bb61e7e60ac0fb856daf27b78ff1728520.zip Qt-a28832bb61e7e60ac0fb856daf27b78ff1728520.tar.gz Qt-a28832bb61e7e60ac0fb856daf27b78ff1728520.tar.bz2 |
Merge remote-tracking branch 'qt/4.8'
Diffstat (limited to 'src/plugins/platforms/uikit/quikiteventloop.mm')
-rw-r--r-- | src/plugins/platforms/uikit/quikiteventloop.mm | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/src/plugins/platforms/uikit/quikiteventloop.mm b/src/plugins/platforms/uikit/quikiteventloop.mm index 01ecf3f..7df7ec8 100644 --- a/src/plugins/platforms/uikit/quikiteventloop.mm +++ b/src/plugins/platforms/uikit/quikiteventloop.mm @@ -49,6 +49,8 @@ #include <QtGui/QApplication> #include <QtGui/QWidget> +#include <QtDeclarative/QDeclarativeView> +#include <QtDeclarative/QDeclarativeItem> #include <QtDebug> @interface QUIKitAppDelegate : NSObject <UIApplicationDelegate> { @@ -212,24 +214,69 @@ void QUIKitEventLoop::qtNeedsToProcessEvents() [mHelper performSelectorOnMainThread:@selector(processEvents) withObject:nil waitUntilDone:NO]; } +static UIReturnKeyType keyTypeForObject(QObject *obj) +{ + if (strcmp(obj->metaObject()->className(), "QDeclarativeTextEdit") == 0) + return UIReturnKeyDefault; + return UIReturnKeyDone; +} + bool QUIKitSoftwareInputHandler::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::RequestSoftwareInputPanel) { + UIReturnKeyType returnKeyType = UIReturnKeyDone; + if (QDeclarativeView *declarativeView = qobject_cast<QDeclarativeView *>(obj)) { + // register on loosing the focus, so we can auto-remove the input panel again + QGraphicsScene *scene = declarativeView->scene(); + if (scene) { + if (mCurrentFocusObject) + disconnect(mCurrentFocusObject, 0, this, SLOT(activeFocusChanged(bool))); + QDeclarativeItem *focus = static_cast<QDeclarativeItem *>(scene->focusItem()); + mCurrentFocusObject = focus; + if (focus) { + connect(mCurrentFocusObject, SIGNAL(activeFocusChanged(bool)), this, SLOT(activeFocusChanged(bool))); + returnKeyType = keyTypeForObject(mCurrentFocusObject); + } + } + } QWidget *widget = qobject_cast<QWidget *>(obj); if (widget) { + mCurrentFocusWidget = widget; QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(widget->window()->platformWindow()); - if (platformWindow) [platformWindow->nativeView() becomeFirstResponder]; + if (platformWindow) { + platformWindow->nativeView().returnKeyType = returnKeyType; + [platformWindow->nativeView() becomeFirstResponder]; + } return true; } } else if (event->type() == QEvent::CloseSoftwareInputPanel) { QWidget *widget = qobject_cast<QWidget *>(obj); - if (widget) { - QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(widget->window()->platformWindow()); - if (platformWindow) [platformWindow->nativeView() resignFirstResponder]; - return true; + return closeSoftwareInputPanel(widget); + } + return false; +} + +bool QUIKitSoftwareInputHandler::closeSoftwareInputPanel(QWidget *widget) +{ + if (widget) { + QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(widget->window()->platformWindow()); + if (platformWindow) { + [platformWindow->nativeView() resignFirstResponder]; + mCurrentFocusWidget = 0; + if (mCurrentFocusObject) + disconnect(mCurrentFocusObject, 0, this, SLOT(activeFocusChanged(bool))); + mCurrentFocusObject = 0; } + return true; } return false; } +void QUIKitSoftwareInputHandler::activeFocusChanged(bool focus) +{ + if (!focus && mCurrentFocusWidget && mCurrentFocusObject) { + closeSoftwareInputPanel(mCurrentFocusWidget); + } +} + QT_END_NAMESPACE |