From fe5a15fc4248a9258d74eea6f64769a3cb173788 Mon Sep 17 00:00:00 2001 From: Fabien Freling Date: Thu, 4 Nov 2010 14:03:46 +0100 Subject: Update the offsets of the QToolBars inside the unified toolbar on Mac OS X. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTBUG-12818 Reviewed-by: Samuel Rødal --- src/gui/painting/qunifiedtoolbarsurface_mac.cpp | 27 +++++++++++++++++++------ src/gui/painting/qunifiedtoolbarsurface_mac_p.h | 1 + src/gui/widgets/qmainwindowlayout_mac.mm | 15 ++++++++++++-- src/gui/widgets/qmainwindowlayout_p.h | 1 + 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/gui/painting/qunifiedtoolbarsurface_mac.cpp b/src/gui/painting/qunifiedtoolbarsurface_mac.cpp index ab05dbd..3590993 100644 --- a/src/gui/painting/qunifiedtoolbarsurface_mac.cpp +++ b/src/gui/painting/qunifiedtoolbarsurface_mac.cpp @@ -42,6 +42,7 @@ #include "qunifiedtoolbarsurface_mac_p.h" #include #include +#include #include @@ -90,7 +91,6 @@ void QUnifiedToolbarSurface::insertToolbar(QWidget *toolbar, const QPoint &offse { setGeometry(QRect(QPoint(0, 0), QSize(offset.x() + toolbar->width(), 100))); // FIXME recursiveRedirect(toolbar, offset); -// toolbar->d_func()->toolbar_offset = offset; } void QUnifiedToolbarSurface::setGeometry(const QRect &rect) @@ -101,6 +101,8 @@ void QUnifiedToolbarSurface::setGeometry(const QRect &rect) if (d->image == 0 || d->image->width() < rect.width() || d->image->height() < rect.height()) prepareBuffer(QImage::Format_ARGB32_Premultiplied, window()); d->inSetGeometry = false; + + // FIXME: set unified toolbar height. } void QUnifiedToolbarSurface::beginPaint(const QRegion &rgn) @@ -114,10 +116,18 @@ void QUnifiedToolbarSurface::beginPaint(const QRegion &rgn) } } +void QUnifiedToolbarSurface::updateToolbarOffset(QWidget *widget) +{ + QMainWindowLayout *mlayout = qobject_cast (widget->window()->layout()); + mlayout->updateUnifiedToolbarOffset(); +} + void QUnifiedToolbarSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &offset) { Q_D(QUnifiedToolbarSurface); + QRegion flushingRegion(widget->rect()); + if (!d->image || rgn.rectCount() == 0) { return; } @@ -132,24 +142,29 @@ void QUnifiedToolbarSurface::flush(QWidget *widget, const QRegion &rgn, const QP qt_mac_display(widget); return; } else { + // We render the content of the toolbar in the surface. + updateToolbarOffset(widget); + QRect beginPaintRect(widget->d_func()->toolbar_offset.x(), widget->d_func()->toolbar_offset.y(), widget->geometry().width(), widget->geometry().height()); + QRegion beginPaintRegion(beginPaintRect); + context = widget->d_func()->cgContext; + beginPaint(beginPaintRegion); widget->render(widget->d_func()->unifiedSurface->paintDevice(), widget->d_func()->toolbar_offset, QRegion(), QWidget::DrawChildren); } CGContextSaveGState(context); - int areaX = widget->geometry().x() + widget->d_func()->toolbar_offset.x(); - int areaY = widget->geometry().y() + widget->d_func()->toolbar_offset.y(); + int areaX = widget->d_func()->toolbar_offset.x(); + int areaY = widget->d_func()->toolbar_offset.y(); int areaWidth = widget->geometry().width(); int areaHeight = widget->geometry().height(); const CGRect area = CGRectMake(areaX, areaY, areaWidth, areaHeight); // Clip to region. - const QVector &rects = rgn.rects(); + const QVector &rects = flushingRegion.rects(); for (int i = 0; i < rects.size(); ++i) { const QRect &rect = rects.at(i); - // CGContextAddRect(context, CGRectMake(rect.x(), rect.y(), rect.width(), rect.height())); - CGContextAddRect(context, CGRectMake(0, 0, 1000, 1000)); //FIXME: Set correct size. + CGContextAddRect(context, CGRectMake(rect.x(), rect.y(), rect.width(), rect.height())); } CGContextAddRect(context, area); CGContextClip(context); diff --git a/src/gui/painting/qunifiedtoolbarsurface_mac_p.h b/src/gui/painting/qunifiedtoolbarsurface_mac_p.h index 4d72ff9..3bc0404 100644 --- a/src/gui/painting/qunifiedtoolbarsurface_mac_p.h +++ b/src/gui/painting/qunifiedtoolbarsurface_mac_p.h @@ -85,6 +85,7 @@ public: private: QPaintDevice *paintDevice(); + void updateToolbarOffset(QWidget *widget); void prepareBuffer(QImage::Format format, QWidget *widget); void recursiveRedirect(QObject *widget, const QPoint &offset); diff --git a/src/gui/widgets/qmainwindowlayout_mac.mm b/src/gui/widgets/qmainwindowlayout_mac.mm index 126cc4a..dfde799 100644 --- a/src/gui/widgets/qmainwindowlayout_mac.mm +++ b/src/gui/widgets/qmainwindowlayout_mac.mm @@ -43,6 +43,7 @@ #include #include #include +#include #ifndef QT_MAC_USE_COCOA #include @@ -473,6 +474,16 @@ void QMainWindowLayout::insertIntoMacToolbar(QToolBar *before, QToolBar *toolbar #endif } +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; + } +} + void QMainWindowLayout::removeFromMacToolbar(QToolBar *toolbar) { QHash::iterator it = unifiedToolbarHash.begin(); @@ -546,11 +557,11 @@ void QMainWindowLayout::fixSizeInUnifiedToolbar(QToolBar *tb) const QMacCocoaAutoReleasePool pool; QWidgetItem layoutItem(tb); QSize size = layoutItem.maximumSize(); - NSSize nssize = NSMakeSize(size.width(), size.height() - 2); + NSSize nssize = NSMakeSize(size.width(), size.height()); [item setMaxSize:nssize]; size = layoutItem.minimumSize(); nssize.width = size.width(); - nssize.height = size.height() - 2; + nssize.height = size.height(); [item setMinSize:nssize]; } #else diff --git a/src/gui/widgets/qmainwindowlayout_p.h b/src/gui/widgets/qmainwindowlayout_p.h index a372216..e457cbc 100644 --- a/src/gui/widgets/qmainwindowlayout_p.h +++ b/src/gui/widgets/qmainwindowlayout_p.h @@ -335,6 +335,7 @@ public: QHash toolbarSaveState; QHash cocoaItemIDToToolbarHash; void insertIntoMacToolbar(QToolBar *before, QToolBar *after); + void updateUnifiedToolbarOffset(); void removeFromMacToolbar(QToolBar *toolbar); void cleanUpMacToolbarItems(); void fixSizeInUnifiedToolbar(QToolBar *tb) const; -- cgit v0.12