forked from mirror/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