diff options
author | David Boddie <dboddie@trolltech.com> | 2009-08-27 17:17:43 (GMT) |
---|---|---|
committer | David Boddie <dboddie@trolltech.com> | 2009-08-27 17:17:43 (GMT) |
commit | 81fc91183fd12cff512ac20ed265b6c0b44b2f30 (patch) | |
tree | cee6735f83fadc0a10d999a8baacf441da302069 /src/gui/styles | |
parent | 34d66c954e85fddd50d3a8712e0e8dc985d3414c (diff) | |
parent | 1241aa609bb1621e6377920219b6d18a1203e50a (diff) | |
download | Qt-81fc91183fd12cff512ac20ed265b6c0b44b2f30.zip Qt-81fc91183fd12cff512ac20ed265b6c0b44b2f30.tar.gz Qt-81fc91183fd12cff512ac20ed265b6c0b44b2f30.tar.bz2 |
Merge branch '4.6' of git@scm.dev.nokia.troll.no:qt/qt into 4.6
Diffstat (limited to 'src/gui/styles')
-rw-r--r-- | src/gui/styles/qcommonstyle.cpp | 167 | ||||
-rw-r--r-- | src/gui/styles/qcommonstyle_p.h | 3 | ||||
-rw-r--r-- | src/gui/styles/qmacstyle_mac.mm | 13 |
3 files changed, 95 insertions, 88 deletions
diff --git a/src/gui/styles/qcommonstyle.cpp b/src/gui/styles/qcommonstyle.cpp index 2dab9b3..ee9827e 100644 --- a/src/gui/styles/qcommonstyle.cpp +++ b/src/gui/styles/qcommonstyle.cpp @@ -870,7 +870,6 @@ int QCommonStylePrivate::lookupToolButtonStyle() const #ifndef QT_NO_ITEMVIEWS - QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItemV4 *option, int role) const { Q_Q(const QCommonStyle); @@ -1158,6 +1157,75 @@ void QCommonStylePrivate::viewItemLayout(const QStyleOptionViewItemV4 *opt, QRe } #endif // QT_NO_ITEMVIEWS + +#ifndef QT_NO_TABBAR +/*! \internal + Compute the textRect and the pixmapRect from the opt rect + + Uses the same computation than in QTabBar::tabSizeHint + */ +void QCommonStylePrivate::tabLayout(const QStyleOptionTabV3 *opt, const QWidget *widget, QRect *textRect, QRect *iconRect) const +{ + Q_ASSERT(textRect); + Q_ASSERT(iconRect); + QRect tr = opt->rect; + bool verticalTabs = opt->shape == QTabBar::RoundedEast + || opt->shape == QTabBar::RoundedWest + || opt->shape == QTabBar::TriangularEast + || opt->shape == QTabBar::TriangularWest; + if (verticalTabs) + tr.setRect(0, 0, tr.height(), tr.width()); //0, 0 as we will have a translate transform + + int verticalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftVertical, opt, widget); + int horizontalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, opt, widget); + int hpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabHSpace, opt, widget) / 2; + int vpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabVSpace, opt, widget) / 2; + if (opt->shape == QTabBar::RoundedSouth || opt->shape == QTabBar::TriangularSouth) + verticalShift = -verticalShift; + tr.adjust(hpadding, vpadding, horizontalShift - hpadding, verticalShift - vpadding); + bool selected = opt->state & QStyle::State_Selected; + if (selected) { + tr.setBottom(tr.bottom() - verticalShift); + tr.setRight(tr.right() - horizontalShift); + } + + // left widget + if (!opt->leftButtonSize.isEmpty()) { + tr.setLeft(tr.left() + 4 + + (verticalTabs ? opt->leftButtonSize.height() : opt->leftButtonSize.width())); + } + // right widget + if (!opt->rightButtonSize.isEmpty()) { + tr.setRight(tr.right() - 4 - + (verticalTabs ? opt->rightButtonSize.height() : opt->rightButtonSize.width())); + } + + // icon + if (!opt->icon.isNull()) { + QSize iconSize = opt->iconSize; + if (!iconSize.isValid()) { + int iconExtent = proxyStyle->pixelMetric(QStyle::PM_SmallIconSize); + iconSize = QSize(iconExtent, iconExtent); + } + QSize tabIconSize = opt->icon.actualSize(iconSize, + (opt->state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled, + (opt->state & QStyle::State_Selected) ? QIcon::On : QIcon::Off ); + + *iconRect = QRect(tr.left(), tr.center().y() - tabIconSize.height() / 2, + tabIconSize.width(), tabIconSize .height()); + if (!verticalTabs) + *iconRect = proxyStyle->visualRect(opt->direction, opt->rect, *iconRect); + tr.setLeft(tr.left() + tabIconSize.width() + 4); + } + + if (!verticalTabs) + tr = proxyStyle->visualRect(opt->direction, opt->rect, tr); + + *textRect = tr; +} +#endif //QT_NO_TABBAR + + /*! \reimp */ @@ -1840,38 +1908,20 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, newY = tr.y() + tr.height(); newRot = -90; } - tr.setRect(0, 0, tr.height(), tr.width()); QTransform m = QTransform::fromTranslate(newX, newY); m.rotate(newRot); p->setTransform(m, true); } - tr = subElementRect(SE_TabBarTabText, opt, widget); + QRect iconRect; + d->tabLayout(&tabV2, widget, &tr, &iconRect); + tr = proxy()->subElementRect(SE_TabBarTabText, opt, widget); //we compute tr twice because the style may override subElementRect if (!tabV2.icon.isNull()) { - QSize iconSize = tabV2.iconSize; - if (!iconSize.isValid()) { - int iconExtent = proxy()->pixelMetric(PM_SmallIconSize); - iconSize = QSize(iconExtent, iconExtent); - } - QSize tabIconSize = tabV2.icon.actualSize(iconSize, - (tabV2.state & State_Enabled) ? QIcon::Normal - : QIcon::Disabled); - QPixmap tabIcon = tabV2.icon.pixmap(iconSize, + QPixmap tabIcon = tabV2.icon.pixmap(tabV2.iconSize, (tabV2.state & State_Enabled) ? QIcon::Normal : QIcon::Disabled, (tabV2.state & State_Selected) ? QIcon::On : QIcon::Off); - - int offset = 4; - int left = opt->rect.left(); - if (tabV2.leftButtonSize.isEmpty()) - offset += 2; - else - left += tabV2.leftButtonSize.width() + (6 + 2) + 2; - QRect iconRect = QRect(left + offset, tr.center().y() - tabIcon.height() / 2, - tabIconSize.width(), tabIconSize.height()); - if (!verticalTabs) - iconRect = visualRect(opt->direction, opt->rect, iconRect); p->drawPixmap(iconRect.x(), iconRect.y(), tabIcon); } @@ -2718,65 +2768,10 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt, } break; case SE_TabBarTabText: - // ### consider merging this with CE_TabBarTabLabel if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) { - QStyleOptionTabV3 tabV2(*tab); - QRect tr = tabV2.rect; - bool verticalTabs = tabV2.shape == QTabBar::RoundedEast - || tabV2.shape == QTabBar::RoundedWest - || tabV2.shape == QTabBar::TriangularEast - || tabV2.shape == QTabBar::TriangularWest; - if (verticalTabs) - tr.setRect(0, 0, tr.height(), tr.width()); - int verticalShift = pixelMetric(QStyle::PM_TabBarTabShiftVertical, tab, widget); - int horizontalShift = pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, tab, widget); - int hpadding = proxy()->pixelMetric(QStyle::PM_TabBarTabHSpace, opt, widget) / 2; - int vpadding = proxy()->pixelMetric(QStyle::PM_TabBarTabVSpace, opt, widget) / 2; - if (tabV2.shape == QTabBar::RoundedSouth || tabV2.shape == QTabBar::TriangularSouth) - verticalShift = -verticalShift; - tr.adjust(hpadding, vpadding, horizontalShift - hpadding, verticalShift - vpadding); - bool selected = tabV2.state & State_Selected; - if (selected) { - tr.setBottom(tr.bottom() - verticalShift); - tr.setRight(tr.right() - horizontalShift); - } - - // left widget - if (!tabV2.leftButtonSize.isEmpty()) { - tr.setLeft(tr.left() + 6 + 2 + - (verticalTabs ? tabV2.leftButtonSize.height() : tabV2.leftButtonSize.width())); - } - - // icon - if (!tabV2.icon.isNull()) { - QSize iconSize = tabV2.iconSize; - if (!iconSize.isValid()) { - int iconExtent = proxy()->pixelMetric(PM_SmallIconSize); - iconSize = QSize(iconExtent, iconExtent); - } - QSize tabIconSize = tabV2.icon.actualSize(iconSize, - (tabV2.state & State_Enabled) ? QIcon::Normal - : QIcon::Disabled); - int offset = 4; - if (tabV2.leftButtonSize.isEmpty()) - offset += 2; - - QRect iconRect = QRect(tr.left() + offset, tr.center().y() - tabIconSize.height() / 2, - tabIconSize.width(), tabIconSize .height()); - if (!verticalTabs) - iconRect = visualRect(opt->direction, opt->rect, iconRect); - tr.setLeft(tr.left() + tabIconSize.width() + offset + 2); - } - - // right widget - if (!tabV2.rightButtonSize.isEmpty()) { - tr.setRight(tr.right() - 6 - 2 - - (verticalTabs ? tabV2.rightButtonSize.height() : tabV2.rightButtonSize.width())); - } - - if (!verticalTabs) - tr = visualRect(opt->direction, opt->rect, tr); - r = tr; + QStyleOptionTabV3 tabV3(*tab); + QRect dummyIconRect; + d->tabLayout(&tabV3, widget, &r, &dummyIconRect); } break; case SE_TabBarTabLeftButton: @@ -2785,6 +2780,8 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt, bool selected = tab->state & State_Selected; int verticalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftVertical, tab, widget); int horizontalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, tab, widget); + int hpadding = proxy()->pixelMetric(QStyle::PM_TabBarTabHSpace, opt, widget) / 2; + hpadding = qMax(hpadding, 4); //workaround KStyle returning 0 because they workaround an old bug in Qt bool verticalTabs = tab->shape == QTabBar::RoundedEast || tab->shape == QTabBar::RoundedWest @@ -2827,16 +2824,16 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt, break; default: if (sr == SE_TabBarTabLeftButton) - r = QRect(6 + tab->rect.x(), midHeight, w, h); + r = QRect(tab->rect.x() + hpadding, midHeight, w, h); else - r = QRect(tab->rect.right() - 6 - w, midHeight, w, h); + r = QRect(tab->rect.right() - w - hpadding, midHeight, w, h); r = visualRect(tab->direction, tab->rect, r); } if (verticalTabs) { if (atTheTop) - r = QRect(midWidth, tr.y() + tab->rect.height() - 6 - h, w, h); + r = QRect(midWidth, tr.y() + tab->rect.height() - hpadding - h, w, h); else - r = QRect(midWidth, tr.y() + 6, w, h); + r = QRect(midWidth, tr.y() + hpadding, w, h); } } diff --git a/src/gui/styles/qcommonstyle_p.h b/src/gui/styles/qcommonstyle_p.h index 7e58b37..14f5558 100644 --- a/src/gui/styles/qcommonstyle_p.h +++ b/src/gui/styles/qcommonstyle_p.h @@ -123,6 +123,9 @@ public: #endif mutable QIcon tabBarcloseButtonIcon; int lookupToolButtonStyle() const; +#ifndef QT_NO_TABBAR + void tabLayout(const QStyleOptionTabV3 *opt, const QWidget *widget, QRect *textRect, QRect *pixmapRect) const; +#endif }; QT_END_NAMESPACE diff --git a/src/gui/styles/qmacstyle_mac.mm b/src/gui/styles/qmacstyle_mac.mm index 08b6ad8..905044c 100644 --- a/src/gui/styles/qmacstyle_mac.mm +++ b/src/gui/styles/qmacstyle_mac.mm @@ -5318,16 +5318,23 @@ QRect QMacStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex *op case SC_ComboBoxArrow:{ ret = QMacStylePrivate::comboboxEditBounds(combo->rect, bdi); ret.setX(ret.x() + ret.width()); - ret.setWidth(combo->rect.width() - ret.width() - ret.x()); + ret.setWidth(combo->rect.right() - ret.right()); break; } case SC_ComboBoxListBoxPopup:{ if (combo->editable) { HIRect inner = QMacStylePrivate::comboboxInnerBounds(qt_hirectForQRect(combo->rect), bdi.kind); QRect editRect = QMacStylePrivate::comboboxEditBounds(combo->rect, bdi); - ret.adjust(qRound(inner.origin.x), 0, qRound(inner.origin.x + inner.size.width), editRect.y() + editRect.height() + 2); + const int comboTop = combo->rect.top(); + ret = QRect(qRound(inner.origin.x), + comboTop, + qRound(inner.origin.x - combo->rect.left() + inner.size.width), + editRect.bottom() - comboTop + 2); } else { QRect editRect = QMacStylePrivate::comboboxEditBounds(combo->rect, bdi); - ret.adjust(4 - 11, 1, editRect.width() + 10 + 11, 1); + ret = QRect(combo->rect.x() + 4 - 11, + combo->rect.y() + 1, + editRect.width() + 10 + 11, + 1); } break; } default: |