24#include <QApplication>
25#include <QLinearGradient>
26#include <QStylePainter>
27#include <QStyleOptionToolButton>
28#include <QResizeEvent>
38class TTOverlayToolButton :
public QToolButton
41 TTOverlayToolButton(QWidget* parent) : QToolButton(parent)
43 setAttribute(Qt::WA_NoSystemBackground);
44 setAttribute(Qt::WA_TranslucentBackground);
45 setAttribute(Qt::WA_TransparentForMouseEvents);
46 parent->installEventFilter(
this);
53 bool eventFilter(QObject* obj, QEvent* ev)
override
57 if (ev->type() == QEvent::Resize)
58 resize(
static_cast<QResizeEvent*
>(ev)->size());
59 else if (ev->type() == QEvent::ChildAdded)
62 return QWidget::eventFilter(obj, ev);
65 void paintEvent(QPaintEvent*)
override
70 QStylePainter sp(
this);
71 QStyleOptionToolButton opt;
72 initStyleOption(&opt);
73 opt.state |= QStyle::State_MouseOver | QStyle::State_AutoRaise | QStyle::State_Raised;
74 opt.activeSubControls |= QStyle::SC_ToolButton;
75 sp.drawComplexControl(QStyle::CC_ToolButton, opt);
79class TTHover :
public QObject
82 TTHover(tt::CompactToolButton* parent, QToolButton* up, QToolButton* down) :
91 bool eventFilter(QObject* watched, QEvent* event)
override
93 if(event->type() == QEvent::HoverLeave)
95 toolButton->SetHover(
false);
97 else if(event->type() == QEvent::HoverEnter)
99 if(watched == upButton || watched == downButton)
100 toolButton->SetHover(upButton->isEnabled());
102 if(watched == upButton)
104 if(event->type() == QEvent::Hide)
106 else if(event->type() == QEvent::Show)
108 else if(event->type() == QEvent::EnabledChange)
110 downButton->setEnabled(upButton->isEnabled());
111 toolButton->SetHover(upButton->isEnabled() && upButton->underMouse());
114 return QObject::eventFilter(watched, event);
118 tt::CompactToolButton* toolButton;
119 QToolButton* upButton;
120 QToolButton* downButton;
130 overlay =
new TTOverlayToolButton(
this);
134 upButton->setProperty(
"TTInternal", QVariant(
true));
137 upButton->setIconSize(QSize(iconSize, iconSize));
138 upButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
140 upButton->setMaximumHeight(iconSize + 5);
142 QVBoxLayout* l =
new QVBoxLayout(
this);
143 l->setContentsMargins(0, 0, 0, 0);
145 l->setDirection(QBoxLayout::TopToBottom);
147 upButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
148 upButton->setPopupMode(QToolButton::DelayedPopup);
152 downButton->setProperty(
"TTInternal", QVariant(
true));
154 downButton->setToolButtonStyle(Qt::ToolButtonTextOnly);
155 downButton->setPopupMode(QToolButton::InstantPopup);
157 downButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
165 QObject::connect(menu, &QMenu::aboutToHide,
this, [
this]{
SetHover(
false); });
171 upButton->installEventFilter(hover);
177 static_cast<TTOverlayToolButton*
>(
overlay)->paint = hover;
int GetPixelMetric(QStyle::PixelMetric metric)
float GetScaleFactor(const QWidget &widget)