From 4dffab4c39f686f4dc3136adcd838f3591ca0bfc Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 23 Sep 2014 15:08:14 +0200 Subject: iOS: add support for submenus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I3816f2518125ad9c013ab578853295bf2c6bd02e Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/ios/qiosmenu.h | 7 ++++++- src/plugins/platforms/ios/qiosmenu.mm | 39 ++++++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/plugins/platforms/ios/qiosmenu.h b/src/plugins/platforms/ios/qiosmenu.h index 5a153c9a06..37578cdb24 100644 --- a/src/plugins/platforms/ios/qiosmenu.h +++ b/src/plugins/platforms/ios/qiosmenu.h @@ -49,6 +49,7 @@ #import "quiview.h" +class QIOSMenu; @class QUIMenuController; @class QUIPickerView; @@ -62,7 +63,7 @@ public: void setText(const QString &text) Q_DECL_OVERRIDE; void setIcon(const QIcon &) Q_DECL_OVERRIDE {} - void setMenu(QPlatformMenu *) Q_DECL_OVERRIDE {} + void setMenu(QPlatformMenu *) Q_DECL_OVERRIDE; void setVisible(bool isVisible) Q_DECL_OVERRIDE; void setIsSeparator(bool) Q_DECL_OVERRIDE; void setFont(const QFont &) Q_DECL_OVERRIDE {} @@ -79,6 +80,7 @@ public: MenuRole m_role; bool m_enabled; bool m_separator; + QIOSMenu *m_menu; private: QString removeMnemonics(const QString &original); @@ -112,6 +114,8 @@ public: QPlatformMenuItem *menuItemAt(int position) const Q_DECL_OVERRIDE; QPlatformMenuItem *menuItemForTag(quintptr tag) const Q_DECL_OVERRIDE; + void handleItemSelected(QIOSMenuItem *menuItem); + static QIOSMenu *currentMenu() { return m_currentMenu; } static id menuActionTarget() { return m_currentMenu ? m_currentMenu->m_menuController : 0; } @@ -126,6 +130,7 @@ private: QString m_text; MenuType m_menuType; MenuType m_effectiveMenuType; + QPointer m_parentWindow; QRect m_targetRect; const QIOSMenuItem *m_targetItem; QUIMenuController *m_menuController; diff --git a/src/plugins/platforms/ios/qiosmenu.mm b/src/plugins/platforms/ios/qiosmenu.mm index 27c747a7dc..431a8879d5 100644 --- a/src/plugins/platforms/ios/qiosmenu.mm +++ b/src/plugins/platforms/ios/qiosmenu.mm @@ -107,9 +107,7 @@ static NSString *const kSelectorPrefix = @"_qtMenuItem_"; NSString *selector = NSStringFromSelector(invocation.selector); NSRange range = NSMakeRange(kSelectorPrefix.length, selector.length - kSelectorPrefix.length - 1); NSInteger selectedIndex = [[selector substringWithRange:range] integerValue]; - - emit m_visibleMenuItems.at(selectedIndex)->activated(); - QIOSMenu::currentMenu()->setVisible(false); + QIOSMenu::currentMenu()->handleItemSelected(m_visibleMenuItems.at(selectedIndex)); } @end @@ -195,8 +193,9 @@ static NSString *const kSelectorPrefix = @"_qtMenuItem_"; - (void)closeMenu { if (!m_visibleMenuItems.isEmpty()) - emit m_visibleMenuItems.at(m_selectedRow)->activated(); - QIOSMenu::currentMenu()->setVisible(false); + QIOSMenu::currentMenu()->handleItemSelected(m_visibleMenuItems.at(m_selectedRow)); + else + QIOSMenu::currentMenu()->setVisible(false); } - (void)cancelMenu @@ -216,6 +215,7 @@ QIOSMenuItem::QIOSMenuItem() , m_role(MenuRole(0)) , m_enabled(true) , m_separator(false) + , m_menu(0) { } @@ -234,6 +234,11 @@ void QIOSMenuItem::setText(const QString &text) m_text = removeMnemonics(text); } +void QIOSMenuItem::setMenu(QPlatformMenu *menu) +{ + m_menu = static_cast(menu); +} + void QIOSMenuItem::setVisible(bool isVisible) { m_visible = isVisible; @@ -299,7 +304,7 @@ QIOSMenu::QIOSMenu() , m_text(QString()) , m_menuType(DefaultMenu) , m_effectiveMenuType(DefaultMenu) - , m_targetRect(QRect(qGuiApp->primaryScreen()->availableGeometry().center(), QSize())) + , m_parentWindow(0) , m_targetItem(0) , m_menuController(0) , m_pickerView(0) @@ -352,13 +357,27 @@ void QIOSMenu::setEnabled(bool enabled) void QIOSMenu::showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item) { - if (!parentWindow->isActive()) - const_cast(parentWindow)->requestActivate(); - m_targetRect = QRect(parentWindow->mapToGlobal(targetRect.topLeft()), targetRect.size()); + m_parentWindow = const_cast(parentWindow); + m_targetRect = targetRect; m_targetItem = static_cast(item); + + if (m_parentWindow && !m_parentWindow->isActive()) + m_parentWindow->requestActivate(); + setVisible(true); } +void QIOSMenu::handleItemSelected(QIOSMenuItem *menuItem) +{ + emit menuItem->activated(); + setVisible(false); + + if (QIOSMenu *menu = menuItem->m_menu) { + menu->setMenuType(m_effectiveMenuType); + menu->showPopup(m_parentWindow, m_targetRect, 0); + } +} + void QIOSMenu::dismiss() { setVisible(false); @@ -504,7 +523,7 @@ void QIOSMenu::repositionMenu() { switch (m_effectiveMenuType) { case EditMenu: { - UIView *view = [UIApplication sharedApplication].keyWindow.rootViewController.view; + UIView *view = reinterpret_cast(m_parentWindow->winId()); [[UIMenuController sharedMenuController] setTargetRect:toCGRect(m_targetRect) inView:view]; [[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES]; break; } -- cgit v1.2.3