diff options
Diffstat (limited to 'src/gui/widgets/qmainwindowlayout_mac.mm')
-rw-r--r-- | src/gui/widgets/qmainwindowlayout_mac.mm | 607 |
1 files changed, 607 insertions, 0 deletions
diff --git a/src/gui/widgets/qmainwindowlayout_mac.mm b/src/gui/widgets/qmainwindowlayout_mac.mm new file mode 100644 index 0000000000..761a4337e1 --- /dev/null +++ b/src/gui/widgets/qmainwindowlayout_mac.mm @@ -0,0 +1,607 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <private/qmainwindowlayout_p.h> +#include <qtoolbar.h> +#include <private/qtoolbarlayout_p.h> +#include <private/qt_cocoa_helpers_mac_p.h> +#include <private/qtoolbar_p.h> + +#ifndef QT_MAC_USE_COCOA +#include <Carbon/Carbon.h> +#else +#include <private/qcocoatoolbardelegate_mac_p.h> +#import <private/qcocoawindowdelegate_mac_p.h> +#endif + +QT_BEGIN_NAMESPACE +#ifdef QT_NAMESPACE + +// namespace up the stuff +#define SS(x) #x +#define S0(x) SS(x) +#define S "com.trolltech.qt-" S0(QT_NAMESPACE) ".qmainwindow.qtoolbarInHIToolbar" +#define SToolbar "com.trolltech.qt-" S0(QT_NAMESPACE) ".hitoolbar-qtoolbar" +#define SNSToolbar "com.trolltech.qt-" S0(QT_NAMESPACE) ".qtoolbarInNSToolbar" +#define MacToolbar "com.trolltech.qt-" S0(QT_NAMESPACE) ".qmainwindow.mactoolbar" + +#ifndef QT_MAC_USE_COCOA +static CFStringRef kQToolBarHIToolbarItemClassID = CFSTR(S); +static CFStringRef kQToolBarHIToolbarIdentifier = CFSTR(SToolbar); +#else +static NSString *kQToolBarNSToolbarIdentifier = @SNSToolbar; +#endif +static CFStringRef kQMainWindowMacToolbarID = CFSTR(MacToolbar); +#undef SS +#undef S0 +#undef S +#undef SToolbar +#undef SNSToolbar +#undef MacToolbar + +#else +#ifndef QT_MAC_USE_COCOA +static CFStringRef kQToolBarHIToolbarItemClassID = CFSTR("com.trolltech.qt.qmainwindow.qtoolbarInHIToolbar"); +static CFStringRef kQToolBarHIToolbarIdentifier = CFSTR("com.trolltech.qt.hitoolbar-qtoolbar"); +#else +static NSString *kQToolBarNSToolbarIdentifier = @"com.trolltech.qt.qmainwindow.qtoolbarInNSToolbar"; +#endif +static CFStringRef kQMainWindowMacToolbarID = CFSTR("com.trolltech.qt.qmainwindow.mactoolbar"); +#endif // QT_NAMESPACE + +#ifndef QT_MAC_USE_COCOA + +static const int kEventParamQToolBar = 'QTBR'; +static const int kEventParamQMainWindowLayout = 'QMWL'; + +const EventTypeSpec qtoolbarEvents[] = +{ + { kEventClassHIObject, kEventHIObjectConstruct }, + { kEventClassHIObject, kEventHIObjectDestruct }, + { kEventClassHIObject, kEventHIObjectInitialize }, + { kEventClassToolbarItem, kEventToolbarItemCreateCustomView } +}; + +struct QToolBarInHIToolbarInfo +{ + QToolBarInHIToolbarInfo(HIToolbarItemRef item) + : toolbarItem(item), mainWindowLayout(0) + {} + HIToolbarItemRef toolbarItem; + QMainWindowLayout *mainWindowLayout; +}; + +OSStatus QMainWindowLayout::qtoolbarInHIToolbarHandler(EventHandlerCallRef inCallRef, + EventRef event, void *data) +{ + OSStatus result = eventNotHandledErr; + QToolBarInHIToolbarInfo *object = static_cast<QToolBarInHIToolbarInfo *>(data); + + switch (GetEventClass(event)) { + case kEventClassHIObject: + switch (GetEventKind(event)) { + case kEventHIObjectConstruct: + { + HIObjectRef toolbarItem; + GetEventParameter(event, kEventParamHIObjectInstance, typeHIObjectRef, + 0, sizeof( HIObjectRef ), 0, &toolbarItem); + + QToolBarInHIToolbarInfo *item = new QToolBarInHIToolbarInfo(toolbarItem); + SetEventParameter(event, kEventParamHIObjectInstance, typeVoidPtr, + sizeof(void *), &item); + result = noErr; + } + break; + case kEventHIObjectInitialize: + result = CallNextEventHandler(inCallRef, event); + if (result == noErr) { + QToolBar *toolbar = 0; + QMainWindowLayout *layout = 0; + GetEventParameter(event, kEventParamQToolBar, typeVoidPtr, + 0, sizeof(void *), 0, &toolbar); + GetEventParameter(event, kEventParamQMainWindowLayout, typeVoidPtr, + 0, sizeof(void *), 0, &layout); + object->mainWindowLayout = layout; + object->mainWindowLayout->unifiedToolbarHash.insert(object->toolbarItem, toolbar); + HIToolbarItemChangeAttributes(object->toolbarItem, + kHIToolbarItemLabelDisabled, 0); + } + break; + + case kEventHIObjectDestruct: + delete object; + result = noErr; + break; + } + break; + + case kEventClassToolbarItem: + switch (GetEventKind(event)) + { + case kEventToolbarItemCreateCustomView: + { + QToolBar *toolbar + = object->mainWindowLayout->unifiedToolbarHash.value(object->toolbarItem); + if (toolbar) { + HIViewRef hiview = HIViewRef(toolbar->winId()); + SetEventParameter(event, kEventParamControlRef, typeControlRef, + sizeof(HIViewRef), &hiview); + result = noErr; + } + } + break; + } + break; + } + return result; +} + +void QMainWindowLayout::qtMacHIToolbarRegisterQToolBarInHIToolborItemClass() +{ + static bool registered = false; + + if (!registered) { + HIObjectRegisterSubclass( kQToolBarHIToolbarItemClassID, + kHIToolbarItemClassID, 0, QMainWindowLayout::qtoolbarInHIToolbarHandler, + GetEventTypeCount(qtoolbarEvents), qtoolbarEvents, 0, 0 ); + registered = true; + } +} + +static void GetToolbarAllowedItems(CFMutableArrayRef array) +{ + CFArrayAppendValue(array, kQToolBarHIToolbarIdentifier); +} + +HIToolbarItemRef QMainWindowLayout::createQToolBarInHIToolbarItem(QToolBar *toolbar, + QMainWindowLayout *layout) +{ + QMainWindowLayout::qtMacHIToolbarRegisterQToolBarInHIToolborItemClass(); + + EventRef event; + HIToolbarItemRef result = 0; + + CFStringRef identifier = kQToolBarHIToolbarIdentifier; + UInt32 options = kHIToolbarItemAllowDuplicates; + + CreateEvent(0, kEventClassHIObject, kEventHIObjectInitialize, + GetCurrentEventTime(), 0, &event); + SetEventParameter(event, kEventParamToolbarItemIdentifier, typeCFStringRef, + sizeof(CFStringRef), &identifier); + SetEventParameter(event, kEventParamAttributes, typeUInt32, sizeof(UInt32), &options); + SetEventParameter(event, kEventParamQToolBar, typeVoidPtr, sizeof(void *), &toolbar); + SetEventParameter(event, kEventParamQMainWindowLayout, typeVoidPtr, sizeof(void *), &layout); + + HIObjectCreate(kQToolBarHIToolbarItemClassID, event, + static_cast<HIObjectRef *>(&result)); + + ReleaseEvent(event); + return result; + +} + +HIToolbarItemRef QMainWindowLayout::CreateToolbarItemForIdentifier(CFStringRef identifier, + CFTypeRef data) +{ + HIToolbarItemRef item = 0; + if (CFStringCompare(kQToolBarHIToolbarIdentifier, identifier, + kCFCompareBackwards) == kCFCompareEqualTo) { + if (data && CFGetTypeID(data) == CFArrayGetTypeID()) { + CFArrayRef array = static_cast<CFArrayRef>(data); + QToolBar *toolbar = static_cast<QToolBar *>(const_cast<void *>(CFArrayGetValueAtIndex(array, 0))); + QMainWindowLayout *layout = static_cast<QMainWindowLayout *>(const_cast<void *>(CFArrayGetValueAtIndex(array, 1))); + item = createQToolBarInHIToolbarItem(toolbar, layout); + } + } + return item; +} + +static const EventTypeSpec kToolbarEvents[] = { +{ kEventClassToolbar, kEventToolbarGetDefaultIdentifiers }, +{ kEventClassToolbar, kEventToolbarGetAllowedIdentifiers }, +{ kEventClassToolbar, kEventToolbarCreateItemWithIdentifier }, +{ kEventClassToolbar, kEventToolbarItemAdded }, +{ kEventClassToolbar, kEventToolbarItemRemoved } +}; + +OSStatus QMainWindowLayout::qtmacToolbarDelegate(EventHandlerCallRef, EventRef event, void *data) +{ + QMainWindowLayout *mainWindowLayout = static_cast<QMainWindowLayout *>(data); + OSStatus result = eventNotHandledErr; + CFMutableArrayRef array; + CFStringRef identifier; + switch (GetEventKind(event)) { + case kEventToolbarGetDefaultIdentifiers: + case kEventToolbarGetAllowedIdentifiers: + GetEventParameter(event, kEventParamMutableArray, typeCFMutableArrayRef, 0, + sizeof(CFMutableArrayRef), 0, &array); + GetToolbarAllowedItems(array); + result = noErr; + break; + case kEventToolbarCreateItemWithIdentifier: { + HIToolbarItemRef item; + CFTypeRef data = 0; + OSStatus err = GetEventParameter(event, kEventParamToolbarItemIdentifier, typeCFStringRef, + 0, sizeof(CFStringRef), 0, &identifier); + err = GetEventParameter(event, kEventParamToolbarItemConfigData, typeCFTypeRef, + 0, sizeof(CFTypeRef), 0, &data); + item = CreateToolbarItemForIdentifier(identifier, data); + if (item) { + result = SetEventParameter(event, kEventParamToolbarItem, typeHIToolbarItemRef, + sizeof(HIToolbarItemRef), &item ); + } + break; + } + case kEventToolbarItemAdded: { + // Double check that our "view" of the toolbar is similar. + HIToolbarItemRef item; + CFIndex index; + if (GetEventParameter(event, kEventParamToolbarItem, typeHIToolbarItemRef, + 0, sizeof(HIToolbarItemRef), 0, &item) == noErr + && GetEventParameter(event, kEventParamIndex, typeCFIndex, 0, + sizeof(CFIndex), 0, &index) == noErr) { + CFRetain(item); // We will watch this until it's removed from the list (or bust). + mainWindowLayout->toolbarItemsCopy.insert(index, item); + QToolBar *toolbar = mainWindowLayout->unifiedToolbarHash.value(item); + if (toolbar) { + int toolbarIndex = mainWindowLayout->qtoolbarsInUnifiedToolbarList.indexOf(toolbar); + if (index != toolbarIndex) { + // Dang, we must be out of sync, rebuild it from the "toolbarItemsCopy" + mainWindowLayout->qtoolbarsInUnifiedToolbarList.clear(); + for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) { + // This will either append the correct toolbar or an + // null toolbar. This is fine because this list + // is really only kept to make sure that things are but in the right order. + mainWindowLayout->qtoolbarsInUnifiedToolbarList.append( + mainWindowLayout->unifiedToolbarHash.value(mainWindowLayout-> + toolbarItemsCopy.at(i))); + } + } + } + } + break; + } + case kEventToolbarItemRemoved: { + HIToolbarItemRef item; + if (GetEventParameter(event, kEventParamToolbarItem, typeHIToolbarItemRef, + 0, sizeof(HIToolbarItemRef), 0, &item) == noErr) { + mainWindowLayout->unifiedToolbarHash.remove(item); + for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) { + if (mainWindowLayout->toolbarItemsCopy.at(i) == item) { + // I know about it, so release it. + mainWindowLayout->toolbarItemsCopy.removeAt(i); + mainWindowLayout->qtoolbarsInUnifiedToolbarList.removeAt(i); + CFRelease(item); + break; + } + } + } + break; + } + } + return result; +} +#endif // ! QT_MAC_USE_COCOA + +#ifndef kWindowUnifiedTitleAndToolbarAttribute +#define kWindowUnifiedTitleAndToolbarAttribute (1 << 7) +#endif + +void QMainWindowLayout::updateHIToolBarStatus() +{ + bool useMacToolbar = layoutState.mainWindow->unifiedTitleAndToolBarOnMac(); +#ifndef QT_MAC_USE_COCOA + if (useMacToolbar) { + ChangeWindowAttributes(qt_mac_window_for(layoutState.mainWindow), + kWindowUnifiedTitleAndToolbarAttribute, 0); + } else { + ChangeWindowAttributes(qt_mac_window_for(layoutState.mainWindow), + 0, kWindowUnifiedTitleAndToolbarAttribute); + } +#endif + + layoutState.mainWindow->setUpdatesEnabled(false); // reduces a little bit of flicker, not all though +#if defined(QT_MAC_USE_COCOA) + QMacCocoaAutoReleasePool pool; + NSView *cView = [qt_mac_window_for(layoutState.mainWindow) contentView]; + if (useMacToolbar) { + [cView setPostsFrameChangedNotifications:YES]; + [[NSNotificationCenter defaultCenter] addObserver: [QT_MANGLE_NAMESPACE(QCocoaWindowDelegate) sharedDelegate] + selector: @selector(syncContentViewFrame:) + name: NSViewFrameDidChangeNotification + object: cView]; + } +#endif + if (!useMacToolbar) { + macWindowToolbarShow(layoutState.mainWindow, false); + // Move everything out of the HIToolbar into the main toolbar. + while (!qtoolbarsInUnifiedToolbarList.isEmpty()) { + // Should shrink the list by one every time. + QToolBar *toolbar = qtoolbarsInUnifiedToolbarList.first(); +#if defined(QT_MAC_USE_COCOA) + unifiedSurface->removeToolbar(toolbar); +#endif + layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar); + } + macWindowToolbarSet(qt_mac_window_for(layoutState.mainWindow), 0); + } else { + QList<QToolBar *> toolbars = layoutState.mainWindow->findChildren<QToolBar *>(); + for (int i = 0; i < toolbars.size(); ++i) { + QToolBar *toolbar = toolbars.at(i); + if (toolBarArea(toolbar) == Qt::TopToolBarArea) { + // Do this here, because we are in an in-between state. + removeWidget(toolbar); + layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar); + } + } + syncUnifiedToolbarVisibility(); + } +#if defined(QT_MAC_USE_COCOA) + if (!useMacToolbar) { + [cView setPostsFrameChangedNotifications:NO]; + [[NSNotificationCenter defaultCenter] removeObserver: [QT_MANGLE_NAMESPACE(QCocoaWindowDelegate) sharedDelegate] + name: NSViewFrameDidChangeNotification + object: cView]; + } +#endif + layoutState.mainWindow->setUpdatesEnabled(true); +} + +void QMainWindowLayout::insertIntoMacToolbar(QToolBar *before, QToolBar *toolbar) +{ + // This layering could go on to one more level, but I decided to stop here. + // The HIToolbar and NSToolbar APIs are fairly similar as you will see. + if (toolbar == 0) + return; + +#if defined(QT_MAC_USE_COCOA) + // toolbar will now become native (if not already) since we need + // an nsview for it inside the corresponding NSToolbarItem. + // Setting isInUnifiedToolbar will (among other things) stop alien + // siblings from becoming native when this happends since the toolbar + // will not overlap with other children of the QMainWindow. NB: Switching + // unified toolbar off after this stage is not supported, as this means + // that either the menubar must be alien again, or the sibling must + // be backed by an nsview to protect from overlapping issues: + toolbar->d_func()->isInUnifiedToolbar = true; +#endif + + QToolBarLayout *toolbarLayout = static_cast<QToolBarLayout *>(toolbar->layout()); + toolbarSaveState.insert(toolbar, ToolBarSaveState(toolbar->isMovable(), toolbar->maximumSize())); + + if (toolbarLayout->hasExpandFlag() == false) + toolbar->setMaximumSize(toolbar->sizeHint()); + + toolbar->setMovable(false); + toolbarLayout->setUsePopupMenu(true); + // Make the toolbar a child of the mainwindow to avoid creating a window. + toolbar->setParent(layoutState.mainWindow); + + toolbar->winId(); // Now create the OSViewRef. + layoutState.mainWindow->createWinId(); + + OSWindowRef window = qt_mac_window_for(layoutState.mainWindow); + int beforeIndex = qtoolbarsInUnifiedToolbarList.indexOf(before); + if (beforeIndex == -1) + beforeIndex = qtoolbarsInUnifiedToolbarList.size(); + + int toolbarIndex = qtoolbarsInUnifiedToolbarList.indexOf(toolbar); + +#ifndef QT_MAC_USE_COCOA + HIToolbarRef macToolbar = NULL; + if ((GetWindowToolbar(window, &macToolbar) == noErr) && !macToolbar) { + HIToolbarCreate(kQMainWindowMacToolbarID, + kHIToolbarItemAllowDuplicates, &macToolbar); + InstallEventHandler(HIObjectGetEventTarget(static_cast<HIToolbarRef>(macToolbar)), + QMainWindowLayout::qtmacToolbarDelegate, GetEventTypeCount(kToolbarEvents), + kToolbarEvents, this, 0); + HIToolbarSetDisplaySize(macToolbar, kHIToolbarDisplaySizeNormal); + HIToolbarSetDisplayMode(macToolbar, kHIToolbarDisplayModeIconOnly); + macWindowToolbarSet(window, macToolbar); + if (layoutState.mainWindow->isVisible()) + macWindowToolbarShow(layoutState.mainWindow, true); + CFRelease(macToolbar); + } +#else + QMacCocoaAutoReleasePool pool; + NSToolbar *macToolbar = [window toolbar]; + if (macToolbar == nil) { + macToolbar = [[NSToolbar alloc] initWithIdentifier:(NSString *)kQMainWindowMacToolbarID]; + [macToolbar setDisplayMode:NSToolbarDisplayModeIconOnly]; + [macToolbar setSizeMode:NSToolbarSizeModeRegular]; + [macToolbar setDelegate:[[QT_MANGLE_NAMESPACE(QCocoaToolBarDelegate) alloc] initWithMainWindowLayout:this]]; + [window setToolbar:macToolbar]; + [macToolbar release]; + } +#endif + if (toolbarIndex != -1) { + qtoolbarsInUnifiedToolbarList.removeAt(toolbarIndex); +#ifndef QT_MAC_USE_COCOA + HIToolbarRemoveItemAtIndex(macToolbar, toolbarIndex); +#else + [macToolbar removeItemAtIndex:toolbarIndex]; +#endif + } + qtoolbarsInUnifiedToolbarList.insert(beforeIndex, toolbar); + + // Adding to the unified toolbar surface for the raster engine. + if (layoutState.mainWindow->windowSurface()) { + QPoint offset(0, 0); + for (int i = 0; i < beforeIndex; ++i) { + offset.setX(offset.x() + qtoolbarsInUnifiedToolbarList.at(i)->size().width()); + } +#ifdef QT_MAC_USE_COCOA + unifiedSurface->insertToolbar(toolbar, offset); +#endif // QT_MAC_USE_COCOA + } + +#ifndef QT_MAC_USE_COCOA + QCFType<HIToolbarItemRef> outItem; + const QObject *stupidArray[] = { toolbar, this }; + QCFType<CFArrayRef> array = CFArrayCreate(0, reinterpret_cast<const void **>(&stupidArray), + 2, 0); + HIToolbarCreateItemWithIdentifier(macToolbar, kQToolBarHIToolbarIdentifier, + array, &outItem); + HIToolbarInsertItemAtIndex(macToolbar, outItem, beforeIndex); +#else + NSString *toolbarID = kQToolBarNSToolbarIdentifier; + toolbarID = [toolbarID stringByAppendingFormat:@"%p", toolbar]; + cocoaItemIDToToolbarHash.insert(qt_mac_NSStringToQString(toolbarID), toolbar); + [macToolbar insertItemWithItemIdentifier:toolbarID atIndex:beforeIndex]; +#endif +} + +#ifdef QT_MAC_USE_COCOA +void QMainWindowLayout::updateUnifiedToolbarOffset() +{ + QPoint offset(0, 0); + + for (int i = 1; i < qtoolbarsInUnifiedToolbarList.length(); ++i) { + offset.setX(offset.x() + qtoolbarsInUnifiedToolbarList.at(i - 1)->size().width()); + qtoolbarsInUnifiedToolbarList.at(i)->d_func()->toolbar_offset = offset; + } +} +#endif // QT_MAC_USE_COCOA + + +void QMainWindowLayout::removeFromMacToolbar(QToolBar *toolbar) +{ + QHash<void *, QToolBar *>::iterator it = unifiedToolbarHash.begin(); + while (it != unifiedToolbarHash.end()) { + if (it.value() == toolbar) { + // Rescue our HIView and set it on the mainWindow again. + bool saveVisible = !toolbar->isHidden(); + toolbar->setParent(0); + toolbar->setParent(parentWidget()); + toolbar->setVisible(saveVisible); + ToolBarSaveState saveState = toolbarSaveState.value(toolbar); + static_cast<QToolBarLayout *>(toolbar->layout())->setUsePopupMenu(false); + toolbar->setMovable(saveState.movable); + toolbar->setMaximumSize(saveState.maximumSize); + toolbarSaveState.remove(toolbar); +#ifndef QT_MAC_USE_COCOA + HIToolbarItemRef item = static_cast<HIToolbarItemRef>(it.key()); + HIToolbarRemoveItemAtIndex(HIToolbarItemGetToolbar(item), + toolbarItemsCopy.indexOf(item)); +#else + NSToolbarItem *item = static_cast<NSToolbarItem *>(it.key()); + [[qt_mac_window_for(layoutState.mainWindow->window()) toolbar] + removeItemAtIndex:toolbarItemsCopy.indexOf(item)]; + unifiedToolbarHash.remove(item); + qtoolbarsInUnifiedToolbarList.removeAll(toolbar); +#endif + break; + } + ++it; + } +} + +void QMainWindowLayout::cleanUpMacToolbarItems() +{ +#ifdef QT_MAC_USE_COCOA + QMacCocoaAutoReleasePool pool; +#endif + for (int i = 0; i < toolbarItemsCopy.size(); ++i) { +#ifdef QT_MAC_USE_COCOA + NSToolbarItem *item = static_cast<NSToolbarItem *>(toolbarItemsCopy.at(i)); + [item setView:0]; +#endif + CFRelease(toolbarItemsCopy.at(i)); + } + toolbarItemsCopy.clear(); + unifiedToolbarHash.clear(); + +#ifdef QT_MAC_USE_COCOA + OSWindowRef window = qt_mac_window_for(layoutState.mainWindow); + NSToolbar *macToolbar = [window toolbar]; + if (macToolbar) { + [[macToolbar delegate] release]; + [macToolbar setDelegate:nil]; + } +#endif +} + +void QMainWindowLayout::fixSizeInUnifiedToolbar(QToolBar *tb) const +{ +#ifdef QT_MAC_USE_COCOA + QHash<void *, QToolBar *>::const_iterator it = unifiedToolbarHash.constBegin(); + NSToolbarItem *item = nil; + while (it != unifiedToolbarHash.constEnd()) { + if (tb == it.value()) { + item = static_cast<NSToolbarItem *>(it.key()); + break; + } + ++it; + } + if (item) { + QMacCocoaAutoReleasePool pool; + QWidgetItem layoutItem(tb); + QSize size = layoutItem.maximumSize(); + NSSize nssize = NSMakeSize(size.width(), size.height()); + [item setMaxSize:nssize]; + size = layoutItem.minimumSize(); + nssize.width = size.width(); + nssize.height = size.height(); + [item setMinSize:nssize]; + } +#else + Q_UNUSED(tb); +#endif +} + +void QMainWindowLayout::syncUnifiedToolbarVisibility() +{ + if (blockVisiblityCheck) + return; + + Q_ASSERT(layoutState.mainWindow->unifiedTitleAndToolBarOnMac()); + bool show = false; + const int ToolBarCount = qtoolbarsInUnifiedToolbarList.count(); + for (int i = 0; i < ToolBarCount; ++i) { + if (qtoolbarsInUnifiedToolbarList.at(i)->isVisible()) { + show = true; + break; + } + } + macWindowToolbarShow(layoutState.mainWindow, show); +} + +QT_END_NAMESPACE |