Add handling to both RDStyle and RDTweakedNativeStyle for menus w/ icons

This commit is contained in:
baldurk
2017-12-19 12:26:33 +00:00
parent da650b0481
commit 67090cc085
2 changed files with 108 additions and 5 deletions
+36 -5
View File
@@ -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);
}