Fix restore/minimize/close buttons for maximized MDI subwidows

The style code to display the restore/minimize/close buttons in menubar
for maximized MDI subwidows was removed in Qt5 as it was incorrectly
ifdeffed with just QT_NO_WORKSPACE where QT_NO_MDIAREA should
also have been used. Brought back the removed code with proper
ifdeffing.

Task-number: QTBUG-27235
Change-Id: I89607dd54eec00329e576c72b0e8b997f37cdb29
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
This commit is contained in:
Miikka Heikkinen 2012-09-17 12:33:44 +03:00 committed by The Qt Project
parent 371c21b9a8
commit 1eabc2417b
2 changed files with 201 additions and 0 deletions

View File

@ -3567,6 +3567,68 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl
}
break;
#endif // QT_NO_GROUPBOX
#ifndef QT_NO_MDIAREA
case CC_MdiControls:
{
QStyleOptionButton btnOpt;
btnOpt.QStyleOption::operator=(*opt);
btnOpt.state &= ~State_MouseOver;
int bsx = 0;
int bsy = 0;
if (opt->subControls & QStyle::SC_MdiCloseButton) {
if (opt->activeSubControls & QStyle::SC_MdiCloseButton && (opt->state & State_Sunken)) {
btnOpt.state |= State_Sunken;
btnOpt.state &= ~State_Raised;
bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
} else {
btnOpt.state |= State_Raised;
btnOpt.state &= ~State_Sunken;
bsx = 0;
bsy = 0;
}
btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiCloseButton, widget);
proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p, widget);
QPixmap pm = standardIcon(SP_TitleBarCloseButton).pixmap(16, 16);
proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
}
if (opt->subControls & QStyle::SC_MdiNormalButton) {
if (opt->activeSubControls & QStyle::SC_MdiNormalButton && (opt->state & State_Sunken)) {
btnOpt.state |= State_Sunken;
btnOpt.state &= ~State_Raised;
bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
} else {
btnOpt.state |= State_Raised;
btnOpt.state &= ~State_Sunken;
bsx = 0;
bsy = 0;
}
btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiNormalButton, widget);
proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p, widget);
QPixmap pm = standardIcon(SP_TitleBarNormalButton).pixmap(16, 16);
proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
}
if (opt->subControls & QStyle::SC_MdiMinButton) {
if (opt->activeSubControls & QStyle::SC_MdiMinButton && (opt->state & State_Sunken)) {
btnOpt.state |= State_Sunken;
btnOpt.state &= ~State_Raised;
bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
} else {
btnOpt.state |= State_Raised;
btnOpt.state &= ~State_Sunken;
bsx = 0;
bsy = 0;
}
btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiMinButton, widget);
proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p, widget);
QPixmap pm = standardIcon(SP_TitleBarMinButton).pixmap(16, 16);
proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
}
}
break;
#endif // QT_NO_MDIAREA
default:
qWarning("QCommonStyle::drawComplexControl: Control %d not handled", cc);
}
@ -4091,6 +4153,50 @@ QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex
break;
}
#endif // QT_NO_GROUPBOX
#ifndef QT_NO_MDIAREA
case CC_MdiControls:
{
int numSubControls = 0;
if (opt->subControls & SC_MdiCloseButton)
++numSubControls;
if (opt->subControls & SC_MdiMinButton)
++numSubControls;
if (opt->subControls & SC_MdiNormalButton)
++numSubControls;
if (numSubControls == 0)
break;
int buttonWidth = opt->rect.width() / numSubControls - 1;
int offset = 0;
switch (sc) {
case SC_MdiCloseButton:
// Only one sub control, no offset needed.
if (numSubControls == 1)
break;
offset += buttonWidth + 2;
//FALL THROUGH
case SC_MdiNormalButton:
// No offset needed if
// 1) There's only one sub control
// 2) We have a close button and a normal button (offset already added in SC_MdiClose)
if (numSubControls == 1 || (numSubControls == 2 && !(opt->subControls & SC_MdiMinButton)))
break;
if (opt->subControls & SC_MdiNormalButton)
offset += buttonWidth;
break;
default:
break;
}
// Subtract one pixel if we only have one sub control. At this point
// buttonWidth is the actual width + 1 pixel margin, but we don't want the
// margin when there are no other controllers.
if (numSubControls == 1)
--buttonWidth;
ret = QRect(offset, 0, buttonWidth, opt->rect.height());
break;
}
#endif // QT_NO_MDIAREA
default:
qWarning("QCommonStyle::subControlRect: Case %d not handled", cc);
}

