diff options
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoamenubar.h | 2 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoamenubar.mm | 47 |
2 files changed, 49 insertions, 0 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.h b/src/plugins/platforms/cocoa/qcocoamenubar.h index 7186e48829..0054cdf6ad 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.h +++ b/src/plugins/platforms/cocoa/qcocoamenubar.h @@ -80,12 +80,14 @@ private: bool needsImmediateUpdate(); bool shouldDisable(QCocoaWindow *active) const; + void insertDefaultEditItems(QCocoaMenu *menu); NSMenuItem *nativeItemForMenu(QCocoaMenu *menu) const; QList<QPointer<QCocoaMenu> > m_menus; NSMenu *m_nativeMenu; QPointer<QCocoaWindow> m_window; + QList<QPointer<QCocoaMenuItem>> m_defaultEditMenuItems; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index 2e0eeb06e3..524746f952 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -194,6 +194,11 @@ void QCocoaMenuBar::syncMenu_helper(QPlatformMenu *menu, bool menubarUpdate) for (QCocoaMenuItem *item : cocoaMenu->items()) cocoaMenu->syncMenuItem_helper(item, menubarUpdate); + const QString captionNoAmpersand = QString::fromNSString(cocoaMenu->nsMenu().title) + .remove(QLatin1Char('&')); + if (captionNoAmpersand == QCoreApplication::translate("QCocoaMenu", "Edit")) + insertDefaultEditItems(cocoaMenu); + BOOL shouldHide = YES; if (cocoaMenu->isVisible()) { // If the NSMenu has no visible items, or only separators, we should hide it @@ -400,6 +405,48 @@ QCocoaWindow *QCocoaMenuBar::cocoaWindow() const return m_window.data(); } +void QCocoaMenuBar::insertDefaultEditItems(QCocoaMenu *menu) +{ + if (menu->items().isEmpty()) + return; + + NSMenu *nsEditMenu = menu->nsMenu(); + if ([nsEditMenu itemAtIndex:nsEditMenu.numberOfItems - 1].action + == @selector(orderFrontCharacterPalette:)) { + for (auto defaultEditMenuItem : qAsConst(m_defaultEditMenuItems)) { + if (menu->items().contains(defaultEditMenuItem)) + menu->removeMenuItem(defaultEditMenuItem); + } + qDeleteAll(m_defaultEditMenuItems); + m_defaultEditMenuItems.clear(); + } else { + if (m_defaultEditMenuItems.isEmpty()) { + QCocoaMenuItem *separator = new QCocoaMenuItem; + separator->setIsSeparator(true); + + QCocoaMenuItem *dictationItem = new QCocoaMenuItem; + dictationItem->setText(QCoreApplication::translate("QCocoaMenuItem", "Start Dictation...")); + QObject::connect(dictationItem, &QPlatformMenuItem::activated, this, []{ + [NSApplication.sharedApplication performSelector:@selector(startDictation:)]; + }); + + QCocoaMenuItem *emojiItem = new QCocoaMenuItem; + emojiItem->setText(QCoreApplication::translate("QCocoaMenuItem", "Emoji && Symbols")); + emojiItem->setShortcut(QKeyCombination(Qt::MetaModifier|Qt::ControlModifier, Qt::Key_Space)); + QObject::connect(emojiItem, &QPlatformMenuItem::activated, this, []{ + [NSApplication.sharedApplication orderFrontCharacterPalette:nil]; + }); + + m_defaultEditMenuItems << separator << dictationItem << emojiItem; + } + for (auto defaultEditMenuItem : qAsConst(m_defaultEditMenuItems)) { + if (menu->items().contains(defaultEditMenuItem)) + menu->removeMenuItem(defaultEditMenuItem); + menu->insertMenuItem(defaultEditMenuItem, nullptr); + } + } +} + QT_END_NAMESPACE #include "moc_qcocoamenubar.cpp" |