mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-04 22:01:07 +00:00
Add handling to both RDStyle and RDTweakedNativeStyle for menus w/ icons
This commit is contained in:
@@ -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<const QStyleOptionMenuItem *>(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<const QStyleOptionMenuItem *>(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);
|
||||
|
||||
@@ -28,6 +28,13 @@
|
||||
#include <QPen>
|
||||
#include <QStyleOption>
|
||||
|
||||
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<const QStyleOptionMenuItem *>(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<const QStyleOptionMenuItem *>(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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user