#!/usr/bin/python
#
######################
# Frontend for Picviz
######################
# (C) 2008 Sebastien Tricaud
#     2009 Victor Amaducci
#     2009 Gabriel Cavalcante

# Python libs
import os
import sys
import time
import string

# QT
from PyQt4 import QtCore, QtGui


# Picviz
import picviz

# UI
from PicvizGui import axisgui, lines, defaults, selection, UiPicviz 
from PicvizGui.buildgraphicgui import Buildpanel
from PicvizGui.UiPicviz import Ui_MainWindow
from PicvizGui.myScene import myScene


#class Timeout:
#	def __init__(self, last):
#		self.last_timeout = last
#
#	def canActivate(self, time):
#		if int(time) - self.last_timeout > 1:
#			print "update: %d-%d" % (int(time),self.last_timeout)
#		self.last_timeout = int(time)
#
#	def getTimeout(self):
#		return self.last_timeout
#
#	def updateTimeout(self):
#		self.last_timeout = int(time.time())



# check for psyco
try:
	import psyco
	psyco.full()
except ImportError:
	print 'Running without psyco (http://psyco.sourceforge.net/).'

class PicvizApp (QtGui.QMainWindow,Ui_MainWindow):#(QtGui.QMainWindow):
	def __init__(self, parent=None):
		QtGui.QWidget.__init__(self, parent)
		self.ui = UiPicviz.Ui_MainWindow()
		self.ui.setupUi(self)
		#self = QtGui.QMainWindow(self)
		self.scene = QtGui.QGraphicsScene()
		self.comboboxes = {}
		self.image = 0
		self.comboList = []
		self.buttonChange = []
		#addLines(window, image)
	def ComboIndexChange(widget):
		pass
