diff --git a/qrenderdoc/Styles/RDStyle/RDStyle.cpp b/qrenderdoc/Styles/RDStyle/RDStyle.cpp index 762c5599a..92b2d1895 100644 --- a/qrenderdoc/Styles/RDStyle/RDStyle.cpp +++ b/qrenderdoc/Styles/RDStyle/RDStyle.cpp @@ -654,7 +654,7 @@ QSize RDStyle::sizeFromContents(ContentsType type, const QStyleOption *opt, cons return ret; } - else if(type == CT_MenuBarItem || type == CT_MenuItem) + else if(type == CT_MenuItem) { QSize ret = size; @@ -663,14 +663,28 @@ QSize RDStyle::sizeFromContents(ContentsType type, const QStyleOption *opt, cons const QStyleOptionMenuItem *menuitem = qstyleoption_cast(opt); - if(type == CT_MenuItem && menuitem->maxIconWidth) - { - // add room for an icon + // add room for an icon + if(menuitem->maxIconWidth) ret.setWidth(ret.width() + Constants::MenuBarMargin + menuitem->maxIconWidth); - } return ret; } + else if(type == CT_MenuBarItem) + { + const QStyleOptionMenuItem *menuitem = qstyleoption_cast(opt); + int iconSize = pixelMetric(QStyle::PM_SmallIconSize, opt, widget); + QSize sz = menuitem->fontMetrics.size(Qt::TextShowMnemonic, menuitem->text); + + if(!menuitem->icon.isNull()) + { + sz.setWidth(sz.width() + Constants::MenuBarMargin + iconSize); + sz = sz.expandedTo(QSize(1, iconSize)); + } + + sz += QSize(Constants::MenuBarMargin * 2, Constants::MenuBarMargin); + + return sz; + } else if(type == CT_MenuBar || type == CT_Menu) { return size; @@ -1618,6 +1632,23 @@ void RDStyle::drawControl(ControlElement control, const QStyleOption *opt, QPain rect.adjust(Constants::MenuBarMargin, 0, -Constants::MenuBarMargin, 0); + if(!menuitem->icon.isNull()) + { + int iconSize = pixelMetric(QStyle::PM_SmallIconSize, opt, widget); + + QPixmap pix = menuitem->icon.pixmap( + iconSize, iconSize, (menuitem->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled); + + if(!pix.isNull()) + { + QRectF iconRect = rect; + iconRect.setWidth(iconSize); + drawItemPixmap(p, iconRect.toRect(), Qt::AlignCenter | Qt::AlignTop | Qt::TextHideMnemonic, + pix); + rect.adjust(iconSize + Constants::MenuBarMargin, 0, 0, 0); + } + } + if(menuitem->menuItemType == QStyleOptionMenuItem::Normal) { p->setFont(menuitem->font); diff --git a/qrenderdoc/Styles/RDTweakedNativeStyle/RDTweakedNativeStyle.cpp b/qrenderdoc/Styles/RDTweakedNativeStyle/RDTweakedNativeStyle.cpp index 702b19b74..96902fff6 100644 --- a/qrenderdoc/Styles/RDTweakedNativeStyle/RDTweakedNativeStyle.cpp +++ b/qrenderdoc/Styles/RDTweakedNativeStyle/RDTweakedNativeStyle.cpp @@ -28,6 +28,13 @@ #include #include +namespace Constants +{ +static const int MenuBarItemHPadding = 4; +static const int MenuBarItemVPadding = 2; +static const int MenuBarItemSpacing = 4; +}; + RDTweakedNativeStyle::RDTweakedNativeStyle(QStyle *parent) : QProxyStyle(parent) { } @@ -67,6 +74,25 @@ QSize RDTweakedNativeStyle::sizeFromContents(ContentsType type, const QStyleOpti sz = sz.expandedTo(toolbutton->iconSize); } + // menu bar items can be sized for both the icon *and* the text + if(type == CT_MenuBarItem) + { + const QStyleOptionMenuItem *menuopt = qstyleoption_cast(opt); + int iconSize = pixelMetric(QStyle::PM_SmallIconSize, opt, widget); + sz = menuopt->fontMetrics.size(Qt::TextShowMnemonic, menuopt->text); + + if(!menuopt->icon.isNull()) + { + sz.setWidth(sz.width() + Constants::MenuBarItemSpacing + iconSize); + sz = sz.expandedTo(QSize(1, iconSize)); + } + + sz += QSize(Constants::MenuBarItemHPadding * 2 + Constants::MenuBarItemSpacing * 2, + Constants::MenuBarItemVPadding * 2); + + return sz; + } + return QProxyStyle::sizeFromContents(type, opt, sz, widget); } @@ -307,5 +333,51 @@ void RDTweakedNativeStyle::drawPrimitive(PrimitiveElement element, const QStyleO void RDTweakedNativeStyle::drawControl(ControlElement control, const QStyleOption *opt, QPainter *p, const QWidget *widget) const { + if(control == QStyle::CE_MenuBarItem) + { + // we can't take over control of just rendering the icon/text, so we call down to common style + // to draw the background since then we know how to render matching text over the top. + const QStyleOptionMenuItem *menuopt = qstyleoption_cast(opt); + + QRect rect = + menuopt->rect.adjusted(Constants::MenuBarItemSpacing, 0, -Constants::MenuBarItemSpacing, 0); + + const bool selected = menuopt->state & State_Selected; + const bool hovered = menuopt->state & State_MouseOver; + const bool enabled = menuopt->state & State_Enabled; + + QPalette::ColorRole textRole = QPalette::ButtonText; + + if(enabled && (selected || hovered)) + { + p->fillRect(rect, opt->palette.brush(QPalette::Highlight)); + textRole = QPalette::HighlightedText; + } + + int flags = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine; + if(!styleHint(SH_UnderlineShortcut, opt, widget)) + flags |= Qt::TextHideMnemonic; + + rect.adjust(Constants::MenuBarItemHPadding, Constants::MenuBarItemVPadding, + -Constants::MenuBarItemHPadding, -Constants::MenuBarItemVPadding); + + int iconSize = pixelMetric(QStyle::PM_SmallIconSize, opt, widget); + + QPixmap pix = menuopt->icon.pixmap( + iconSize, iconSize, (menuopt->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled); + + if(!pix.isNull()) + { + QRect iconRect = rect; + iconRect.setWidth(iconSize); + drawItemPixmap(p, iconRect, flags, pix); + rect.adjust(Constants::MenuBarItemSpacing + iconSize, 0, 0, 0); + } + + drawItemText(p, rect, flags, menuopt->palette, enabled, menuopt->text, textRole); + + return; + } + QProxyStyle::drawControl(control, opt, p, widget); }