View File

@ -3274,6 +3274,63 @@ void QWindowsXPStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCo
}
break;
#ifndef QT_NO_MDIAREA
case CC_MdiControls:
{
QRect buttonRect;
XPThemeData theme(widget, p, QWindowsXPStylePrivate::WindowTheme, WP_MDICLOSEBUTTON, CBS_NORMAL);
if (option->subControls & SC_MdiCloseButton) {
buttonRect = proxy()->subControlRect(CC_MdiControls, option, SC_MdiCloseButton, widget);
if (theme.isValid()) {
theme.partId = WP_MDICLOSEBUTTON;
theme.rect = buttonRect;
if (!(flags & State_Enabled))
theme.stateId = CBS_INACTIVE;
else if (flags & State_Sunken && (option->activeSubControls & SC_MdiCloseButton))
theme.stateId = CBS_PUSHED;
else if (flags & State_MouseOver && (option->activeSubControls & SC_MdiCloseButton))
theme.stateId = CBS_HOT;
else
theme.stateId = CBS_NORMAL;
d->drawBackground(theme);
}
}
if (option->subControls & SC_MdiNormalButton) {
buttonRect = proxy()->subControlRect(CC_MdiControls, option, SC_MdiNormalButton, widget);
if (theme.isValid()) {
theme.partId = WP_MDIRESTOREBUTTON;
theme.rect = buttonRect;
if (!(flags & State_Enabled))
theme.stateId = CBS_INACTIVE;
else if (flags & State_Sunken && (option->activeSubControls & SC_MdiNormalButton))
theme.stateId = CBS_PUSHED;
else if (flags & State_MouseOver && (option->activeSubControls & SC_MdiNormalButton))
theme.stateId = CBS_HOT;
else
theme.stateId = CBS_NORMAL;
d->drawBackground(theme);
}
}
if (option->subControls & QStyle::SC_MdiMinButton) {
buttonRect = proxy()->subControlRect(CC_MdiControls, option, SC_MdiMinButton, widget);
if (theme.isValid()) {
theme.partId = WP_MDIMINBUTTON;
theme.rect = buttonRect;
if (!(flags & State_Enabled))
theme.stateId = CBS_INACTIVE;
else if (flags & State_Sunken && (option->activeSubControls & SC_MdiMinButton))
theme.stateId = CBS_PUSHED;
else if (flags & State_MouseOver && (option->activeSubControls & SC_MdiMinButton))
theme.stateId = CBS_HOT;
else
theme.stateId = CBS_NORMAL;
d->drawBackground(theme);
}
}
}
break;
#endif //QT_NO_MDIAREA
#ifndef QT_NO_DIAL
case CC_Dial:
if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(option))
@ -3661,6 +3718,44 @@ QRect QWindowsXPStyle::subControlRect(ComplexControl cc, const QStyleOptionCompl
}
}
break;
#ifndef QT_NO_MDIAREA
case CC_MdiControls:
{
int numSubControls = 0;
if (option->subControls & SC_MdiCloseButton)
++numSubControls;
if (option->subControls & SC_MdiMinButton)
++numSubControls;
if (option->subControls & SC_MdiNormalButton)
++numSubControls;
if (numSubControls == 0)
break;
int buttonWidth = option->rect.width() / numSubControls;
int offset = 0;
switch (subControl) {
case SC_MdiCloseButton:
// Only one sub control, no offset needed.
if (numSubControls == 1)
break;
offset += buttonWidth;
//FALL THROUGH
case SC_MdiNormalButton:
// No offset needed if
// 1) There's only one sub control
// 2) We have a close button and a normal button (offset already added in SC_MdiClose)
if (numSubControls == 1 || (numSubControls == 2 && !(option->subControls & SC_MdiMinButton)))
break;
if (option->subControls & SC_MdiNormalButton)
offset += buttonWidth;
break;
default:
break;
}
rect = QRect(offset, 0, buttonWidth, option->rect.height());
break;
}
#endif // QT_NO_MDIAREA
default:
rect = visualRect(option->direction, option->rect,