# -*- coding: utf-8 -*-
from PyQt5 import QtGui,QtCore,uic,QtOpenGL, QtWidgets
import time
import math
import SymbolScene
from db.SymbolAttr import SymbolAttr

class SymbolView(QtWidgets.QGraphicsView):
	def __init__(self, *args):
		super(SymbolView, self).__init__(*args)
		from UIManager import UIManager
		self.setScene(UIManager.instance().getSymbolScene())


		self.setViewportUpdateMode(QtWidgets.QGraphicsView.FullViewportUpdate)
		self.setCacheMode(QtWidgets.QGraphicsView.CacheNone)
		#self.setDragMode(QtWidgets.QGraphicsView.RubberBandDrag)
		self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
		self.setMouseTracking(True)
		self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
		self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
		self.setAcceptDrops(True)
		self.setViewport(QtOpenGL.QGLWidget())

		self.centerPnt = QtCore.QPointF()
		self.scale(0.6,0.6)

		self.mousePressPnt = None
		self.mouseCurPnt = None
		self.isFrameSelectMode = False

	def mousePressEvent(self, event):
		self.mouseCurPnt = self.mousePressPnt = event.pos()

		item = self.itemAt(self.mousePressPnt)
		self.isFrameSelectMode = (not item)
		super(SymbolView, self).mousePressEvent(event)

	def mouseMoveEvent(self, event):
		if self.isFrameSelectMode:
			self.mouseCurPnt = event.pos()

		super(SymbolView,self).mouseMoveEvent(event)
		self.viewport().update()

	def mouseReleaseEvent(self, event):
		self.mouseCurPnt = event.pos()
		if self.isFrameSelectMode:
			topLeftX = min(self.mousePressPnt.x(), self.mouseCurPnt.x())
			topLeftY = min(self.mousePressPnt.y(), self.mouseCurPnt.y())
			width = abs(self.mousePressPnt.x()-self.mouseCurPnt.x())
			height= abs(self.mousePressPnt.y()-self.mouseCurPnt.y())
			self.isFrameSelectMode = False
			itemList = self.items(topLeftX, topLeftY, width, height)

			self.scene().clearSelection()
			for item in itemList:
				item.setSelected(True)

		super(SymbolView, self).mouseReleaseEvent(event)

	def wheelEvent(self, event):
		posScene = self.mapToScene(event.pos())
		factor = 1.001 ** event.delta()
		self.scale(factor, factor)

		posMouse = self.mapFromScene(posScene)
		mov = posMouse - event.pos()
		self.horizontalScrollBar().setValue(mov.x() + self.horizontalScrollBar().value())
		self.verticalScrollBar().setValue(mov.x() + self.verticalScrollBar().value())

		self.centerPnt = self.mapToScene(self.viewport().rect().center())

	def drawForeground(self, painter, rectF):
		super(SymbolView, self).drawForeground(painter, rectF)
		if self.isFrameSelectMode and self.mousePressPnt and self.mouseCurPnt:
			topLeftX = min(self.mousePressPnt.x(), self.mouseCurPnt.x())
			topLeftY = min(self.mousePressPnt.y(), self.mouseCurPnt.y())
			width = abs(self.mousePressPnt.x()-self.mouseCurPnt.x())
			height= abs(self.mousePressPnt.y()-self.mouseCurPnt.y())

			painter.setPen(QtGui.QPen(QtGui.QColor(100,164,230),1.0))
			painter.setBrush(QtGui.QBrush(QtGui.QColor(100,164,230,100)))
			painter.setTransform(QtWidgets.QTransform())
			painter.drawRect(topLeftX, topLeftY, width, height)


		painter.setTransform(QtWidgets.QTransform())
		painter.setFont(QtGui.QFont('tahoma', 8))
		from db.SymbolAttr import UIAttr

		lod = QtWidgets.QStyleOptionGraphicsItem().levelOfDetailFromTransform(self.transform())
		scene = self.scene()
		for uname, item in scene.symbolDict.items():
			uiAttr = item.getAttr(UIAttr.ATTR_UI)
			uiItem = uiAttr.uiItem
			arcLength = uiItem.radius[0] * (uiItem.theta[1] - uiItem.theta[0])
			if arcLength * lod > 15:
				posView = self.mapFromScene(uiItem.txtPos)
				painter.drawText(posView, item.name)

	def drawBackground(self, painter, rectF):
		trans = painter.worldTransform()
		lod = QtWidgets.QStyleOptionGraphicsItem().levelOfDetailFromTransform(trans)

		scene = self.scene()
		scene.updateNodeVisibility(lod)

		super(SymbolView, self).drawBackground(painter, rectF)
		lineList = scene.getLowPosList()

		t0 = time.clock()
		lineList = scene.getNormalPosList()
		for line in lineList:
			line.paint(painter,20,1.0)

		lineList = scene.getHighPosList()
		for line in lineList:
			line.paint(painter,100,2.0)


		t1 = time.clock()