diff options
Diffstat (limited to 'src/widgets/styles/qmacstyle_mac.mm')
-rw-r--r-- | src/widgets/styles/qmacstyle_mac.mm | 82 |
1 files changed, 25 insertions, 57 deletions
diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index ac23512f1d..db9a5351e1 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -36,7 +36,7 @@ .../doc/src/qstyles.qdoc. */ -#include <Cocoa/Cocoa.h> +#include <AppKit/AppKit.h> #include "qmacstyle_mac_p.h" #include "qmacstyle_mac_p_p.h" @@ -118,14 +118,13 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(NotificationReceiver); - (void)scrollBarStyleDidChange:(NSNotification *)notification { Q_UNUSED(notification); + + // purge destroyed scroll bars: + QMacStylePrivate::scrollBars.removeAll(QPointer<QObject>()); + QEvent event(QEvent::StyleChange); - QMutableVectorIterator<QPointer<QObject> > it(QMacStylePrivate::scrollBars); - while (it.hasNext()) { - if (!it.next()) - it.remove(); - else - QCoreApplication::sendEvent(it.value(), &event); - } + for (const auto &o : QMacStylePrivate::scrollBars) + QCoreApplication::sendEvent(o, &event); } @end @@ -1110,6 +1109,17 @@ static void qt_drawFocusRingOnPath(CGContextRef cg, NSBezierPath *focusRingPath) CGContextRestoreGState(cg); } +QAquaWidgetSize QMacStylePrivate::effectiveAquaSizeConstrain(const QStyleOption *option, + const QWidget *widg, + QStyle::ContentsType ct, + QSize szHint, QSize *insz) const +{ + QAquaWidgetSize sz = aquaSizeConstrain(option, widg, ct, szHint, insz); + if (sz == QAquaSizeUnknown) + return QAquaSizeLarge; + return sz; +} + QAquaWidgetSize QMacStylePrivate::aquaSizeConstrain(const QStyleOption *option, const QWidget *widg, QStyle::ContentsType ct, QSize szHint, QSize *insz) const { @@ -2475,32 +2485,9 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW ret = 0; break; case PM_TitleBarHeight: - if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) { - HIThemeWindowDrawInfo wdi; - wdi.version = qt_mac_hitheme_version; - wdi.state = kThemeStateActive; - wdi.windowType = QtWinType; - if (tb->titleBarState) - wdi.attributes = kThemeWindowHasFullZoom | kThemeWindowHasCloseBox - | kThemeWindowHasCollapseBox; - else if (tb->titleBarFlags & Qt::WindowSystemMenuHint) - wdi.attributes = kThemeWindowHasCloseBox; - else - wdi.attributes = 0; - wdi.titleHeight = tb->rect.height(); - wdi.titleWidth = tb->rect.width(); - QCFType<HIShapeRef> region; - HIRect hirect = qt_hirectForQRect(tb->rect); - if (hirect.size.width <= 0) - hirect.size.width = 100; - if (hirect.size.height <= 0) - hirect.size.height = 30; - - HIThemeGetWindowShape(&hirect, &wdi, kWindowTitleBarRgn, ®ion); - HIRect rect; - ptrHIShapeGetBounds(region, &rect); - ret = int(rect.size.height); - } + // Always use NSTitledWindowMask since we never need any other type of window here + ret = int([NSWindow frameRectForContentRect:NSZeroRect + styleMask:NSTitledWindowMask].size.height); break; case PM_TabBarTabVSpace: ret = 4; @@ -2530,29 +2517,10 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW } break; case PM_ScrollBarExtent: { - if ([NSScroller preferredScrollerStyle] == NSScrollerStyleOverlay) { - switch (d->aquaSizeConstrain(opt, widget)) { - case QAquaSizeUnknown: - case QAquaSizeLarge: - ret = QSysInfo::macVersion() >= QSysInfo::MV_10_8 ? 16 : 9; - break; - case QAquaSizeMini: - case QAquaSizeSmall: - ret = QSysInfo::macVersion() >= QSysInfo::MV_10_8 ? 14 : 7; - break; - } - break; - } - switch (d->aquaSizeConstrain(opt, widget)) { - case QAquaSizeUnknown: - case QAquaSizeLarge: - GetThemeMetric(kThemeMetricScrollBarWidth, &ret); - break; - case QAquaSizeMini: - case QAquaSizeSmall: - GetThemeMetric(kThemeMetricSmallScrollBarWidth, &ret); - break; - } + const QAquaWidgetSize size = d->effectiveAquaSizeConstrain(opt, widget); + ret = static_cast<SInt32>([NSScroller + scrollerWidthForControlSize:static_cast<NSControlSize>(size) + scrollerStyle:[NSScroller preferredScrollerStyle]]); break; } case PM_IndicatorHeight: { switch (d->aquaSizeConstrain(opt, widget)) { |