iOS: Return correct QLocale from QIOSInputContext

Ensure we return a correct QLocale on iOS by overriding
QPlatformInputContext::locale().

A broader implementation involving subclassing QSystemLocale
will be done in dev.

Task-number: QTBUG-48772
Change-Id: I5250bdad320cbe66d63456926f6eab6fc2865424
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>
This commit is contained in:
Richard Moe Gustavsen 2016-05-26 15:06:11 +02:00
parent 2ceacd5372
commit 0e70d35f15
2 changed files with 45 additions and 0 deletions

View File

@ -36,6 +36,7 @@
#include <UIKit/UIKit.h>
#include <QtCore/qlocale.h>
#include <QtGui/qevent.h>
#include <QtGui/qtransform.h>
#include <qpa/qplatforminputcontext.h>
@ -46,6 +47,7 @@ const char kImePlatformDataReturnKeyType[] = "returnKeyType";
QT_BEGIN_NAMESPACE
@class QIOSLocaleListener;
@class QIOSKeyboardListener;
@class QIOSTextInputResponder;
@protocol KeyboardState;
@ -92,6 +94,8 @@ public:
void reset() Q_DECL_OVERRIDE;
void commit() Q_DECL_OVERRIDE;
QLocale locale() const Q_DECL_OVERRIDE;
void clearCurrentFocusObject();
void setFocusObject(QObject *object) Q_DECL_OVERRIDE;
@ -112,6 +116,7 @@ public:
private:
UIView* scrollableRootView();
QIOSLocaleListener *m_localeListener;
QIOSKeyboardListener *m_keyboardHideGesture;
QIOSTextInputResponder *m_textResponder;
KeyboardState m_keyboardState;

View File

@ -56,6 +56,39 @@ static QUIView *focusView()
// -------------------------------------------------------------------------
@interface QIOSLocaleListener : NSObject
@end
@implementation QIOSLocaleListener
- (id)init
{
if (self = [super init]) {
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(localeDidChange:)
name:NSCurrentLocaleDidChangeNotification object:nil];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
- (void)localeDidChange:(NSNotification *)notification
{
Q_UNUSED(notification);
QIOSInputContext::instance()->emitLocaleChanged();
}
@end
// -------------------------------------------------------------------------
@interface QIOSKeyboardListener : UIGestureRecognizer <UIGestureRecognizerDelegate> {
@private
QIOSInputContext *m_context;
@ -285,6 +318,7 @@ QIOSInputContext *QIOSInputContext::instance()
QIOSInputContext::QIOSInputContext()
: QPlatformInputContext()
, m_localeListener([QIOSLocaleListener new])
, m_keyboardHideGesture([[QIOSKeyboardListener alloc] initWithQIOSInputContext:this])
, m_textResponder(0)
{
@ -298,6 +332,7 @@ QIOSInputContext::QIOSInputContext()
QIOSInputContext::~QIOSInputContext()
{
[m_localeListener release];
[m_keyboardHideGesture.view removeGestureRecognizer:m_keyboardHideGesture];
[m_keyboardHideGesture release];
@ -657,3 +692,8 @@ void QIOSInputContext::commit()
[m_textResponder unmarkText];
[m_textResponder notifyInputDelegate:Qt::ImSurroundingText];
}
QLocale QIOSInputContext::locale() const
{
return QLocale(QString::fromNSString([[NSLocale currentLocale] objectForKey:NSLocaleIdentifier]));
}