// *****************************************************************************
// ��Ȩ���У�C��2023~2099 �Ϻ����ɳ������������޹�˾
// ��������Ȩ��
// *****************************************************************************
// ���� : ���
// �汾 : 1.0
// ����˵��:
//          ҡ��ҳ��
// *****************************************************************************
#include "JoystickPage.h"

JoystickPage::JoystickPage(QWidget* parent /*= nullptr*/)
    : QWidget(parent), m_radius(50), m_handlePos(0, 0), m_isPressed(false) 
{
    setFixedSize(m_radius * 2 + 20, m_radius * 2 + 20);
}

void JoystickPage::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // ����ҡ�˵���
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::gray);
    painter.drawEllipse(rect().center(), m_radius, m_radius);

    // ����ҡ���ֱ�
    painter.setBrush(m_isPressed ? Qt::red : Qt::blue);
    QPoint handleCenter = rect().center() + m_handlePos;
    painter.drawEllipse(handleCenter, m_radius / 3, m_radius / 3);

    if (QLineF(QPointF(0, 0), m_handlePos).length() > m_radius * 0.8)
    {
        painter.setBrush(Qt::red);
    }
    else 
    {
        painter.setBrush(m_isPressed ? Qt::darkBlue : Qt::blue);
    }
    ////����ҡ���еĴ�Բ
    //QPixmap bigCircle_Pixmap;
    //bigCircle_Pixmap.load(":/new/prefix1/image/max.png");
    //painter.drawPixmap(SmallCir_xy.x() - BIG_CIRCLE_RADIUS, SmallCir_xy.y() - BIG_CIRCLE_RADIUS, \
    //    BIG_CIRCLE_RADIUS * 2, BIG_CIRCLE_RADIUS * 2, bigCircle_Pixmap);

    ////����ҡ���е�СԲ
    //QPixmap smallCircle_Pixmap;
    //smallCircle_Pixmap.load(":/new/prefix1/image/min.png");
    //painter.drawPixmap(BigCir_xy.x() - SMALL_CIRCLE_RADIUS, BigCir_xy.y() - SMALL_CIRCLE_RADIUS, \
    //    SMALL_CIRCLE_RADIUS * 2, SMALL_CIRCLE_RADIUS * 2, smallCircle_Pixmap);
}

void JoystickPage::mousePressEvent(QMouseEvent* event)
{
    if (QLineF(rect().center(), event->pos()).length() <= m_radius) 
    {
        m_isPressed = true;
        updateHandlePosition(event->pos());
        update();
    }
}

void JoystickPage::mouseMoveEvent(QMouseEvent* event)
{
    if (m_isPressed) 
    {
        updateHandlePosition(event->pos());
        update();
    }
}

void JoystickPage::mouseReleaseEvent(QMouseEvent*)
{
    m_isPressed = false;
    m_handlePos = QPoint(0, 0);
    emit PositionChangedSignals(0, 0);
    update();
}

void JoystickPage::updateHandlePosition(const QPoint& pos)
{
    QPoint center = rect().center();
    QPointF delta = pos - center;
    qreal distance = QLineF(center, pos).length();

    if (distance > m_radius)
    {
        delta = delta * m_radius / distance;
    }

    m_handlePos = delta.toPoint();

    if (distance < m_deadZone)
    {
        m_handlePos = QPoint(0, 0);
        emit PositionChangedSignals(0, 0);
    }
    else
    {
        // ��һ����[-1, 1]��Χ
        qreal x = delta.x() / m_radius;
        qreal y = -delta.y() / m_radius; // Y�ᷴת��ʹ����Ϊ��

        emit PositionChangedSignals(x, y);
        //qDebug() << x << ":" << y;
    }
}