14#include <QtGui/QGuiApplication>
15#include <QtCore/QDebug>
17#include <QtCore/private/qcore_mac_p.h>
18#include <QtGui/private/qguiapplication_p.h>
33 m_nativeMenu = [[NSMenu alloc]
init];
34 qCDebug(lcQpaMenus) <<
"Constructed" <<
this <<
"with" << m_nativeMenu;
39 qCDebug(lcQpaMenus) <<
"Destructing" <<
this <<
"with" << m_nativeMenu;
40 for (
auto menu : std::as_const(m_menus)) {
43 NSMenuItem *
item = nativeItemForMenu(
menu);
45 menu->setAttachedItem(nil);
62bool QCocoaMenuBar::needsImmediateUpdate()
65 if (m_window->
window()->isActive())
78 if (
cw && !
cw->menubar())
94 qCDebug(lcQpaMenus) <<
"Inserting" <<
menu <<
"before" << before <<
"into" <<
this;
97 qCWarning(lcQpaMenus,
"This menu already belongs to the menubar, remove it first");
101 if (beforeMenu && !m_menus.
contains(QPointer<QCocoaMenu>(beforeMenu))) {
102 qCWarning(lcQpaMenus,
"The before menu does not belong to the menubar");
106 int insertionIndex = beforeMenu ? m_menus.
indexOf(beforeMenu) : m_menus.
size();
111 NSMenuItem *
item = [[[NSMenuItem alloc]
init] autorelease];
118 NSMenuItem *beforeItem = nativeItemForMenu(beforeMenu);
119 NSInteger nativeIndex = [m_nativeMenu indexOfItem:beforeItem];
120 [m_nativeMenu insertItem:
item atIndex:nativeIndex];
128 if (needsImmediateUpdate())
136 qCWarning(lcQpaMenus) <<
"Trying to remove" <<
menu <<
"that does not belong to" <<
this;
140 NSMenuItem *
item = nativeItemForMenu(
menu);
142 menu->setAttachedItem(nil);
149 [m_nativeMenu removeItemAtIndex:nativeIndex];
165 BOOL shouldHide = YES;
166 if (cocoaMenu->isVisible()) {
170 for (NSMenuItem *
item in cocoaMenu->nsMenu().itemArray)
171 if (!
item.separatorItem && !
item.hidden) {
177 if (NSMenuItem *menuItem = cocoaMenu->attachedItem()) {
180 NSString *menuTitle = cocoaMenu->nsMenu().title;
206 if ([menuTitle
isEqual:
@"Edit"] || [menuTitle
isEqual:
tr(
"Edit").toNSString()]) {
211 menuItem.title = menuTitle;
214 menuItem.hidden = shouldHide;
218NSMenuItem *QCocoaMenuBar::nativeItemForMenu(
QCocoaMenu *
menu)
const
223 return [m_nativeMenu itemWithTag:
reinterpret_cast<NSInteger>(
menu)];
228 qCDebug(lcQpaMenus) <<
"Reparenting" <<
this <<
"to" << newParentWindow;
233 if (!newParentWindow) {
236 newParentWindow->create();
237 m_window =
static_cast<QCocoaWindow*
>(newParentWindow->handle());
246 return m_window ? m_window->
window() :
nullptr;
252 if (
qApp->focusWindow())
261 if (menubar->m_window.isNull())
281 NSApplication *
app = [NSApplication sharedApplication];
286 if (!appDelegate.inLaunch)
290 if (
cw &&
cw->menubar())
296 qCDebug(lcQpaMenus) <<
"Updating" << mb <<
"immediately for" <<
cw;
298 bool disableForModal = mb->shouldDisable(
cw);
300 for (
auto menu : std::as_const(mb->m_menus)) {
303 NSMenuItem *
item = mb->nativeItemForMenu(
menu);
305 menu->setMenuParent(mb);
307 mb->syncMenu_helper(
menu,
true );
308 menu->propagateEnabledState(!disableForModal);
312 [loader ensureAppMenuInMenu:mb->nsMenu()];
314 NSMutableSet *mergedItems = [[NSMutableSet setWithCapacity:mb->merged().count()] retain];
315 for (
auto mergedItem : mb->merged()) {
316 [mergedItems addObject:mergedItem->nsItem()];
317 mergedItem->syncMerged();
321 for (NSMenuItem *mergeable
in [loader mergeable]) {
322 if (![mergedItems containsObject:mergeable]) {
323 mergeable.hidden = YES;
324 mergeable.enabled = NO;
330 NSMenu *newMainMenu = mb->nsMenu();
331 if (NSApp.mainMenu == newMainMenu) {
339 qCDebug(lcQpaMenus) <<
"Clearing main menu temporarily";
340 NSApp.mainMenu = nil;
342 NSApp.mainMenu = newMainMenu;
345 [loader qtTranslateApplicationMenu];
353 NSApplication *
app = NSApplication.sharedApplication;
357 NSMenu *mainMenu =
app.mainMenu;
358 NSMenuItem *winMenuItem = [[[NSMenuItem alloc] initWithTitle:
@"QtWindowMenu"
359 action:nil keyEquivalent:
@""] autorelease];
361 winMenuItem.hidden = YES;
363 winMenuItem.submenu = [[[NSMenu alloc] initWithTitle:
@"QtWindowMenu"] autorelease];
369 auto *dummyItem = [[NSMenuItem alloc] initWithTitle:
@"" action:nil keyEquivalent:
@""];
370 dummyItem.hidden = YES;
371 [winMenuItem.submenu
addItem:[dummyItem autorelease]];
373 [mainMenu insertItem:winMenuItem atIndex:mainMenu.itemArray.count];
374 app.windowsMenu = winMenuItem.submenu;
383 for (NSWindow *
win in app.windows) {
384 win.excludedFromWindowsMenu = !
win.excludedFromWindowsMenu;
385 win.excludedFromWindowsMenu = !
win.excludedFromWindowsMenu;
391 QList<QCocoaMenuItem*>
r;
392 for (
auto menu : std::as_const(m_menus)) {
401bool QCocoaMenuBar::shouldDisable(
QCocoaWindow *active)
const
406 if (m_window == active) {
415 for (
auto *
window :
std::as_const(topWindows)) {
418 for (
auto *
other :
std::as_const(topWindows)) {
439 for (
auto menu : std::as_const(m_menus))
448 for (
auto menu : std::as_const(m_menus)) {
451 if (
item->effectiveRole() == role)
452 return item->nsItem();
461 return m_window.
data();
466#include "moc_qcocoamenubar.cpp"
static bool isEqual(const aiUVTransform &a, const aiUVTransform &b)
void setMenubar(QCocoaMenuBar *mb)
QCocoaMenuBar * menubar() const
static QGuiApplicationPrivate * instance()
static QWindow * focusWindow()
Returns the QWindow that receives events tied to focus, such as key events.
qsizetype size() const noexcept
iterator insert(qsizetype i, parameter_type t)
bool removeOne(const AT &t)
void append(parameter_type t)
const QObjectList & children() const
Returns a list of child objects.
T * data() const noexcept
bool isNull() const noexcept
Qt::WindowModality modality
the modality of the window
qDeleteAll(list.begin(), list.end())
Combined button and popup list for selecting options.
NSString * qt_mac_AppKitString(NSString *table, NSString *key)
AudioChannelLayoutTag tag
#define qCWarning(category,...)
#define qCDebug(category,...)
static const struct TessellationWindingOrderTab cw[]
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
QApplication app(argc, argv)
[0]
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
bool contains(const AT &t) const noexcept