diff options
Diffstat (limited to 'src/plugins/platforms/ios')
-rw-r--r-- | src/plugins/platforms/ios/qiosscreen.h | 3 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiosscreen.mm | 44 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiostheme.h | 3 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiostheme.mm | 10 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiosviewcontroller.h | 3 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiosviewcontroller.mm | 62 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qioswindow.mm | 3 | ||||
-rw-r--r-- | src/plugins/platforms/ios/quiview.h | 9 | ||||
-rw-r--r-- | src/plugins/platforms/ios/quiview.mm | 13 |
9 files changed, 88 insertions, 62 deletions
diff --git a/src/plugins/platforms/ios/qiosscreen.h b/src/plugins/platforms/ios/qiosscreen.h index 69fe17d9af..7987ef82d5 100644 --- a/src/plugins/platforms/ios/qiosscreen.h +++ b/src/plugins/platforms/ios/qiosscreen.h @@ -66,9 +66,6 @@ public: void updateProperties(); -public slots: - void updateStatusBarVisibility(); - private: UIScreen *m_uiScreen; UIWindow *m_uiWindow; diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm index 266e6848e2..e70b369b79 100644 --- a/src/plugins/platforms/ios/qiosscreen.mm +++ b/src/plugins/platforms/ios/qiosscreen.mm @@ -187,8 +187,8 @@ QIOSScreen::QIOSScreen(UIScreen *screen) if (screen == [UIScreen mainScreen]) { QString deviceIdentifier = deviceModelIdentifier(); - if (deviceIdentifier == QStringLiteral("iPhone2,1") /* iPhone 3GS */ - || deviceIdentifier == QStringLiteral("iPod3,1") /* iPod touch 3G */) { + if (deviceIdentifier == QLatin1String("iPhone2,1") /* iPhone 3GS */ + || deviceIdentifier == QLatin1String("iPod3,1") /* iPod touch 3G */) { m_depth = 18; } else { m_depth = 24; @@ -225,8 +225,6 @@ QIOSScreen::QIOSScreen(UIScreen *screen) } } - connect(qGuiApp, &QGuiApplication::focusWindowChanged, this, &QIOSScreen::updateStatusBarVisibility); - updateProperties(); } @@ -254,44 +252,6 @@ void QIOSScreen::updateProperties() } } -void QIOSScreen::updateStatusBarVisibility() -{ - if (!isQtApplication()) - return; - - QWindow *focusWindow = QGuiApplication::focusWindow(); - - // If we don't have a focus window we leave the status - // bar as is, so that the user can activate a new window - // with the same window state without the status bar jumping - // back and forth. - if (!focusWindow) - return; - - UIView *view = reinterpret_cast<UIView *>(focusWindow->handle()->winId()); - QIOSViewController *viewController = static_cast<QIOSViewController *>(view.viewController); - - bool currentStatusBarVisibility = [UIApplication sharedApplication].statusBarHidden; - if (viewController.prefersStatusBarHidden == currentStatusBarVisibility) - return; - -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_7_0) - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0) { - [viewController setNeedsStatusBarAppearanceUpdate]; - dispatch_async(dispatch_get_main_queue(), ^{ - updateProperties(); - }); - } else -#endif - { - [[UIApplication sharedApplication] - setStatusBarHidden:[viewController prefersStatusBarHidden] - withAnimation:UIStatusBarAnimationNone]; - - updateProperties(); - } -} - QRect QIOSScreen::geometry() const { return m_geometry; diff --git a/src/plugins/platforms/ios/qiostheme.h b/src/plugins/platforms/ios/qiostheme.h index 16b330a030..4cedc7b879 100644 --- a/src/plugins/platforms/ios/qiostheme.h +++ b/src/plugins/platforms/ios/qiostheme.h @@ -35,6 +35,7 @@ #define QIOSTHEME_H #include <QtCore/QHash> +#include <QtGui/QPalette> #include <qpa/qplatformtheme.h> QT_BEGIN_NAMESPACE @@ -45,6 +46,7 @@ public: QIOSTheme(); ~QIOSTheme(); + const QPalette *palette(Palette type = SystemPalette) const Q_DECL_OVERRIDE; QVariant themeHint(ThemeHint hint) const; QPlatformMenuItem* createPlatformMenuItem() const Q_DECL_OVERRIDE; @@ -56,6 +58,7 @@ public: private: mutable QHash<QPlatformTheme::Font, QFont *> m_fonts; + QPalette m_systemPalette; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qiostheme.mm b/src/plugins/platforms/ios/qiostheme.mm index cbeb157cf2..c89dd7dc05 100644 --- a/src/plugins/platforms/ios/qiostheme.mm +++ b/src/plugins/platforms/ios/qiostheme.mm @@ -60,7 +60,10 @@ QT_BEGIN_NAMESPACE const char *QIOSTheme::name = "ios"; QIOSTheme::QIOSTheme() + : m_systemPalette(*QPlatformTheme::palette(QPlatformTheme::SystemPalette)) { + m_systemPalette.setBrush(QPalette::Highlight, QColor(204, 221, 237)); + m_systemPalette.setBrush(QPalette::HighlightedText, Qt::black); } QIOSTheme::~QIOSTheme() @@ -68,6 +71,13 @@ QIOSTheme::~QIOSTheme() qDeleteAll(m_fonts); } +const QPalette *QIOSTheme::palette(QPlatformTheme::Palette type) const +{ + if (type == QPlatformTheme::SystemPalette) + return &m_systemPalette; + return 0; +} + QPlatformMenuItem* QIOSTheme::createPlatformMenuItem() const { return new QIOSMenuItem(); diff --git a/src/plugins/platforms/ios/qiosviewcontroller.h b/src/plugins/platforms/ios/qiosviewcontroller.h index 2ef6400b26..cbb28aec0d 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.h +++ b/src/plugins/platforms/ios/qiosviewcontroller.h @@ -40,8 +40,9 @@ class QIOSScreen; } @property (nonatomic, assign) BOOL changingOrientation; +@property (nonatomic, assign) BOOL prefersStatusBarHidden; - (id)initWithQIOSScreen:(QIOSScreen *)screen; -- (BOOL)prefersStatusBarHidden; +- (void)updateProperties; @end diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm index 1c06228e81..ca8d48bf6d 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.mm +++ b/src/plugins/platforms/ios/qiosviewcontroller.mm @@ -147,6 +147,13 @@ #endif self.changingOrientation = NO; + + // Status bar may be initially hidden at startup through Info.plist + self.prefersStatusBarHidden = infoPlistValue(@"UIStatusBarHidden", false); + + QObject::connect(qApp, &QGuiApplication::focusWindowChanged, [self]() { + [self updateProperties]; + }); } return self; @@ -173,6 +180,49 @@ [super viewDidUnload]; } +// ------------------------------------------------------------------------- + +- (void)updateProperties +{ + if (!isQtApplication()) + return; + + QWindow *focusWindow = QGuiApplication::focusWindow(); + + // If we don't have a focus window we leave the statusbar + // as is, so that the user can activate a new window with + // the same window state without the status bar jumping + // back and forth. + if (!focusWindow) + return; + + // We only care about changes to focusWindow that involves our screen + if (!focusWindow->screen() || focusWindow->screen()->handle() != m_screen) + return; + + // All decisions are based on the the top level window + focusWindow = qt_window_private(focusWindow)->topLevelWindow(); + + bool currentStatusBarVisibility = self.prefersStatusBarHidden; + self.prefersStatusBarHidden = focusWindow->windowState() == Qt::WindowFullScreen; + if (self.prefersStatusBarHidden != currentStatusBarVisibility) { +#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_7_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0) { + [self setNeedsStatusBarAppearanceUpdate]; + } else +#endif + { + [[UIApplication sharedApplication] + setStatusBarHidden:self.prefersStatusBarHidden + withAnimation:UIStatusBarAnimationNone]; + } + + [self.view setNeedsLayout]; + } +} + +// ------------------------------------------------------------------------- + -(BOOL)shouldAutorotate { // Until a proper orientation and rotation API is in place, we always auto rotate. @@ -261,17 +311,5 @@ } #endif -- (BOOL)prefersStatusBarHidden -{ - static bool hiddenFromPlist = infoPlistValue(@"UIStatusBarHidden", false); - if (hiddenFromPlist) - return YES; - QWindow *focusWindow = QGuiApplication::focusWindow(); - if (!focusWindow) - return [UIApplication sharedApplication].statusBarHidden; - - return qt_window_private(focusWindow)->topLevelWindow()->windowState() == Qt::WindowFullScreen; -} - @end diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm index 1c9fc6f28a..e29ff53876 100644 --- a/src/plugins/platforms/ios/qioswindow.mm +++ b/src/plugins/platforms/ios/qioswindow.mm @@ -119,7 +119,6 @@ void QIOSWindow::setVisible(bool visible) if (visible) { requestActivateWindow(); - static_cast<QIOSScreen *>(screen())->updateStatusBarVisibility(); } else { // Activate top-most visible QWindow: NSArray *subviews = m_view.viewController.view.subviews; @@ -202,7 +201,7 @@ void QIOSWindow::setWindowState(Qt::WindowState state) qt_window_private(window())->windowState = state; if (window()->isTopLevel() && window()->isVisible() && window()->isActive()) - static_cast<QIOSScreen *>(screen())->updateStatusBarVisibility(); + [m_view.qtViewController updateProperties]; switch (state) { case Qt::WindowNoState: diff --git a/src/plugins/platforms/ios/quiview.h b/src/plugins/platforms/ios/quiview.h index a6a8690c2f..fe71e5bed7 100644 --- a/src/plugins/platforms/ios/quiview.h +++ b/src/plugins/platforms/ios/quiview.h @@ -40,6 +40,8 @@ class QIOSWindow; +@class QIOSViewController; + @interface QUIView : UIView { @public @@ -50,7 +52,7 @@ class QIOSWindow; @private NSMutableArray *m_accessibleElements; -} +}; - (id)initWithQIOSWindow:(QIOSWindow *)window; - (void)sendUpdatedExposeEvent; @@ -59,3 +61,8 @@ class QIOSWindow; @interface QUIView (Accessibility) - (void)clearAccessibleCache; @end + +@interface QUIView (QtHelpers) +- (QIOSViewController*)qtViewController; +@end + diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index 4e720941f9..200b07b5fc 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -43,6 +43,7 @@ #include "qiosglobal.h" #include "qiosintegration.h" +#include "qiosviewcontroller.h" #include "qioswindow.h" #include "qiosmenu.h" @@ -207,9 +208,10 @@ // of activating another window. The handleWindowActivated of the activation // will take care of both. dispatch_async(dispatch_get_main_queue (), ^{ - if (![[UIResponder currentFirstResponder] isKindOfClass:[QUIView class]]) + if (![[UIResponder currentFirstResponder] isKindOfClass:[QUIView class]]) { QWindowSystemInterface::handleWindowActivated(0); QWindowSystemInterface::flushWindowSystemEvents(); + } }); return YES; @@ -368,6 +370,15 @@ return nil; } +- (QIOSViewController*)qtViewController +{ + UIViewController *vc = self.viewController; + if ([vc isKindOfClass:QIOSViewController.class]) + return static_cast<QIOSViewController *>(vc); + + return nil; +} + @end // Include category as an alternative to using -ObjC (Apple QA1490) |