summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Bache-Wiig <jbache@trolltech.com>2009-04-20 15:03:14 (GMT)
committerJens Bache-Wiig <jbache@trolltech.com>2009-04-20 15:09:14 (GMT)
commitd7072b5577e3c07e984885cf05d5f9b217c6f473 (patch)
treed40cc0c71e15d482feb411b169a986c6940308f6
parent68d6a91fd2db9ec95d9f46e7af10eff7da89f8f0 (diff)
downloadQt-d7072b5577e3c07e984885cf05d5f9b217c6f473.zip
Qt-d7072b5577e3c07e984885cf05d5f9b217c6f473.tar.gz
Qt-d7072b5577e3c07e984885cf05d5f9b217c6f473.tar.bz2
Fix tabbar issues with Oxygen style
Oxygen style was looking a bit broken when using 4.5 features such as close buttons and icons. This was because it re-implements the tabbartablabel primitive we needed to ensure spacing for the buttons. We had to modify the way we draw tabs slightly to make it more backward compatible so that oxygen get the same region as before and we ensure space for it in the CE_TabBarTab case instead. Note that the drawback to this approach is that the focus rect needs to be moved out of the tablabel and into the CE_TabBarTab case so it covers the entire tab which can potentially cause problems if people depend on the label to draw the focus rect. However the new case is also more consistent with how buttons draw their focus. Task-number: 251635 Reviewed-by: nrc
-rw-r--r--src/gui/styles/qcommonstyle.cpp73
1 files changed, 41 insertions, 32 deletions
diff --git a/src/gui/styles/qcommonstyle.cpp b/src/gui/styles/qcommonstyle.cpp
index 3cae08a..819965b 100644
--- a/src/gui/styles/qcommonstyle.cpp
+++ b/src/gui/styles/qcommonstyle.cpp
@@ -1779,7 +1779,46 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
case CE_TabBarTab:
if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
drawControl(CE_TabBarTabShape, tab, p, widget);
- drawControl(CE_TabBarTabLabel, tab, p, widget);
+
+ QStyleOptionTabV3 tabV3(*tab);
+ QRect labelRect = tabV3.rect;
+ QSize &left= tabV3.leftButtonSize;
+ QSize &right = tabV3.rightButtonSize;
+ const int spacing = 6 + 2;
+
+ // left widget
+ if (!left.isEmpty()) {
+ if (tabV3.shape == QTabBar::RoundedEast || tabV3.shape == QTabBar::TriangularEast )
+ labelRect.setTop(labelRect.top() + spacing + left.height());
+ else if (tabV3.shape == QTabBar::RoundedWest|| tabV3.shape == QTabBar::TriangularWest)
+ labelRect.setBottom(labelRect.bottom() - spacing - left.height());
+ else
+ labelRect.setLeft(labelRect.left() + spacing + left.width());
+ }
+
+ // right widget
+ if (!right.isEmpty()) {
+ if (tabV3.shape == QTabBar::RoundedEast || tabV3.shape == QTabBar::TriangularEast )
+ labelRect.setBottom(labelRect.bottom() - spacing - right.height());
+ else if (tabV3.shape == QTabBar::RoundedWest|| tabV3.shape == QTabBar::TriangularWest)
+ labelRect.setTop(labelRect.top() + spacing + right.height());
+ else
+ labelRect.setRight(labelRect.right() - spacing - right.width());
+ }
+
+ tabV3.rect = visualRect(opt->direction, opt->rect, labelRect);
+ drawControl(CE_TabBarTabLabel, &tabV3, p, widget);
+ if (tabV3.state & State_HasFocus) {
+ const int OFFSET = 1 + pixelMetric(PM_DefaultFrameWidth);
+ int x1, x2;
+ x1 = tab->rect.left();
+ x2 = tab->rect.right() - 1;
+ QStyleOptionFocusRect fropt;
+ fropt.QStyleOption::operator=(*tab);
+ fropt.rect.setRect(x1 + 1 + OFFSET, tab->rect.y() + OFFSET,
+ x2 - x1 - 2*OFFSET, tab->rect.height() - 2*OFFSET);
+ drawPrimitive(PE_FrameFocusRect, &fropt, p, widget);
+ }
}
break;
case CE_TabBarTabShape:
@@ -1981,12 +2020,8 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
(tabV2.state & State_Enabled) ? QIcon::Normal
: QIcon::Disabled);
- int offset = 4;
+ int offset = 6;
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)
@@ -1997,20 +2032,6 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
drawItemText(p, tr, alignment, tab->palette, tab->state & State_Enabled, tab->text, QPalette::WindowText);
if (verticalTabs)
p->restore();
-
- if (tabV2.state & State_HasFocus) {
- const int OFFSET = 1 + pixelMetric(PM_DefaultFrameWidth);
-
- int x1, x2;
- x1 = tabV2.rect.left();
- x2 = tabV2.rect.right() - 1;
-
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*tab);
- fropt.rect.setRect(x1 + 1 + OFFSET, tabV2.rect.y() + OFFSET,
- x2 - x1 - 2*OFFSET, tabV2.rect.height() - 2*OFFSET);
- drawPrimitive(PE_FrameFocusRect, &fropt, p, widget);
- }
}
break;
#endif // QT_NO_TABBAR
@@ -2858,12 +2879,6 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt,
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;
@@ -2885,12 +2900,6 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt,
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;