File indexing completed on 2024-05-12 16:02:09

0001 /* This file is part of the KDE project
0002    SPDX-FileCopyrightText: 2007 Marijn Kruisselbrink <mkruisselbrink@kde.org>
0003    SPDX-FileCopyrightText: 2007 Thomas Zander <zander@kde.org>
0004 
0005    SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "KoDockWidgetTitleBarButton.h"
0009 
0010 #include <WidgetsDebug.h>
0011 
0012 #include <QAbstractButton>
0013 #include <QAction>
0014 #include <QLabel>
0015 #include <QLayout>
0016 #include <QStyle>
0017 #include <QStylePainter>
0018 #include <QStyleOptionFrame>
0019 
0020 class Q_DECL_HIDDEN KoDockWidgetTitleBarButton::Private
0021 {
0022 public:
0023     Private() : styleSize(0, 0), iconSize(0) {}
0024     QSize styleSize;
0025     int iconSize;
0026 };
0027 
0028 KoDockWidgetTitleBarButton::KoDockWidgetTitleBarButton(QWidget *parent)
0029         : QAbstractButton(parent), d(new Private())
0030 {
0031     setFocusPolicy(Qt::NoFocus);
0032 }
0033 
0034 KoDockWidgetTitleBarButton::~KoDockWidgetTitleBarButton()
0035 {
0036     delete d;
0037 }
0038 
0039 QSize KoDockWidgetTitleBarButton::sizeHint() const
0040 {
0041     ensurePolished();
0042 
0043     const int margin = style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin, 0, this);
0044     if (icon().isNull()) {
0045         return QSize(18, 18);
0046     }
0047 
0048     int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this);
0049     if (iconSize != d->iconSize) {
0050         const_cast<KoDockWidgetTitleBarButton*>(this)->d->iconSize = iconSize;
0051         const QPixmap pm = icon().pixmap(iconSize);
0052         const_cast<KoDockWidgetTitleBarButton*>(this)->d->styleSize = QSize(pm.width() + margin, pm.height() + margin);
0053     }
0054     return d->styleSize;
0055 }
0056 
0057 QSize KoDockWidgetTitleBarButton::minimumSizeHint() const
0058 {
0059     return sizeHint();
0060 }
0061 
0062 // redraw the button when the mouse enters or leaves it
0063 void KoDockWidgetTitleBarButton::enterEvent(QEvent *event)
0064 {
0065     if (isEnabled())
0066         update();
0067     QAbstractButton::enterEvent(event);
0068 }
0069 
0070 void KoDockWidgetTitleBarButton::leaveEvent(QEvent *event)
0071 {
0072     if (isEnabled())
0073         update();
0074     QAbstractButton::leaveEvent(event);
0075 }
0076 
0077 void KoDockWidgetTitleBarButton::paintEvent(QPaintEvent *)
0078 {
0079     QPainter p(this);
0080 
0081     QStyleOptionToolButton opt;
0082     opt.initFrom(this);
0083     opt.state |= QStyle::State_AutoRaise;
0084 
0085     if (isEnabled() && underMouse() && !isChecked() && !isDown())
0086         opt.state |= QStyle::State_Raised;
0087     if (isChecked())
0088         opt.state |= QStyle::State_On;
0089     if (isDown())
0090         opt.state |= QStyle::State_Sunken;
0091     style()->drawPrimitive(QStyle::PE_PanelButtonTool, &opt, &p, this);
0092 
0093     opt.icon = icon();
0094     opt.features = QStyleOptionToolButton::None;
0095     opt.arrowType = Qt::NoArrow;
0096     int size = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this);
0097     opt.iconSize = QSize(size, size);
0098     style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, this);
0099 }