iOS: add support for submenus
Change-Id: I3816f2518125ad9c013ab578853295bf2c6bd02e Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
This commit is contained in:
parent
28b5038d1b
commit
4dffab4c39
@ -49,6 +49,7 @@
|
|||||||
|
|
||||||
#import "quiview.h"
|
#import "quiview.h"
|
||||||
|
|
||||||
|
class QIOSMenu;
|
||||||
@class QUIMenuController;
|
@class QUIMenuController;
|
||||||
@class QUIPickerView;
|
@class QUIPickerView;
|
||||||
|
|
||||||
@ -62,7 +63,7 @@ public:
|
|||||||
|
|
||||||
void setText(const QString &text) Q_DECL_OVERRIDE;
|
void setText(const QString &text) Q_DECL_OVERRIDE;
|
||||||
void setIcon(const QIcon &) 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 setVisible(bool isVisible) Q_DECL_OVERRIDE;
|
||||||
void setIsSeparator(bool) Q_DECL_OVERRIDE;
|
void setIsSeparator(bool) Q_DECL_OVERRIDE;
|
||||||
void setFont(const QFont &) Q_DECL_OVERRIDE {}
|
void setFont(const QFont &) Q_DECL_OVERRIDE {}
|
||||||
@ -79,6 +80,7 @@ public:
|
|||||||
MenuRole m_role;
|
MenuRole m_role;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
bool m_separator;
|
bool m_separator;
|
||||||
|
QIOSMenu *m_menu;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString removeMnemonics(const QString &original);
|
QString removeMnemonics(const QString &original);
|
||||||
@ -112,6 +114,8 @@ public:
|
|||||||
QPlatformMenuItem *menuItemAt(int position) const Q_DECL_OVERRIDE;
|
QPlatformMenuItem *menuItemAt(int position) const Q_DECL_OVERRIDE;
|
||||||
QPlatformMenuItem *menuItemForTag(quintptr tag) const Q_DECL_OVERRIDE;
|
QPlatformMenuItem *menuItemForTag(quintptr tag) const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
void handleItemSelected(QIOSMenuItem *menuItem);
|
||||||
|
|
||||||
static QIOSMenu *currentMenu() { return m_currentMenu; }
|
static QIOSMenu *currentMenu() { return m_currentMenu; }
|
||||||
static id menuActionTarget() { return m_currentMenu ? m_currentMenu->m_menuController : 0; }
|
static id menuActionTarget() { return m_currentMenu ? m_currentMenu->m_menuController : 0; }
|
||||||
|
|
||||||
@ -126,6 +130,7 @@ private:
|
|||||||
QString m_text;
|
QString m_text;
|
||||||
MenuType m_menuType;
|
MenuType m_menuType;
|
||||||
MenuType m_effectiveMenuType;
|
MenuType m_effectiveMenuType;
|
||||||
|
QPointer<QWindow> m_parentWindow;
|
||||||
QRect m_targetRect;
|
QRect m_targetRect;
|
||||||
const QIOSMenuItem *m_targetItem;
|
const QIOSMenuItem *m_targetItem;
|
||||||
QUIMenuController *m_menuController;
|
QUIMenuController *m_menuController;
|
||||||
|
@ -107,9 +107,7 @@ static NSString *const kSelectorPrefix = @"_qtMenuItem_";
|
|||||||
NSString *selector = NSStringFromSelector(invocation.selector);
|
NSString *selector = NSStringFromSelector(invocation.selector);
|
||||||
NSRange range = NSMakeRange(kSelectorPrefix.length, selector.length - kSelectorPrefix.length - 1);
|
NSRange range = NSMakeRange(kSelectorPrefix.length, selector.length - kSelectorPrefix.length - 1);
|
||||||
NSInteger selectedIndex = [[selector substringWithRange:range] integerValue];
|
NSInteger selectedIndex = [[selector substringWithRange:range] integerValue];
|
||||||
|
QIOSMenu::currentMenu()->handleItemSelected(m_visibleMenuItems.at(selectedIndex));
|
||||||
emit m_visibleMenuItems.at(selectedIndex)->activated();
|
|
||||||
QIOSMenu::currentMenu()->setVisible(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@ -195,8 +193,9 @@ static NSString *const kSelectorPrefix = @"_qtMenuItem_";
|
|||||||
- (void)closeMenu
|
- (void)closeMenu
|
||||||
{
|
{
|
||||||
if (!m_visibleMenuItems.isEmpty())
|
if (!m_visibleMenuItems.isEmpty())
|
||||||
emit m_visibleMenuItems.at(m_selectedRow)->activated();
|
QIOSMenu::currentMenu()->handleItemSelected(m_visibleMenuItems.at(m_selectedRow));
|
||||||
QIOSMenu::currentMenu()->setVisible(false);
|
else
|
||||||
|
QIOSMenu::currentMenu()->setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)cancelMenu
|
- (void)cancelMenu
|
||||||
@ -216,6 +215,7 @@ QIOSMenuItem::QIOSMenuItem()
|
|||||||
, m_role(MenuRole(0))
|
, m_role(MenuRole(0))
|
||||||
, m_enabled(true)
|
, m_enabled(true)
|
||||||
, m_separator(false)
|
, m_separator(false)
|
||||||
|
, m_menu(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,6 +234,11 @@ void QIOSMenuItem::setText(const QString &text)
|
|||||||
m_text = removeMnemonics(text);
|
m_text = removeMnemonics(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QIOSMenuItem::setMenu(QPlatformMenu *menu)
|
||||||
|
{
|
||||||
|
m_menu = static_cast<QIOSMenu *>(menu);
|
||||||
|
}
|
||||||
|
|
||||||
void QIOSMenuItem::setVisible(bool isVisible)
|
void QIOSMenuItem::setVisible(bool isVisible)
|
||||||
{
|
{
|
||||||
m_visible = isVisible;
|
m_visible = isVisible;
|
||||||
@ -299,7 +304,7 @@ QIOSMenu::QIOSMenu()
|
|||||||
, m_text(QString())
|
, m_text(QString())
|
||||||
, m_menuType(DefaultMenu)
|
, m_menuType(DefaultMenu)
|
||||||
, m_effectiveMenuType(DefaultMenu)
|
, m_effectiveMenuType(DefaultMenu)
|
||||||
, m_targetRect(QRect(qGuiApp->primaryScreen()->availableGeometry().center(), QSize()))
|
, m_parentWindow(0)
|
||||||
, m_targetItem(0)
|
, m_targetItem(0)
|
||||||
, m_menuController(0)
|
, m_menuController(0)
|
||||||
, m_pickerView(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)
|
void QIOSMenu::showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item)
|
||||||
{
|
{
|
||||||
if (!parentWindow->isActive())
|
m_parentWindow = const_cast<QWindow *>(parentWindow);
|
||||||
const_cast<QWindow *>(parentWindow)->requestActivate();
|
m_targetRect = targetRect;
|
||||||
m_targetRect = QRect(parentWindow->mapToGlobal(targetRect.topLeft()), targetRect.size());
|
|
||||||
m_targetItem = static_cast<const QIOSMenuItem *>(item);
|
m_targetItem = static_cast<const QIOSMenuItem *>(item);
|
||||||
|
|
||||||
|
if (m_parentWindow && !m_parentWindow->isActive())
|
||||||
|
m_parentWindow->requestActivate();
|
||||||
|
|
||||||
setVisible(true);
|
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()
|
void QIOSMenu::dismiss()
|
||||||
{
|
{
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
@ -504,7 +523,7 @@ void QIOSMenu::repositionMenu()
|
|||||||
{
|
{
|
||||||
switch (m_effectiveMenuType) {
|
switch (m_effectiveMenuType) {
|
||||||
case EditMenu: {
|
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] setTargetRect:toCGRect(m_targetRect) inView:view];
|
||||||
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
|
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
|
||||||
break; }
|
break; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user