culturered_client/TouchScreen/IrregularButton.cpp
2024-09-07 11:34:44 +08:00

164 lines
4.1 KiB
C++

#include "IrregularButton.h"
#include <QCoreApplication>
#include "MainWindow.h"
#include "TownImageWidget.h"
IrregularButton::IrregularButton(QWidget* parent /*= nullptr*/)
: QPushButton(parent)
{
setObjectName("IrregularButton");
InitParentWidgetSlot(parent);
//setAttribute(Qt::WA_TranslucentBackground);
}
IrregularButton::IrregularButton(const QString& text, QWidget* parent /*= nullptr*/)
: QPushButton(text, parent) {
setObjectName("IrregularButton");
InitParentWidgetSlot(parent);
//setAttribute(Qt::WA_TranslucentBackground);
}
IrregularButton::IrregularButton(const QIcon& icon, const QString& text, QWidget* parent /*= nullptr*/)
: QPushButton(icon, text, parent)
{
setObjectName("IrregularButton");
InitParentWidgetSlot(parent);
//setAttribute(Qt::WA_TranslucentBackground);
}
void IrregularButton::OnEmitEnter() {
auto dt = static_cast<int32_t>(m_detailedType);
MediaInfo item;
if (!MainWindow::Get().GetMediaInfo(dt, m_btnName, item)) {
qDebug() << "not get item: " << dt << " or text: " << m_btnName;
return;
}
int x = 0, y = 0;
QRect rect = geometry();
if (item.start == 0) {
x = rect.width() + rect.x();
y = rect.y() + rect.height() / 2;
}
else if (item.start == 1) {
x = rect.x() + rect.width() / 2;
y = rect.y(); // +rect.height() / 2;
}
else {
x = rect.x();
y = rect.y() + rect.height() / 2;
}
QPointF end = GetEndPoint(item.end);
emit Enter(QPointF(x, y), end);
}
//
//void IrregularButton::enterEvent(QEnterEvent* event) {
// QPushButton::enterEvent(event);
//
// auto dt = static_cast<int32_t>(m_detailedType);
// MediaInfo item;
// if (!MainWindow::Get().GetMediaInfo(dt, m_btnName, item)) {
// qDebug() << "not get item: " << dt << " or text: " << m_btnName;
// return;
// }
//
// int x = 0, y = 0;
// QRect rect = geometry();
// if (item.start == 0) {
// x = rect.width() + rect.x();
// y = rect.y() + rect.height() / 2;
// }
// else if (item.start == 1) {
// x = rect.x() + rect.width() / 2;
// y = rect.y(); // +rect.height() / 2;
// }
// else {
// x = rect.x();
// y = rect.y() + rect.height() / 2;
// }
//
// QPointF end = GetEndPoint(item.end);
// emit Enter(QPointF(x, y), end);
//}
//
//void IrregularButton::leaveEvent(QEvent* event) {
// QPushButton::leaveEvent(event);
// emit Leave();
//}
bool IrregularButton::event(QEvent* e) {
switch (e->type()) {
case QEvent::TouchBegin:
{
m_bTouchEnd = false;
QMouseEvent mouseEvent(QEvent::MouseButtonPress, QPointF(0, 0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QCoreApplication::sendEvent(this, &mouseEvent);
e->accept();
return true;
} break;
case QEvent::TouchEnd:
{
QMouseEvent mouseEvent(QEvent::MouseButtonRelease, QPointF(0, 0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QCoreApplication::sendEvent(this, &mouseEvent);
m_bTouchEnd = true;
e->accept();
return true;
} break;
case QEvent::MouseButtonPress:
case QEvent::MouseButtonRelease:
{
if (m_bTouchEnd) {
e->accept();
return true;
}
}break;
default:
break;
}
return QPushButton::event(e);
}
void IrregularButton::mousePressEvent(QMouseEvent* e) {
QPushButton::mousePressEvent(e);
OnEmitEnter();
update();
}
void IrregularButton::mouseReleaseEvent(QMouseEvent* e) {
emit Leave();
update();
QPushButton::mouseReleaseEvent(e);
MainWindow::Get().PlayAudio();
}
QPointF IrregularButton::GetEndPoint(const QPointF& target) {
QRect rect = geometry();
const QRect& widgetRect = parentWidget()->geometry();
QPoint pt = widgetRect.topLeft();
QPointF ptf = target;
auto minValue = [](float x) {
return x > 0.0f ? x : 0.0f;
};
return { minValue(ptf.x()), minValue(ptf.y()) };
}
void IrregularButton::InitParentWidgetSlot(QWidget* parent) {
TownImageWidget* imageWidget = dynamic_cast<TownImageWidget*>(parent);
if (nullptr == imageWidget) {
return;
}
connect(this, &IrregularButton::Enter, imageWidget, &TownImageWidget::OnBeginDraw);
connect(this, &IrregularButton::Leave, imageWidget, &TownImageWidget::OnEndDraw);
}