Warning, file /office/skrooge/skgbasegui/skgmenuitem.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /***************************************************************************
0002  * SPDX-FileCopyrightText: 2023 N. KRUPENKO krnekit@gmail.com
0003  * SPDX-License-Identifier: GPL-3.0-or-later
0004  ***************************************************************************/
0005 /** @file
0006  * This file is a widget that could be used in QWidgetAction and looks like a menu item.
0007  *
0008  * @author Nikita KRUPENKO
0009  */
0010 #include "skgmenuitem.h"
0011 
0012 #include <qapplication.h>
0013 #include <qpainter.h>
0014 #include <qstyleoption.h>
0015 
0016 #include "skgtraces.h"
0017 
0018 SKGMenuitem::SKGMenuitem(QWidget* iParent)
0019     : QWidget(iParent)
0020 {
0021     SKGTRACEINFUNC(5);
0022 
0023     setMouseTracking(true);
0024 }
0025 
0026 SKGMenuitem::~SKGMenuitem()
0027 {
0028     SKGTRACEINFUNC(5)
0029 }
0030 
0031 QString SKGMenuitem::getText() const
0032 {
0033     return m_text;
0034 }
0035 
0036 void SKGMenuitem::setText(const QString& iText)
0037 {
0038     if (m_text == iText) {
0039         return;
0040     }
0041 
0042     m_text = iText;
0043 
0044     emit textChanged(iText);
0045 
0046     update();
0047 }
0048 
0049 QIcon SKGMenuitem::getIcon() const
0050 {
0051     return m_icon;
0052 }
0053 
0054 void SKGMenuitem::setIcon(const QIcon& iIcon)
0055 {
0056     m_icon = iIcon;
0057 
0058     emit iconChanged(iIcon);
0059 
0060     update();
0061 }
0062 
0063 QColor SKGMenuitem::getColor() const
0064 {
0065     return m_color;
0066 }
0067 
0068 void SKGMenuitem::setColor(const QColor& iColor)
0069 {
0070     if (m_color == iColor) {
0071         return;
0072     }
0073 
0074     m_color = iColor;
0075 
0076     emit colorChanged(iColor);
0077 
0078     update();
0079 }
0080 
0081 bool SKGMenuitem::getIsBold() const
0082 {
0083     return m_isBold;
0084 }
0085 
0086 void SKGMenuitem::setIsBold(bool isBold)
0087 {
0088     if (m_isBold == isBold) {
0089         return;
0090     }
0091 
0092     m_isBold = isBold;
0093 
0094     emit isBoldChanged(isBold);
0095 
0096     update();
0097 }
0098 
0099 QSize SKGMenuitem::minimumSizeHint() const
0100 {
0101     QStyleOptionMenuItem opt;
0102     initStyleOption(&opt);
0103 
0104     QSize contentSize = fontMetrics().size(Qt::TextSingleLine/* | Qt::TextShowMnemonic*/, m_text);
0105     return style()->sizeFromContents(QStyle::CT_MenuItem, &opt, contentSize, this);
0106 }
0107 
0108 void SKGMenuitem::paintEvent(QPaintEvent* /*e*/)
0109 {
0110     QPainter p(this);
0111     QStyleOptionMenuItem opt;
0112     initStyleOption(&opt);
0113 
0114     style()->drawControl(QStyle::CE_MenuItem, &opt, &p, this);
0115 }
0116 
0117 void SKGMenuitem::initStyleOption(QStyleOptionMenuItem* option) const
0118 {
0119     option->initFrom(this);
0120     option->text = m_text;
0121     option->menuHasCheckableItems = false;
0122     option->icon = m_icon;
0123     option->maxIconWidth = style()->pixelMetric(QStyle::PM_SmallIconSize, option, this) + 4;    // Same as in QMenuPrivate
0124     option->menuItemType = QStyleOptionMenuItem::Normal;
0125     if (m_color.isValid()) {
0126         option->palette.setColor(QPalette::WindowText, m_color);
0127     }
0128     option->font.setBold(m_isBold);
0129 
0130     if (underMouse()) {
0131         option->state |= QStyle::State_Selected;
0132         if (QApplication::mouseButtons() != Qt::NoButton) {
0133             option->state |= QStyle::State_Sunken;
0134         }
0135     }
0136 }