Fix QDockWidget titlebar button positioning on Mac OS X

Move the QDockWidget close and float buttons from the right end of the
dock widget title bar to the left end to avoid Mac App Store rejection.

Task-number: QTBUG-19493

Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
(cherry picked from commit 3b2bd144b7873daf2e7119248dbac7c0f0253993)
Change-Id: I3b2bd144b7873daf2e7119248dbac7c0f0253993
This commit is contained in:
Pasi Matilainen 2011-11-14 15:39:25 +01:00 committed by Qt by Nokia
parent 44e8b84cae
commit 31da70ff8e

View File

@ -4465,6 +4465,107 @@ QRect QMacStyle::subElementRect(SubElement sr, const QStyleOption *opt,
rect.setTop(rect.top() + SIZE(6 /* AHIG */, 3 /* guess */, 2 /* AHIG */));
}
break;
#ifndef QT_NO_DOCKWIDGET
case SE_DockWidgetCloseButton:
case SE_DockWidgetFloatButton:
case SE_DockWidgetTitleBarText:
case SE_DockWidgetIcon: {
int iconSize = proxy()->pixelMetric(PM_SmallIconSize, opt, widget);
int buttonMargin = proxy()->pixelMetric(PM_DockWidgetTitleBarButtonMargin, opt, widget);
QRect srect = opt->rect;
const QStyleOptionDockWidget *dwOpt
= qstyleoption_cast<const QStyleOptionDockWidget*>(opt);
bool canClose = dwOpt == 0 ? true : dwOpt->closable;
bool canFloat = dwOpt == 0 ? false : dwOpt->floatable;
const QStyleOptionDockWidgetV2 *v2
= qstyleoption_cast<const QStyleOptionDockWidgetV2*>(opt);
bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar;
// If this is a vertical titlebar, we transpose and work as if it was
// horizontal, then transpose again.
if (verticalTitleBar) {
QSize size = srect.size();
size.transpose();
srect.setSize(size);
}
do {
int right = srect.right();
int left = srect.left();
QRect closeRect;
if (canClose) {
QSize sz = standardIcon(QStyle::SP_TitleBarCloseButton,
opt, widget).actualSize(QSize(iconSize, iconSize));
sz += QSize(buttonMargin, buttonMargin);
if (verticalTitleBar)
sz.transpose();
closeRect = QRect(left,
srect.center().y() - sz.height()/2,
sz.width(), sz.height());
left = closeRect.right() + 1;
}
if (sr == SE_DockWidgetCloseButton) {
rect = closeRect;
break;
}
QRect floatRect;
if (canFloat) {
QSize sz = standardIcon(QStyle::SP_TitleBarNormalButton,
opt, widget).actualSize(QSize(iconSize, iconSize));
sz += QSize(buttonMargin, buttonMargin);
if (verticalTitleBar)
sz.transpose();
floatRect = QRect(left,
srect.center().y() - sz.height()/2,
sz.width(), sz.height());
left = floatRect.right() + 1;
}
if (sr == SE_DockWidgetFloatButton) {
rect = floatRect;
break;
}
QRect iconRect;
if (const QDockWidget *dw = qobject_cast<const QDockWidget*>(widget)) {
QIcon icon;
if (dw->isFloating())
icon = dw->windowIcon();
if (!icon.isNull()
&& icon.cacheKey() != QApplication::windowIcon().cacheKey()) {
QSize sz = icon.actualSize(QSize(rect.height(), rect.height()));
if (verticalTitleBar)
sz.transpose();
iconRect = QRect(right - sz.width(), srect.center().y() - sz.height()/2,
sz.width(), sz.height());
right = iconRect.left() - 1;
}
}
if (sr == SE_DockWidgetIcon) {
rect = iconRect;
break;
}
QRect textRect = QRect(left, srect.top(),
right - left, srect.height());
if (sr == SE_DockWidgetTitleBarText) {
rect = textRect;
break;
}
} while (false);
if (verticalTitleBar) {
rect = QRect(srect.left() + rect.top() - srect.top(),
srect.top() + srect.right() - rect.right(),
rect.height(), rect.width());
} else {
rect = visualRect(opt->direction, srect, rect);
}
break;
}
#endif
default:
rect = QWindowsStyle::subElementRect(sr, opt, widget);
break;