mirror of https://github.com/Nheko-Reborn/nheko
parent
8e15a5080d
commit
845228ac6a
@ -0,0 +1,26 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include "RaisedButton.h" |
||||||
|
|
||||||
|
constexpr int DIAMETER = 40; |
||||||
|
constexpr int ICON_SIZE = 18; |
||||||
|
|
||||||
|
constexpr int OFFSET_X = 30; |
||||||
|
constexpr int OFFSET_Y = 20; |
||||||
|
|
||||||
|
class FloatingButton : public RaisedButton |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
FloatingButton(const QIcon &icon, QWidget *parent = nullptr); |
||||||
|
|
||||||
|
QSize sizeHint() const override { return QSize(DIAMETER, DIAMETER); }; |
||||||
|
QRect buttonGeometry() const; |
||||||
|
|
||||||
|
protected: |
||||||
|
bool event(QEvent *event) override; |
||||||
|
bool eventFilter(QObject *obj, QEvent *event) override; |
||||||
|
|
||||||
|
void paintEvent(QPaintEvent *event) override; |
||||||
|
}; |
After Width: | Height: | Size: 698 B |
After Width: | Height: | Size: 1013 B |
@ -0,0 +1,95 @@ |
|||||||
|
#include <QPainterPath> |
||||||
|
|
||||||
|
#include "FloatingButton.h" |
||||||
|
|
||||||
|
FloatingButton::FloatingButton(const QIcon &icon, QWidget *parent) |
||||||
|
: RaisedButton(parent) |
||||||
|
{ |
||||||
|
setFixedSize(DIAMETER, DIAMETER); |
||||||
|
setGeometry(buttonGeometry()); |
||||||
|
|
||||||
|
if (parentWidget()) |
||||||
|
parentWidget()->installEventFilter(this); |
||||||
|
|
||||||
|
setFixedRippleRadius(50); |
||||||
|
setIcon(icon); |
||||||
|
raise(); |
||||||
|
} |
||||||
|
|
||||||
|
QRect |
||||||
|
FloatingButton::buttonGeometry() const |
||||||
|
{ |
||||||
|
QWidget *parent = parentWidget(); |
||||||
|
|
||||||
|
if (!parent) |
||||||
|
return QRect(); |
||||||
|
|
||||||
|
return QRect(parent->width() - (OFFSET_X + DIAMETER), |
||||||
|
parent->height() - (OFFSET_Y + DIAMETER), |
||||||
|
DIAMETER, |
||||||
|
DIAMETER); |
||||||
|
} |
||||||
|
|
||||||
|
bool |
||||||
|
FloatingButton::event(QEvent *event) |
||||||
|
{ |
||||||
|
if (!parent()) |
||||||
|
return RaisedButton::event(event); |
||||||
|
|
||||||
|
switch (event->type()) { |
||||||
|
case QEvent::ParentChange: { |
||||||
|
parent()->installEventFilter(this); |
||||||
|
setGeometry(buttonGeometry()); |
||||||
|
break; |
||||||
|
} |
||||||
|
case QEvent::ParentAboutToChange: { |
||||||
|
parent()->installEventFilter(this); |
||||||
|
break; |
||||||
|
} |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
return RaisedButton::event(event); |
||||||
|
} |
||||||
|
|
||||||
|
bool |
||||||
|
FloatingButton::eventFilter(QObject *obj, QEvent *event) |
||||||
|
{ |
||||||
|
const QEvent::Type type = event->type(); |
||||||
|
|
||||||
|
if (QEvent::Move == type || QEvent::Resize == type) |
||||||
|
setGeometry(buttonGeometry()); |
||||||
|
|
||||||
|
return RaisedButton::eventFilter(obj, event); |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
FloatingButton::paintEvent(QPaintEvent *event) |
||||||
|
{ |
||||||
|
Q_UNUSED(event); |
||||||
|
|
||||||
|
QRect square = QRect(0, 0, DIAMETER, DIAMETER); |
||||||
|
square.moveCenter(rect().center()); |
||||||
|
|
||||||
|
QPainter p(this); |
||||||
|
p.setRenderHints(QPainter::Antialiasing); |
||||||
|
|
||||||
|
QBrush brush; |
||||||
|
brush.setStyle(Qt::SolidPattern); |
||||||
|
brush.setColor(backgroundColor()); |
||||||
|
|
||||||
|
p.setBrush(brush); |
||||||
|
p.setPen(Qt::NoPen); |
||||||
|
p.drawEllipse(square); |
||||||
|
|
||||||
|
QRect iconGeometry(0, 0, ICON_SIZE, ICON_SIZE); |
||||||
|
iconGeometry.moveCenter(square.center()); |
||||||
|
|
||||||
|
QPixmap pixmap = icon().pixmap(QSize(ICON_SIZE, ICON_SIZE)); |
||||||
|
QPainter icon(&pixmap); |
||||||
|
icon.setCompositionMode(QPainter::CompositionMode_SourceIn); |
||||||
|
icon.fillRect(pixmap.rect(), foregroundColor()); |
||||||
|
|
||||||
|
p.drawPixmap(iconGeometry, pixmap); |
||||||
|
} |
Loading…
Reference in new issue