#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件    :my_chart_view.py
@时间    :2022/03/14 12:31:02
@作者    :None
@版本    :1.0
@说明    : 重写QChartView 方法，增加缩放功能
'''


from math import pow
from utils. qt import Qt, QChartView, QPoint, QPointF


class MyChartView(QChartView):
    m_bMiddleButtonPressed = 0
    m_oPrePos = QPoint()

    def __init__(self, parent=None):
        super(MyChartView, self).__init__(parent)

    def mouseMoveEvent(self, event):
        if self.m_bMiddleButtonPressed:
            oDeltaPos = event.pos() - self.m_oPrePos
            self.chart().scroll(-oDeltaPos.x(), 0)
            self.m_oPrePos = event.pos()
        super(MyChartView, self).mouseMoveEvent(event)

    def mousePressEvent(self, event):
        if event.button() == Qt.MiddleButton:
            self.m_bMiddleButtonPressed = True
            self.m_oPrePos = event.pos()
            self.setCursor(Qt.OpenHandCursor)
        super(MyChartView, self).mousePressEvent(event)

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.MiddleButton:
            self.m_bMiddleButtonPressed = False
            self.setCursor(Qt.ArrowCursor)
        super(MyChartView, self).mouseReleaseEvent(event)

    def wheelEvent(self, event):
        # 设置比例
        rVal = pow(0.999, event.delta())
        # 1. 读取视图基本信息
        oPlotAreaRect = self.chart().plotArea()
        oCenterPoint = oPlotAreaRect.center()
        # 2. 水平调整
        oPlotAreaRect.setWidth(oPlotAreaRect.width() * rVal)
        # 3. 竖直调整
        oPlotAreaRect.setHeight(oPlotAreaRect.height() * rVal)
        # 4.1 计算视点，视点不变，围绕中心缩放
        # QPointF oNewCenterPoint(oCenterPoint);
        #  4.2 计算视点，让鼠标点击的位置移动到窗口中心
        # QPointF oNewCenterPoint(pEvent->pos());
        #  4.3 计算视点，让鼠标点击的位置尽量保持不动(等比换算，存在一点误差)
        oNewCenterPoint = QPointF(2 * oCenterPoint - event.pos() - (oCenterPoint - event.pos()) / rVal)
        #  5. 设置视点
        oPlotAreaRect.moveCenter(oNewCenterPoint)
        #  6. 提交缩放调整
        self.chart().zoomIn(oPlotAreaRect)
        super(MyChartView, self).wheelEvent(event)
