#include "customTab.h"
#include "customTabBar.h"
#include "dashboard.h"
#include "dashboardFrame.h"
#include <QLabel>
#include <QBoxLayout>
#include <QMouseEvent>
#include <QDrag>
#include <QMimeData>
#include <QApplication>

CustomTab::CustomTab(QWidget* parent)
    :QFrame(parent)
{
    setContextMenuPolicy(Qt::CustomContextMenu);
    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    setStyleSheet("QLabel{\n"
                  "   color:rgb(250,250,250);\n"
                  "   font:600 11pt \"微软雅黑\";\n"
                  "   border:0px;\n"
                  "   background-color:transparent;\n"
                  "}\n");

    m_pDashboard = nullptr;

    m_bLeftButtonPressed = false;
    m_bDragging = false;

    m_pTitle = new QLabel(this);
    m_pTitle->setAlignment(Qt::AlignCenter);

    m_IconSize = QSize(15,15);
    m_pIconLabel = new QLabel(this);
    m_pIconLabel->setMinimumSize(m_IconSize);
    m_pIconLabel->setMaximumSize(m_IconSize);
    QBoxLayout* iconLayout = new QBoxLayout(QBoxLayout::TopToBottom);
    iconLayout->setContentsMargins(0, 1, 0, 0);
    iconLayout->addWidget(m_pIconLabel);
    QSpacerItem* spacer = new QSpacerItem(10, 40, QSizePolicy::Policy::Minimum, QSizePolicy::Policy::Expanding);
    iconLayout->addSpacerItem(spacer);

    m_pLayout = new QBoxLayout(QBoxLayout::LeftToRight);
    m_pLayout->setContentsMargins(15, 0, 0, 0);
    m_pLayout->setSpacing(1);
    m_pLayout->addWidget(m_pTitle);
    m_pLayout->addLayout(iconLayout);
    setLayout(m_pLayout);
}

CustomTab::~CustomTab()
{
}

void CustomTab::mousePressEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton)
    {
        emit clicked();
        m_pStartPos = event->pos();
        m_bLeftButtonPressed = true;
    }

    QFrame::mousePressEvent(event);
}
void CustomTab::mouseMoveEvent(QMouseEvent* event)
{
    if(m_bLeftButtonPressed && !m_bDragging)
    {
        //qDebug() << "dragging";
        int distance = (event->pos() - m_pStartPos).manhattanLength();
        if (distance >= QApplication::startDragDistance())
        {
            QPoint hotSpot = event->pos();

            QByteArray data;
            QDataStream dataStream(&data, QIODevice::WriteOnly);
            dataStream << text() << m_pDashboard->frame()->objectName();

            QMimeData *mimeData = new QMimeData;
            mimeData->setData("dragData/customTab", data);

            QDrag* drag = new QDrag(this);
            drag->setMimeData(mimeData);
            drag->setPixmap(grab()); //通过render绘制的pixmap会有噪点，直接通过grab获取效果更好
            drag->setHotSpot(hotSpot);

            m_bDragging = true;
            Qt::DropAction dropAction = drag->exec();
            //qDebug() << dropAction;
            //exec之后的语句都会在drg操作完成之后(鼠标抬起)执行
            delete drag;
            m_bLeftButtonPressed = false;
            m_bDragging = false;

            if(dropAction == Qt::IgnoreAction) //创建新的dvieSecondaryWindow
            {
                //qDebug() << "create dvieSecondaryWindow on" << QCursor::pos();
                m_pDashboard->frame()->moveDashboardToNewDVIEWindow(text(), QCursor::pos());
            }
        }
    }

    QFrame::mouseMoveEvent(event);
}
void CustomTab::mouseReleaseEvent(QMouseEvent* event)
{
    //如果没有拖动事件发生，在这里处理相关逻辑
    m_bLeftButtonPressed = false;
    QFrame::mouseReleaseEvent(event);
}

void CustomTab::setActive(bool bActive)
{
    QString strStyleSheet = "";
    if(bActive)
        strStyleSheet = "QFrame{\n"
                        "   border-bottom:3px solid rgb(67,160,249);\n"
                        "}\n"
                        "QFrame:hover{\n"
                        "   background-color:rgba(60, 60, 60, 150);\n"
                        "}\n"
                        "QLabel{\n"
                        "   color:rgb(250,250,250);\n"
                        "   font:600 11pt \"微软雅黑\";\n"
                        "   border:0px;\n"
                        "}\n"
                        "QLabel:hover{\n"
                        "   background-color:transparent;"
                        "}\n";
    else
        strStyleSheet = "QFrame{\n"
                        "   border-bottom:0px;\n"
                        "}\n"
                        "QFrame:hover{\n"
                        "   background-color:rgba(60, 60, 60, 150);\n"
                        "}\n"
                        "QLabel{\n"
                        "   color:rgb(250,250,250);\n"
                        "   font:600 11pt \"微软雅黑\";\n"
                        "   border:0px;\n"
                        "}\n"
                        "QLabel:hover{\n"
                        "   background-color:transparent;\n"
                        "}\n";
    setStyleSheet(strStyleSheet);
}

void CustomTab::setText(const QString& strTitle)
{
    m_pTitle->setText(strTitle);

    QFontMetrics metrics(m_pTitle->font());
    // QRect rect = metrics.boundingRect(m_pTitle->text());
    // m_pTitle->setMinimumSize(rect.width() + 12, 0);
    // m_pTitle->setMaximumSize(rect.width() + 12, 1660);
    int textWidth = metrics.horizontalAdvance(strTitle);
    m_pTitle->setMinimumSize(textWidth + 12, 0);
    m_pTitle->setMaximumSize(textWidth + 12, 1660);

    setObjectName("dashboardTab_" + strTitle);
}
QString CustomTab::text()
{
    return m_pTitle->text();
}

void CustomTab::setIcon(const QIcon& icon)
{
    if(icon.isNull())
        m_pIconLabel->clear();
    else
        m_pIconLabel->setPixmap(icon.pixmap(m_IconSize));
}

void CustomTab::setDashboard(Dashboard* dashboard)
{
    m_pDashboard = dashboard;
}
Dashboard* CustomTab::dashboard()
{
    return m_pDashboard;
}

