mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-06 06:19:52 +08:00
135 lines
3.2 KiB
C++
135 lines
3.2 KiB
C++
#include "vbuttonwithwidget.h"
|
|
|
|
#include <QMenu>
|
|
#include <QDragEnterEvent>
|
|
#include <QDropEvent>
|
|
#include <QMimeData>
|
|
#include <QRect>
|
|
#include <QPainter>
|
|
#include <QPainterPath>
|
|
#include <QBrush>
|
|
|
|
VButtonWithWidget::VButtonWithWidget(QWidget *p_widget,
|
|
QWidget *p_parent)
|
|
: QPushButton(p_parent), m_popupWidget(p_widget)
|
|
{
|
|
init();
|
|
}
|
|
|
|
VButtonWithWidget::VButtonWithWidget(const QString &p_text,
|
|
QWidget *p_widget,
|
|
QWidget *p_parent)
|
|
: QPushButton(p_text, p_parent), m_popupWidget(p_widget)
|
|
{
|
|
init();
|
|
}
|
|
|
|
VButtonWithWidget::VButtonWithWidget(const QIcon &p_icon,
|
|
const QString &p_text,
|
|
QWidget *p_widget,
|
|
QWidget *p_parent)
|
|
: QPushButton(p_icon, p_text, p_parent), m_popupWidget(p_widget)
|
|
{
|
|
init();
|
|
}
|
|
|
|
void VButtonWithWidget::init()
|
|
{
|
|
m_popupWidget->setParent(this);
|
|
|
|
m_bubbleFg = QColor(Qt::white);
|
|
m_bubbleBg = QColor("#15AE67");
|
|
|
|
QMenu *menu = new QMenu(this);
|
|
QWidgetAction *act = new QWidgetAction(menu);
|
|
act->setDefaultWidget(m_popupWidget);
|
|
menu->addAction(act);
|
|
connect(menu, &QMenu::aboutToShow,
|
|
this, [this]() {
|
|
emit popupWidgetAboutToShow(m_popupWidget);
|
|
});
|
|
|
|
setMenu(menu);
|
|
|
|
VButtonPopupWidget *popup = getButtonPopupWidget();
|
|
if (popup) {
|
|
popup->setButton(this);
|
|
setAcceptDrops(popup->isAcceptDrops());
|
|
connect(this, &VButtonWithWidget::popupWidgetAboutToShow,
|
|
this, [this]() {
|
|
getButtonPopupWidget()->handleAboutToShow();
|
|
});
|
|
}
|
|
}
|
|
|
|
QWidget *VButtonWithWidget::getPopupWidget() const
|
|
{
|
|
return m_popupWidget;
|
|
}
|
|
|
|
void VButtonWithWidget::showPopupWidget()
|
|
{
|
|
showMenu();
|
|
}
|
|
|
|
void VButtonWithWidget::dragEnterEvent(QDragEnterEvent *p_event)
|
|
{
|
|
VButtonPopupWidget *popup = getButtonPopupWidget();
|
|
Q_ASSERT(popup);
|
|
|
|
if (popup->handleDragEnterEvent(p_event)) {
|
|
return;
|
|
}
|
|
|
|
QPushButton::dragEnterEvent(p_event);
|
|
}
|
|
|
|
void VButtonWithWidget::dropEvent(QDropEvent *p_event)
|
|
{
|
|
VButtonPopupWidget *popup = getButtonPopupWidget();
|
|
Q_ASSERT(popup);
|
|
|
|
if (popup->handleDropEvent(p_event)) {
|
|
return;
|
|
}
|
|
|
|
QPushButton::dropEvent(p_event);
|
|
}
|
|
|
|
void VButtonWithWidget::paintEvent(QPaintEvent *p_event)
|
|
{
|
|
QPushButton::paintEvent(p_event);
|
|
|
|
if (!isEnabled() || m_bubbleStr.isEmpty()) {
|
|
return;
|
|
}
|
|
|
|
QRect re = rect();
|
|
int bubbleWidth = re.width() * 3.0 / 7;
|
|
int x = re.width() - bubbleWidth;
|
|
int y = 0;
|
|
QRect bubbleRect(x, y, bubbleWidth, bubbleWidth);
|
|
|
|
QPainter painter(this);
|
|
QPainterPath bgPath;
|
|
bgPath.addEllipse(bubbleRect);
|
|
painter.fillPath(bgPath, m_bubbleBg);
|
|
|
|
QFont font = painter.font();
|
|
font.setPixelSize(bubbleWidth / 1.3);
|
|
painter.setFont(font);
|
|
painter.setPen(m_bubbleFg);
|
|
painter.drawText(bubbleRect, Qt::AlignCenter, m_bubbleStr);
|
|
}
|
|
|
|
void VButtonWithWidget::setBubbleNumber(int p_num)
|
|
{
|
|
if (p_num < 0) {
|
|
m_bubbleStr.clear();
|
|
} else {
|
|
m_bubbleStr = QString::number(p_num);
|
|
}
|
|
|
|
update();
|
|
}
|