summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/ios
diff options
context:
space:
mode:
authorRichard Moe Gustavsen <richard.gustavsen@digia.com>2014-09-23 15:08:14 +0200
committerRichard Moe Gustavsen <richard.gustavsen@digia.com>2014-09-25 15:35:52 +0200
commit4dffab4c39f686f4dc3136adcd838f3591ca0bfc (patch)
tree331edfdc7807db6bc3b1bb59bf6954431e200bfd /src/plugins/platforms/ios
parent28b5038d1bb426b43df9a18b7ce7343c154bc6f4 (diff)
iOS: add support for submenus
Change-Id: I3816f2518125ad9c013ab578853295bf2c6bd02e Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
Diffstat (limited to 'src/plugins/platforms/ios')
-rw-r--r--src/plugins/platforms/ios/qiosmenu.h7
-rw-r--r--src/plugins/platforms/ios/qiosmenu.mm39
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<QWindow> 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<QIOSMenu *>(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<QWindow *>(parentWindow)->requestActivate();
- m_targetRect = QRect(parentWindow->mapToGlobal(targetRect.topLeft()), targetRect.size());
+ m_parentWindow = const_cast<QWindow *>(parentWindow);
+ m_targetRect = targetRect;
m_targetItem = static_cast<const QIOSMenuItem *>(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<UIView *>(m_parentWindow->winId());
[[UIMenuController sharedMenuController] setTargetRect:toCGRect(m_targetRect) inView:view];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
break; }