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 }