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:
parent
371c21b9a8
commit
1eabc2417b
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user