#	print "foo"

	def Buildgraphic(self):
		test = Buildpanel(self)
		test.show()
		print '+Buildgraphic'
		
	def init_view (self, pcvFileBuilded):
		self.axes_number=0
		self.filter = None
		if len(sys.argv) < 2:
			#self.pcvfile = QtGui.QFileDialog.getOpenFileName(None, "Open Picviz graph", "", "Picviz Files (*.pcv)")
			self.pcvfile = "New.pcv"
			pass
		else:
			self.pcvfile = sys.argv[1]
			if len(sys.argv) > 2:
				self.filtertable = sys.argv[2:]
				self.filter = string.join(self.filtertable, " ")
			self.image = picviz.Image(str(self.pcvfile), self.filter)
	
	def openPcvFile (self):
		self.pcvfile = QtGui.QFileDialog.getOpenFileName(None, "Open Picviz graph", "", "Picviz Files (*.pgdl *.pcv)")
		self.image = picviz.Image(str(self.pcvfile), self.filter)
		#print self.image
		self.destroyComboBoxes()
		self.paint_ImageView()
		 
	def destroyComboBoxes (self):
		for each in self.comboList:
			each.close()
		for each in self.buttonChange:
			each.Close()
		#print "Image"
		#print self.image
		#if self.image:
		#	del self.image
	
	def create_window_after_init_view (self):
		#picviz.Debug()
		self.ui.setupUi(self)
		self.setWindowTitle("Picviz %s Frontend [%s]" % (picviz.Version(), self.pcvfile))
		self.show()

		#self.matrix = QtGui.QMatrix() #Natrix to apply Zoom on GraphicsView

		self.scene = myScene(self.ui.graphicsView)
		self.scene.getUi(self.ui)
		#self.ui.graphicsView.setRenderHint(QtGui.QPainter.Antialiasing)
		self.ui.graphicsView.setScene(self.scene)
		#scene.setSceneRect(0, 0, 875, 500)
		self.connect(self.ui.action_Build,QtCore.SIGNAL('triggered()'),self.Buildgraphic)
		self.connect(self.ui.action_Open,QtCore.SIGNAL('triggered()'),self.openPcvFile)
		self.connect(self.ui.action_Quit,QtCore.SIGNAL('triggered()'),self.Close)
		self.connect(self.ui.zoomButtonPlus,QtCore.SIGNAL('clicked()'),self.plusZoom)
		self.connect(self.ui.zoomButtonLess,QtCore.SIGNAL('clicked()'),self.lessZoom)

		self.connect(self.ui.brushButton,QtCore.SIGNAL('clicked()'),self.scene.brushSelection)
		#self.ui.setMenuBar(self.menubar)
	def plusZoom (self):
		#self.matrix.scale(2,2)
		#self.ui.graphicsView.setMatrix(self.matrix)
		self.ui.graphicsView.scale(1.15,1.15)
		self.line.decreaseWidth()

	def lessZoom (self):
		#self.matrix.scale(0.5,0.5)
		#self.ui.graphicsView.setMatrix(self.matrix)
		self.ui.graphicsView.scale(1/1.15,1/1.15)
		self.line.increaseWidth()


	def empty_ImageView (self):
		tableHeader = []
		comboList = []
		axesDict = {} #Handler of engine/ComboBox axis name translate
		dictFull=False #Flag for not duplicate lines!
		# combo = axisgui.AxisName(self.ui, self)
		# combo.show()
		self.ui.tableWidget.setHorizontalHeaderLabels(tableHeader)
		self.ui.tableWidget.horizontalHeader().setResizeMode(QtGui.QListView.Adjust, QtGui.QHeaderView.Interactive)
		self.ui.tableWidget.verticalHeader().hide()
		self.ui.tableWidget.setShowGrid(True)
		self.ui.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
		
	def paint_ImageView (self):
		self.axes_number = len(self.image['axeslist'])
		i = 0
		tableHeader = []
		comboList = []
		axesDict = {} #Handler of engine/ComboBox axis name translate
		dictFull=False #Flag for not duplicate lines!
		
		while i < self.axes_number:
			combo = axisgui.AxisName(self.ui, self)
			self.ui.horizontalLayout.addWidget(combo)
			combo.show()
			temp_index = 0
			for axis in self.image['axeslist']:
				#itemlabel = "teste"
				itemlabel = combo.setItemName(self.image['axes'][axis]['label'],self.image['axes'][axis]['id']) 
				# set the combo names
				if (dictFull == False) :
					if (self.image['axes'][axis]['label']):
						axesDict[self.image['axes'][axis]['label']] = axis
						#Add translate for dict if it have label
					else:
						axesDict['axis%d' % temp_index]=axis  #Add translate if it not have label
				if i == 0:
					tableHeader.append(itemlabel)
					self.ui.tableWidget.insertColumn(self.ui.tableWidget.columnCount())
				temp_index = temp_index + 1
			dictFull=True #Set the flag in first iteration
			combo.setCurrentIndex(i)
			comboList.append(combo)
			i = i + 1 
		self.axisButton = axisgui.AxisButton(self.ui, comboList, axesDict, self) #Add a button in Horizontal Layout

		self.ui.horizontalSlider.setPageStep(1)
		self.ui.horizontalSlider.setMinimum(0)
		linenb = 0
		self.comboList = comboList
		for self.line in self.image['lines']:
			if(not self.line['hidden']):
				linenb = linenb + 1
		self.ui.horizontalSlider.setMaximum(linenb/(self.axes_number-1))
		self.ui.horizontalSlider.setValue(linenb/(self.axes_number-1))

		#ui.menubar.hide()

		axisgui.addAxes(self.image, self.scene, self.line, self.axes_number ,self.ui)

		self.ui.tableWidget.setHorizontalHeaderLabels(tableHeader)
		self.ui.tableWidget.horizontalHeader().setResizeMode(QtGui.QListView.Adjust, QtGui.QHeaderView.Interactive)
		self.ui.tableWidget.verticalHeader().hide()
		self.ui.tableWidget.setShowGrid(True)
		self.ui.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)

		self.line = lines.Line(self.scene, self.image, self.axes_number, self.ui, self.comboList)
		self.line.addLines(linenb)
		
		self.connect(self.ui.horizontalSlider, QtCore.SIGNAL('valueChanged(int)'),self.line.update_lines_view)
		#self.connect(self.scene, QtCore.SIGNAL('selectionChanged()'),self.line.selectionUpdate)
		self.axisButton.setLines(self.line,linenb)
		self.axisButton.setImage(self.image)
		self.axisButton.setCurrentEngine(picviz)
		self.axisButton.setSlider(self.ui.horizontalSlider)
		self.buttonChange.append(self.axisButton)
	
	
	def Close (self):
		print "Closing Window!"
		self.close()

if __name__ == "__main__":
	app = QtGui.QApplication(sys.argv)	
	PicViz = PicvizApp()
	PicViz.init_view(None)
	PicViz.create_window_after_init_view()
	if not PicViz.image:
		#if not pcvFileBuilded:
		PicViz.empty_ImageView()
		print "*** Could not create image. Exiting."
		#sys.exit(1)
	if PicViz.image:
		PicViz.paint_ImageView()
	sys.exit(app.exec_())

