diff options
author | Morten Johan Sørvig <morten.sorvig@digia.com> | 2014-02-13 14:14:44 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-20 22:12:47 +0100 |
commit | 3b8b47db6aaeb333f106cff57cc712b01d828302 (patch) | |
tree | ddc23c12694293279f0fb5aba33f23d5b280e13d /src/plugins/platforms/cocoa | |
parent | 2bc7a40048ada41c59ddac0988bb2e04c227a18d (diff) |
Set unified toolbar height accurately.
Add registerContentBorderArea() to the Cocoa native
interface which allows registering multiple "unified
toolbar" areas for each window.
Use this function in QToolBarLayout::setGeometry()
to register the area for each TopToolBarArea toolbar.
Task-number: QTBUG-36700
Change-Id: I52efcc5662556bb94f25f504be3710d0491f79b9
Reviewed-by: Jake Petroules <jake.petroules@petroules.com>
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Reviewed-by: Denis Dzyubenko <denis@ddenis.info>
Diffstat (limited to 'src/plugins/platforms/cocoa')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoanativeinterface.h | 9 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoanativeinterface.mm | 23 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoawindow.h | 12 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoawindow.mm | 37 |
4 files changed, 77 insertions, 4 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h index bf7e85619a..efdd433d8f 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h @@ -136,10 +136,19 @@ private: // Request a unified title and toolbar look for the window. static void setContentBorderThickness(QWindow *window, int topThickness, int bottomThickness); + // Request a unified title and toolbar look for the window by registering + // an area. Multiple callers can register areas and the platform plugin + // will extend the "unified" area to cover them. + static void registerContentBorderArea(QWindow *window, quintptr identifer, int upper, int lower); + + // Enable the unified title and toolbar area. + static void enableContentBorderArea(QWindow *window, bool enable); + // Sets a NSToolbar instance for the given QWindow. The // toolbar will be attached to the native NSWindow when // that is created; static void setNSToolbar(QWindow *window, void *nsToolbar); + }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm index 5e57200ebc..d6a5be8d52 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm @@ -125,6 +125,10 @@ QPlatformNativeInterface::NativeResourceForIntegrationFunction QCocoaNativeInter return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setEmbeddedInForeignView); if (resource.toLower() == "setcontentborderthickness") return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setContentBorderThickness); + if (resource.toLower() == "registercontentborderarea") + return NativeResourceForIntegrationFunction(QCocoaNativeInterface::registerContentBorderArea); + if (resource.toLower() == "enablecontentborderarea") + return NativeResourceForIntegrationFunction(QCocoaNativeInterface::enableContentBorderArea); if (resource.toLower() == "setnstoolbar") return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setNSToolbar); @@ -287,11 +291,28 @@ void QCocoaNativeInterface::setContentBorderThickness(QWindow *window, int topTh cocoaWindow->setContentBorderThickness(topThickness, bottomThickness); } -void QCocoaNativeInterface::setNSToolbar(QWindow *window, void *nsToolbar) +void QCocoaNativeInterface::registerContentBorderArea(QWindow *window, quintptr identifier, int upper, int lower) { if (!window) return; + QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle()); + if (cocoaWindow) + cocoaWindow->registerContentBorderArea(identifier, upper, lower); +} + +void QCocoaNativeInterface::enableContentBorderArea(QWindow *window, bool enable) +{ + if (!window) + return; + + QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle()); + if (cocoaWindow) + cocoaWindow->enableContentBorderArea(enable); +} + +void QCocoaNativeInterface::setNSToolbar(QWindow *window, void *nsToolbar) +{ QCocoaIntegration::instance()->setToolbar(window, static_cast<NSToolbar *>(nsToolbar)); QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle()); diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index fe82edd618..96df3f4c59 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -208,6 +208,8 @@ public: void registerTouch(bool enable); void setContentBorderThickness(int topThickness, int bottomThickness); + void registerContentBorderArea(quintptr identifier, int upper, int lower); + void enableContentBorderArea(bool enable); void applyContentBorderThickness(NSWindow *window); void updateNSToolbar(); @@ -282,6 +284,16 @@ public: // for QNSView QRect m_normalGeometry; Qt::WindowFlags m_oldWindowFlags; NSApplicationPresentationOptions m_presentationOptions; + + struct BorderRange { + BorderRange(int u, int l) : upper(u), lower(l) { } + int upper; + int lower; + bool operator<(BorderRange const& right) const { + return upper < right.upper; + } + }; + QHash<quintptr, BorderRange> m_contentBorderAreas; // identifer -> uppper/lower }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index d8ec144ad2..bbd5dd7311 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -1540,15 +1540,46 @@ void QCocoaWindow::setContentBorderThickness(int topThickness, int bottomThickne applyContentBorderThickness(m_nsWindow); } +void QCocoaWindow::registerContentBorderArea(quintptr identifier, int upper, int lower) +{ + m_contentBorderAreas.insert(identifier, BorderRange(upper, lower)); + + // Find consecutive registered border areas, starting from the top. + QList<BorderRange> ranges = m_contentBorderAreas.values(); + std::sort(ranges.begin(), ranges.end()); + m_topContentBorderThickness = 0; + foreach (BorderRange range, ranges) { + // Is this sub-range adjacent to or overlaping the + // existing total border area range? If so merge + // it into the total range, + if (range.upper <= (m_topContentBorderThickness + 1)) + m_topContentBorderThickness = qMax(m_topContentBorderThickness, range.lower); + else + break; + } + + m_bottomContentBorderThickness = 0; // (not supported) + if (m_drawContentBorderGradient) + applyContentBorderThickness(m_nsWindow); +} + +void QCocoaWindow::enableContentBorderArea(bool enable) +{ + m_drawContentBorderGradient = enable; + applyContentBorderThickness(m_nsWindow); +} + void QCocoaWindow::applyContentBorderThickness(NSWindow *window) { if (!window) return; - if (m_drawContentBorderGradient) - [window setStyleMask:[window styleMask] | NSTexturedBackgroundWindowMask]; - else + if (!m_drawContentBorderGradient) { [window setStyleMask:[window styleMask] & ~NSTexturedBackgroundWindowMask]; + return; + } + + [window setStyleMask:[window styleMask] | NSTexturedBackgroundWindowMask]; if (m_topContentBorderThickness > 0) { [window setContentBorderThickness:m_topContentBorderThickness forEdge:NSMaxYEdge]; |