#!/usr/bin/python
# -*- coding: Utf-8 -*-
import time
import os
from PyQt4.QtCore import *
from PyQt4.QtGui import *

from gui_modules_lecture.affichage_image.afficheurImage import VisionneurImagePourEKD

class Lecture_VisionImage(QWidget):
	# -----------------------------------
	# Cadre accueillant les widgets de :
	# Lecture >> Visionner des images
	# -----------------------------------
	def __init__(self, parent):
        	QWidget.__init__(self)
		
		# Boite d'alignement verticale
		vbox=QVBoxLayout(self)
		
		#-------------------
		# Boite de commandes
		#-------------------

		# Création du visionneur
		self.afficheurImg=VisionneurImagePourEKD()

		#-Boite horizontale des boutons de commandes
		hbox2=QHBoxLayout()
		
		iconTaille=32
		flat=1
		
		#--Bouton début
		boutDebut=QPushButton()
		boutDebut.setIcon(QIcon("Icones/player_start.png"))
		boutDebut.setIconSize(QSize(iconTaille, iconTaille))
		boutDebut.setToolTip(_(u"Première image"))
		boutDebut.setFlat(flat)
		hbox2.addWidget(boutDebut)
		self.connect(boutDebut, SIGNAL("clicked()"), self.debut)
		
		#--Bouton precedent
		boutPrecedent=QPushButton()
		boutPrecedent.setIcon(QIcon("Icones/player_rew.png"))
		boutPrecedent.setIconSize(QSize(iconTaille, iconTaille))
		boutPrecedent.setToolTip(_(u"Image précédente"))
		boutPrecedent.setFlat(flat)
		hbox2.addWidget(boutPrecedent)
		self.connect(boutPrecedent, SIGNAL("clicked()"), self.precedent)
		
		#--Bouton de lecture
		boutLecture=QPushButton()
		boutLecture.setIcon(QIcon("Icones/player_play.png"))
		boutLecture.setIconSize(QSize(iconTaille, iconTaille))
		boutLecture.setToolTip(_(u"Lancer le diaporama"))
		boutLecture.setFlat(flat)
		hbox2.addWidget(boutLecture)
		self.connect(boutLecture, SIGNAL("clicked()"), self.diaporama)
		
		#--Bouton suivant
		boutSuivant=QPushButton()
		boutSuivant.setIcon(QIcon("Icones/player_fwd.png"))
		boutSuivant.setIconSize(QSize(iconTaille, iconTaille))
		boutSuivant.setToolTip(_(u"Image suivante"))
		boutSuivant.setFlat(flat)
		hbox2.addWidget(boutSuivant)
		self.connect(boutSuivant, SIGNAL("clicked()"), self.suivant)

		#--Bouton fin
		boutFin=QPushButton()
		boutFin.setIcon(QIcon("Icones/player_end.png"))
		boutFin.setIconSize(QSize(iconTaille, iconTaille))
		boutFin.setToolTip(_(u"Dernière image"))
		boutFin.setFlat(flat)
		hbox2.addWidget(boutFin)
		self.connect(boutFin, SIGNAL("clicked()"), self.fin)
		
		hbox2.addStretch()
		
		#--Bouton taille fenetre
		boutTailleFenetre=QPushButton()
		boutTailleFenetre.setIcon(QIcon("Icones/fenetre.png"))
		boutTailleFenetre.setIconSize(QSize(iconTaille, iconTaille))
		boutTailleFenetre.setToolTip(_(u"Ajuster à la fenêtre"))
		boutTailleFenetre.setFlat(flat)
		hbox2.addWidget(boutTailleFenetre)
		self.connect(boutTailleFenetre, SIGNAL("clicked()"), self.afficheurImg.setTailleFenetre)
		
		#--Bouton taille reel
		boutTailleReelle=QPushButton()
		boutTailleReelle.setIcon(QIcon("Icones/taillereelle.png"))
		boutTailleReelle.setIconSize(QSize(iconTaille, iconTaille))
		boutTailleReelle.setToolTip(_(u"Taille réelle"))
		boutTailleReelle.setFlat(flat)
		hbox2.addWidget(boutTailleReelle)
		self.connect(boutTailleReelle, SIGNAL("clicked()"), self.afficheurImg.setTailleReelle)
		
		#--Bouton zoom avant
		boutZoomAvant=QPushButton()
		boutZoomAvant.setIcon(QIcon("Icones/zoomplus.png"))
		boutZoomAvant.setIconSize(QSize(iconTaille, iconTaille))
		boutZoomAvant.setToolTip(_(u"Zoom avant"))
		boutZoomAvant.setFlat(flat)
		hbox2.addWidget(boutZoomAvant)
		self.connect(boutZoomAvant, SIGNAL("clicked()"), self.afficheurImg.zoomAvant)
		
		#--Bouton zoom arrière
		boutZoomArriere=QPushButton()
		boutZoomArriere.setIcon(QIcon("Icones/zoommoins.png"))
		boutZoomArriere.setIconSize(QSize(iconTaille, iconTaille))
		boutZoomArriere.setToolTip(_(u"Zoom arrière"))
		boutZoomArriere.setFlat(flat)
		hbox2.addWidget(boutZoomArriere)
		self.connect(boutZoomArriere, SIGNAL("clicked()"), self.afficheurImg.zoomArriere)

		#--Bouton Configuration du diaporama
		boutSelectFich = QPushButton("...")
		boutSelectFich.setToolTip(_(u"Parcourir"))
		hbox2.addWidget(boutSelectFich)
		self.connect(boutSelectFich, SIGNAL("clicked()"), self.ouvrirImages)

		# Apercus
		self.listeApercus=QListWidget()
		#self.listeApercus.setViewMode(QListView.IconMode)
		#self.listeApercus.setSelectionRectVisible(0)
		self.listeApercus.setGridSize(QSize(85,64))
		self.listeApercus.setIconSize(QSize(64,64))
		#self.listeApercus.setLayoutMode(QListView.Batched)
		self.listeApercus.setFlow(QListView.LeftToRight)
		#self.listeApercus.setWrapping(1)
		
		self.listeApercus.setHorizontalScrollMode(QAbstractItemView.ScrollPerItem)
		self.connect(self.listeApercus, SIGNAL("currentRowChanged(int)"), self.changerImage)
		
		# Ajout du viewer à la VBox
		vbox.addWidget(self.afficheurImg)
		
		# Ajout de l'apercu à la VBox
		vbox.addWidget(self.listeApercus)
		
		# Création du QTimer
		self.timer=QTimer()
		self.timer.setInterval(3000)
		self.connect(self.timer, SIGNAL("timeout()"), self.diapo)
		
		# Ajout des commandes
		self.listeApercus.setMaximumSize(QSize(2000,100))
		vbox.addLayout(hbox2)
	
		
	def ouvrirImages(self):
		""" Récupération du chemin des images sélectionnées """
		
		try:
			# Ouvrir images 
			chemin=QFileDialog.getOpenFileNames(None, _(u"Ouvrir images"), os.path.expanduser('~'), ("JPEG (*.jpg *.JPG *.jpeg *.JPEG);;PNG (*.png *.PNG);;GIF (*.gif *.GIF);;BMP (*.bmp *.BMP);;SGI (*.sgi *.SGI);;TIF (*.tif *.TIF);;TARGA (*.tga *.TGA);;PNM (*.pnm *.PNM);;PPM (*.ppm *.PPM)"))
		
			# Si pas de fichier sélectionné -> sortir de la fonction
			if chemin.count()==0: return
		
			# Convertir les differents fichiers selectionnes
			# en une liste de chaines de caracteres .
			if not chemin.isEmpty(): 
				listeAff=[str(chemin[i]) for i in range(chemin.count())]
			
			listeAff.sort()
			
			print "listeAff[0]", listeAff[0]
			
			# Pour l'affichage il n'y a que la 1ère image qui est sélectionnée
			self.afficheurImg.setImage(listeAff[0])
		
		except:
			messageErreur=QMessageBox(self)
			messageErreur.setText(_(u"Il s'est produit une erreur !"))
			messageErreur.setWindowTitle(_(u"Erreur"))
			messageErreur.setIcon(QMessageBox.Critical)
			messageErreur.exec_()
	
	def diaporama(self):
		"Fonction de diaporama"
		# On active le timer
		self.timer.start()
	
	def diapo(self):
		"Routine du Timer du diaporama"
		# Si on est à la dernière image
		if self.listeApercus.currentRow()==len(self.sortie)-1:
			self.timer.stop()
		else:
			self.suivant()
	
	def debut(self):
		"Fonction pour selectionner la première image"
		self.listeApercus.setCurrentRow(0)
	
	def fin(self):
		"Fonction pour selectionner la dernière image"
		self.listeApercus.setCurrentRow(len(self.sortie)-1)
		
	def suivant(self):
		"Fonction pour sélectionner l'image suivante"
		
		# Si ce n'est pas la dernière image
		if self.listeApercus.currentRow()!=len(self.sortie)-1:
			self.listeApercus.setCurrentRow(self.listeApercus.currentRow()+1)
		
	def precedent(self):
		"Fonction pour sélectionner l'image precedente"
		
		# Si ce n'est pas la première image
		if self.listeApercus.currentRow()!=0:
			self.listeApercus.setCurrentRow(self.listeApercus.currentRow()-1)
		
	def changerImage(self, item):
		"Fonction pour charger l'image selectionnée dans le listview"
		
		# Si il y a une image selectionnée
		if item!=-1:
			self.afficheurImg.setImage(self.sortie[item])
	

	def updateDir(self, item):
		"Fonction appelée par le treeview lors d'un changement de repertoire"
		
		# On récupère le QModel parent du QModelItem
		modele = item.model()
		
		# On crée le QDir
		rep=QDir(modele.filePath(item))
		rep.setFilter(QDir.Files)
		
		# Filtre des extensions (pas sensible à la casse)
		dicoExtension=["png","jpg", "jpeg", "bmp", "gif", "sgi", "tga", "tif", "tiff", "pnm", "ppm"]
		self.sortie=[]
		
		# Récuperation des fichiers du dossier
		liste=rep.entryList()
		
		# On vide le ListWidget
		self.listeApercus.clear()
		
		# Sélection des fichiers
		for entree in liste:
			# Création du QFileInfo
			fichier=QFileInfo(rep.absolutePath() + "/" + entree)
			
			# Recuperation de l'extension
			extension=fichier.suffix()
			
			# Application du filtre
			for validExtension in dicoExtension:
				# Si l'extension est valide
				if extension.toLower()==validExtension:
					# On ajoute à la liste
					self.sortie.append(fichier.absoluteFilePath())
					# On ajoute au LisView
					self.listeApercus.addItem(QListWidgetItem(QIcon(fichier.absoluteFilePath()),QString("")))
		
		# Affichage de la première image
		if len(self.sortie)!=0:
			self.debut()
		# Si pas d'image
		else:
			self.afficheurImg.setImage()