
from PyQt5.QtWidgets import QWidget, QApplication,QMainWindow,QLabel,QTextEdit,QPushButton
from PyQt5.QtGui import QPixmap,QPainter,QResizeEvent,QCloseEvent,QPaintEvent,QFont
from PyQt5.QtCore import QSize,QTimer,QRect,Qt
import mqtt_async as mt
import message_pb2 as MSG
import google.protobuf.text_format as tf
from google.protobuf import json_format


class DirectBtn(QPushButton):
    def __init__(self, parent,text,type ,action):
        super().__init__(text,parent=parent)
        self.actionCallback=action
        self.type=type
        self.show()

    def mouseMoveEvent(self, e):
        pass

    def mousePressEvent(self, e):
        self.actionCallback(self.type,"press")

    def mouseReleaseEvent(self, e) -> None:
        self.actionCallback(self.type,"stop")

    def enterEvent(self, a0):
        return super().enterEvent(a0)

    def leaveEvent(self, a0):
        #self.actionCallback(self.type,"stop")
        return super().leaveEvent(a0)

class Frame(QMainWindow):
    def __init__(self):
        super(Frame, self).__init__()

        self.mtclient=mt.MqttAsync("pyTool")
        self.mtclient.connect("192.168.2.132",1883,"admin","zx123456")
        self.v=0
        self.vth=0
        self.InitUI()


    def InitUI(self):
        self.label_ip=QLabel(self)
        self.edit_ip=QTextEdit(self)
        self.label_port = QLabel(self)
        self.edit_port=QTextEdit(self)

        self.btnConnect=QPushButton(self)
        self.btnConnect.clicked.connect(self.ConnectAction)

        #self.car_number_txt.setStyleSheet("border-width:1px;border-style:solid;border-color:rgb(150,150,150)")
        self.label_ip.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.label_port.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.label_ip.setStyleSheet("color:blue")
        self.label_port.setStyleSheet("color:blue")

        self.label_ip.setText("IP:")
        self.edit_ip.setText("192.168.2.132")
        self.label_ip.setGeometry(10, 10, 50, 30)
        self.edit_ip.setGeometry(70, 10, 150, 30)

        self.label_port.setText("端口:")
        self.edit_port.setText("1883")
        self.label_port.setGeometry(10, 45, 50, 30)
        self.edit_port.setGeometry(70, 45, 150, 30)

        self.btnConnect.setGeometry(230, 10, 100, 65)
        self.btnConnect.setText("连接")


        self.label_v=QLabel(self)
        self.edit_v=QTextEdit(self)
        self.label_vth = QLabel(self)
        self.edit_vth=QTextEdit(self)

        self.btnChangeSpeed=QPushButton(self)
        self.btnChangeSpeed.clicked.connect(self.ChangeSpeedAction)

        #self.car_number_txt.setStyleSheet("border-width:1px;border-style:solid;border-color:rgb(150,150,150)")
        self.label_v.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.label_vth.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.label_v.setStyleSheet("color:blue")
        self.label_vth.setStyleSheet("color:blue")

        self.label_v.setText("线速度:")
        self.label_v.setGeometry(10, 210, 50, 30)
        self.edit_v.setGeometry(70, 210, 150, 30)

        self.label_vth.setText("角速度:")
        self.label_vth.setGeometry(10, 245, 50, 30)
        self.edit_vth.setGeometry(70, 245, 150, 30)

        self.btnChangeSpeed.setGeometry(230, 210, 100, 65)
        self.btnChangeSpeed.setText("变速")


        ###
        self.btnRotation=DirectBtn(self,"逆时针","LR",self.monitorAction)
        self.btnRotation.setGeometry(450, 150, 60, 60)

        self.btnRotation=DirectBtn(self,"顺时针","RR",self.monitorAction)
        self.btnRotation.setGeometry(600, 150, 60, 60)

        self.btnRotation=DirectBtn(self,"前进","UP",self.monitorAction)
        self.btnRotation.setGeometry(520, 150, 70, 60)

        self.btnRotation=DirectBtn(self,"后退","DOWN",self.monitorAction)
        self.btnRotation.setGeometry(520, 250, 70, 60)


    def ConnectAction(self):
        self.btnConnect.setStyleSheet("color:yellow")
        self.btnConnect.setText("连接中")
        self.btnConnect.setStyleSheet("color:green")

    def ChangeSpeedAction(self):
        self.btnChangeSpeed.setStyleSheet("color:yellow")
        self.btnChangeSpeed.setText("变速")
        self.btnChangeSpeed.setStyleSheet("color:green")

    def monitorAction(self,type,action):
        if type=="LR":  #逆时针旋转
            if action=="press":
                self.v=0
                self.vth=0.1
                print("逆时针旋转")
            else:
                self.v=0
                self.vth=0
                print("停止旋转")
        if type=="RR":  #顺时针旋转
            if action=="press":
                self.v=0
                self.vth=-0.1
                print("顺时针旋转")
            else:
                self.v=0
                self.vth=0
                print("停止旋转")
        if type=="UP":
            if action=="press":
                self.v=0.2
                self.vth=0
                print("前进")
            else:
                self.v=0
                self.vth=0
                print("停止前进")
        if type=="DOWN":
            if action=="press":
                self.v=-0.2
                self.vth=0
                print("后退")
            else:
                self.v=0
                self.vth=0
                print("停止后退")

        cmd=MSG.ChangeSpeedCmd()
        cmd.v=self.v
        cmd.vth=self.vth

        msg=json_format.MessageToJson(cmd,True)
        self.mtclient.publish("cmd1",msg)
        '''if type=="TL":  #左转弯
            if action=="press":
                print("左转弯")
            else:
                print("停止左转弯")
        if type=="TR":  #右转弯
            if action=="press":
                print("右转弯")
            else:
                print("停止右转弯")'''

    def closeEvent(self, a0: QCloseEvent) -> None:
        pass
    def resizeEvent(self, a0: QResizeEvent) -> None:
        pass
        '''w, h = a0.size().width(), a0.size().height()
        w, h = self.size().width(), self.size().height()
        top_w, top_h = w, int(h * 0.15)
        car_number_w,car_number_h=w, int(h * 0.10)
        txt_w, txt_h = w, int(h * 0.20)
        arrow_w, arrow_h = w, int(h * 0.55)
        font = QFont()
        font.setBold(True)
        font.setPixelSize(int(w / 40))
        self.measure_info_txt.setFont(font)
        self.measure_info_txt.setGeometry(0, 0, top_w, top_h)
        font.setPixelSize(int(w / 20))
        self.car_number_txt.setFont(font)
        self.car_number_txt.setGeometry(0, top_h, car_number_w, car_number_h)

        self.panel_txt.setGeometry(0, top_h+car_number_h, txt_w, txt_h)
        self.panel_arrow.setGeometry(0, top_h +car_number_h+ txt_h, arrow_w, arrow_h)'''





