#!/usr/bin/python
# -*- coding: Utf-8 -*-

import os, glob, string, Image, ImageOps
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from gui_modules_lecture.affichage_image.afficheurImage import VisionneurImagePourEKD
from gui_modules_image.image_base import Base

class Image_Divers_ChangFormat(QWidget):
	"""# -----------------------------------
	# Cadre accueillant les widgets de :
	# Image >> Divers >> Changer format
	# Gestion de 16 formats de fichiers
	# -----------------------------------"""
	def __init__(self, parent):
        	QWidget.__init__(self)
		
		# -------------------------------
		# Parametres généraux du widget
		# -------------------------------
		#=== tout sera mis dans une boîte verticale ===#
		vbox=QVBoxLayout(self)
		
		#=== Création des répertoires temporaires ===#
		self.repTampon = "/tmp/ekd/tampon/image_divers_changer_format/"
		if os.path.isdir(self.repTampon) is False:
        		os.makedirs(self.repTampon)
		
		# Au cas où le répertoire existait déjà et qu'il n'était pas vide 
		# -> purge (simple précausion)
		for toutRepCompo in glob.glob(self.repTampon+'*.*'):
			os.remove(toutRepCompo)
		
		# Délai avant conversion
		self.timer = QTimer()
		self.connect(self.timer, SIGNAL('timeout()'), self.sonderTempsActuel)
		
		# Fonctions communes à plusieurs cadres du module Image
		self.base = Base()
		# Paramètres de configuration
		self.config = parent.config
		self.listeChemin = []
		
		#-------------------------------------------------
		# Sélection images, type de méthode et de masque
		#-------------------------------------------------
		
		boutCharger=QPushButton(_(u'Ouvrir images'))
		self.connect(boutCharger, SIGNAL("clicked()"), self.ouvrirSource)
		vbox.addWidget(boutCharger)
		
		#------------------------
		# Onglets et stacked
		#------------------------
		self.tabwidget=QTabWidget()
		
		#=== 1er onglet ===#
		self.framReglage=QFrame()
		vboxReglage=QVBoxLayout(self.framReglage)
		
		# boite de combo
		self.comboReglage=QComboBox()
		self.listeComboReglage=[(_(u'JPEG (.jpg)'), '.jpg'),\
					(_(u'PNG (.png)'), '.png'),\
					(_(u'GIF (.gif)'), '.gif'),\
					(_(u'BMP (.bmp)'), '.bmp'),\
					(_(u'PPM (.ppm)'), '.ppm'),\
					(_(u'XPM (.xpm)'), '.xpm'),\
					(_(u'TARGA (.tga)'), '.tga'),\
					(_(u'TIFF (.tiff)'), '.tiff'),\
					(_(u'SGI (.sgi)'), '.sgi'),\
					(_(u'PNM (.pnm)'), '.pnm'),\
					(_(u'PSD (.psd)'), '.psd'),\
					(_(u'PCX (.pcx)'), '.pcx'),\
					(_(u'JPEG 2000 (.jp2)'), '.jp2'),\
					(_(u'JNG (.jng)'), '.jng'),\
					(_(u'PS (.ps)'), '.ps'),\
					(_(u'PDF (.pdf)'), '.pdf')]
		# Insertion des formats dans la combo box
		for i in self.listeComboReglage:
                	self.comboReglage.addItem(i[0],QVariant(i[1]))
		self.connect(self.comboReglage, SIGNAL("activated(int)"), self.changerComboReglage)
		
		hbox = QHBoxLayout()
		hbox.addWidget(QLabel(_(u'Type de format après traitement')))
		hbox.addWidget(self.comboReglage)
		hbox.setAlignment(Qt.AlignHCenter)
		
		vboxReglage.addLayout(hbox)
		vboxReglage.addSpacing(10)
		vboxReglage.addStretch()
		
		#=== 2ème onglet ===#
		# infos - logs
		self.zoneAffichInfosImg = QTextEdit("")
		self.zoneAffichInfosImg.setReadOnly(True)
		self.framImg=QFrame()
		vboxReglage=QVBoxLayout(self.framImg)
		vboxReglage.addWidget(self.zoneAffichInfosImg)
		self.framImg.setEnabled(False)
		
		#=== 3ème onglet ===#
		self.afficheurImg_1=VisionneurImagePourEKD()
		self.afficheurImg_2=VisionneurImagePourEKD()
		
		self.indexTabReglage=self.tabwidget.addTab(self.framReglage, _(u'Réglages'))
		self.indexImagechargee=self.tabwidget.addTab(self.afficheurImg_1, _(u'Images chargées'))
		self.indexImageResultat=self.tabwidget.addTab(self.afficheurImg_2, _(u'Images après traitement'))
		self.indexTabInfo=self.tabwidget.addTab(self.framImg, _(u'Infos'))
		
		# [bidouillage] Comme on n'arrive pas à afficher les images centrées
		# de façon 'propre', en attendant on bidouille pour y
		# arriver (le prbl concerne surtout les images d'acceuil)
		self.connect(self.tabwidget, SIGNAL("currentChanged(int)"), self.protheseCentrageImg) 
		
		vbox.addWidget(self.tabwidget)
		
		#------------------
		# Widgets du bas
		#------------------
		
		# boutons
		boutAide=QPushButton(_(u" Aide"))
		boutAide.setIcon(QIcon("Icones/icone_aide_128.png"))
		boutAide.setFocusPolicy(Qt.NoFocus)
		self.connect(boutAide, SIGNAL("clicked()"), self.afficherAide)
		self.boutApp=QPushButton(_(u" Appliquer"))
		self.boutApp.setIcon(QIcon("Icones/icone_appliquer_128.png"))
		self.boutApp.setFocusPolicy(Qt.NoFocus)
		self.connect(self.boutApp, SIGNAL("clicked()"), self.appliquer0)
		
		# Bouton inactif au départ
		self.boutApp.setEnabled(False)
		
		# ligne de séparation juste au dessus des boutons
		ligne = QFrame()
		ligne.setFrameShape(QFrame.HLine)
		ligne.setFrameShadow(QFrame.Sunken)
		vbox.addWidget(ligne)
		vbox.addSpacing(-5)	# la ligne doit être plus près des boutons
		
		hbox=QHBoxLayout()
		hbox.addWidget(boutAide)
		hbox.addStretch()	# espace entre les 2 boutons
		hbox.addWidget(self.boutApp)
		vbox.addLayout(hbox)
		
		self.setLayout(vbox)
		
		#------------------------------------------------
		# Barre de progression dans une fenêtre séparée
		#------------------------------------------------
		
		self.progress=QProgressDialog(_(u"Progression ..."), _(u"Arrêter le processus"), 0, 100)
		self.progress.setWindowTitle(_(u'EnKoDeur-Mixeur. Fenêtre de progression'))
		# Attribution des nouvelles dimensions
		self.progress.setMinimumWidth(500)
		self.progress.setMinimumHeight(100)
		
		
	def changerComboReglage(self, i):
		"""Récup/affichage ds le terminal de l'index de self.comboReglage"""
		print self.comboReglage.currentText()

	
	def protheseCentrageImg(self, i):
		"""Rafraichissemnt pour affichage de l'image au
		# milieu de la fenêtre. La fonction setTailleFenetre()
		# vient de la classe VisionneurImagePourEKD du fichier
		# gui_modules_lecture/affichage_image/afficheurImage.py"""
		if i==1: # 2ème onglet
			self.afficheurImg_1.setTailleFenetre()
		elif i==2: # 3ème onglet
			self.afficheurImg_2.setTailleFenetre()
	
	
	def ouvrirSource(self):
		txt = _("Fichier images")
		rep = self.base.getRepSource(self.listeChemin, self.config)
		listeChemin=QFileDialog.getOpenFileNames(None, _(u"Ouvrir"), rep, ("JPEG (*.jpg *.JPG *.jpeg *.JPEG);;PNG (*.png *.PNG);;GIF (*.gif *.GIF);;BMP (*.bmp *.BMP);;SGI (*.sgi *.SGI);;TIF (*.tif *.TIF);;TIFF (*.tiff *.TIFF);;TARGA (*.tga *.TGA);;PNM (*.pnm *.PNM);;PPM (*.ppm *.PPM);;JPEG 2000 (*.jp2 *.JP2);;PSD (*.psd *.PSD);;PCX (*.pcx *.PCX);;XPM (*.xpm *.XPM);;JNG (*.jng *.JNG);; *"))
		
		print "Chemin de chargement des images:", listeChemin, type(listeChemin)
		
		self.listeChemin = [str(listeChemin[i]) for i in range(len(listeChemin))]
		
		if self.listeChemin==[]: return
		
		self.listeChemin.sort()
		
		self.base.setRepSource(self.listeChemin, self.config)
		
		# Bouton actif après chargement des images
		self.boutApp.setEnabled(True)
		
	
	def chang_format(self):
		""" Changer format (gestion de différents formats de fichiers) """
		
		# Récup du format sélectionné par l'utilisateur
		format=self.comboReglage.currentText()
		# Définition de l'extension pour la conversion
		if format=='JPEG (.jpg)': ext='.jpg'
		elif format=='PNG (.png)': ext='.png'
		elif format=='GIF (.gif)': ext='.gif'
		elif format=='BMP (.bmp)': ext='.bmp'
		elif format=='PPM (.ppm)': ext='.ppm'
		elif format=='XPM (.xpm)': ext='.xpm'
		elif format=='TARGA (.tga)': ext='.tga'
		elif format=='TIFF (.tiff)': ext='.tiff'
		elif format=='SGI (.sgi)': ext='.sgi'
		elif format=='PNM (.pnm)': ext='.pnm'
		elif format=='PSD (.psd)': ext='.psd'
		elif format=='PCX (.pcx)': ext='.pcx'
		elif format=='JPEG 2000 (.jp2)': ext='.jp2'
		elif format=='JNG (.jng)': ext='.jng'
		elif format=='PS (.ps)': ext='.ps'
		elif format=='PDF (.pdf)': ext='.pdf'
		
		nbreElem=len(self.listeChemin)
		
		# Liste pour affichage des images chargées (ds le tabwidget)
		listeAff_1=[]
		# Liste pour affichage des pages sauvegardées (ds le tabwidget)
		listeAff_2=[]

		# Boucle principale
		for parc in range(nbreElem):
			
			# Enregistrement/conversion des formats sélectionnés
			os.system("convert "+"\""+self.listeChemin[parc]+"\" "+"\""+self.chemDossierSauv+'_'+string.zfill(parc+1, 6)+ext+"\"")
			
			listeAff_1.append(self.listeChemin[parc])
			listeAff_2.append(self.chemDossierSauv+'_'+string.zfill(parc+1, 6)+ext)
			
			# Conditions d'affichage des images dans l'interface
			if format in ['JPEG (.jpg)', 'PNG (.png)', 'BMP (.bmp)', 'PPM (.ppm)', 'TARGA (.tga)', 'TIFF (.tiff)', 'SGI (.sgi)', 'PNM (.pnm)', 'PSD (.psd)', 'PCX (.pcx)', 'XPM (.xpm)', 'JPEG 2000 (.jp2)', 'JNG (.jng)', 'PS (.ps)', 'PDF (.pdf)']:
				os.system("convert "+"\""+self.listeChemin[parc]+"\" "+"\""+self.repTampon+'chf71td2_'+string.zfill(parc+1, 6)+'.jpg'+"\"")
				# Affichage des images au format JPEG dans l'interface (car certains
				# formats ne sont pas gérés par ImageMagick et PyQt4)
				self.afficheurImg_2.setImage(self.repTampon+'chf71td2_'+string.zfill(parc+1, 6)+'.jpg')
				
			elif format=='GIF (.gif)':
				os.system("convert "+"\""+self.listeChemin[parc]+"\" "+"\""+self.repTampon+'chf71td2_'+string.zfill(parc+1, 6)+'.gif'+"\"")
				# Affichage des images au format GIF
				self.afficheurImg_2.setImage(self.repTampon+'chf71td2_'+string.zfill(parc+1, 6)+'.gif')
				
			# La page Image résultat devient visible à la fin des conversions
			self.tabwidget.setCurrentIndex(self.indexImageResultat)

			# Récupération des images contenues dans le rep. tampon
			affImgSource=glob.glob(self.repTampon+'*.*')
			# Affichage de la dernière image du lot chargée par l'utilisateur---
			# On passe par le rep. tampon ici car autrement certains fichiers non
			# gérés par PIL ou PyQt4 ne seraient pas visibles dans l'interface
			self.afficheurImg_1.setImage(affImgSource[len(affImgSource)-1])
			# ------------------------------------------------------------------
			
			# ================================================================== #
			# Calcule le pourcentage effectue a chaque passage et ce pour la 
			# barre de progression .
			# ---------------------------------------------
			val_pourc=((parc+1)*100)/nbreElem
			
			# --------------------------------------------
			# Affichage de la progression (avec
			# QProgressDialog) ds une fenêtre séparée
			self.progress.setValue(val_pourc)
			QApplication.processEvents()
			# Bouton Cancel pour arrêter la progression donc le process
			if (self.progress.wasCanceled()): break
			# --------------------------------------------
		
		# Affichage des infos sur l'image -------------------------	
		# On implémente les chemins des fichiers dans une variable
		# pour préparer l'affichage des infos
		texte1=_(u" Image(s) chargée(s)")
		texte2=_(u" Image(s) convertie(s)")
		a='#'*36
			
		self.infosImgProv_1=a+'\n#'+texte1+'\n'+a
		self.infosImgProv_2=a+'\n#'+texte2+'\n'+a
		
		# Images chargées
		for parcStatRendu_1 in listeAff_1:
			self.infosImgProv_1=self.infosImgProv_1+'\n'+parcStatRendu_1
			
		# Pages sauvegardées
		for parcStatRendu_2 in listeAff_2:
			self.infosImgProv_2=self.infosImgProv_2+'\n'+parcStatRendu_2
		
		# affichage des infos dans l'onglet
		self.zoneAffichInfosImg.setText(self.infosImgProv_1+'\n\n'+self.infosImgProv_2+'\n\n')
		self.framImg.setEnabled(True)
			
		# remise à 0 de la variable provisoire de log
		self.infosImgProv=''
		# ---------------------------------------------------------

		# Epuration/elimination des fichiers tampon
		for toutRepTemp in glob.glob(self.repTampon+'*.*'):
			os.remove(toutRepTemp)
		
	
	def sonderTempsActuel(self):
		"""x ms après l'apparition de la boite de dialogue, on lance la conversion. But: faire en sorte que la boite de dialogue ait le temps de s'afficher correctement"""
		self.timer.stop()
		self.appliquer()
	
	
	def appliquer(self):
		"""Lancement de la fonction chang_format"""
		self.chang_format()
		
	
	def appliquer0(self):
		"""Préparation de la conversion"""
		
		# Boîte de dialogue pour sauvegarder (nom du nouveau fichier)
		rep = self.base.getRepSource(self.listeChemin, self.config)
		self.chemDossierSauv=str(QFileDialog.getSaveFileName(None, _(u"Sauver"), rep, _(u"Tous les fichiers *.*")))
		
		if self.chemDossierSauv=='': return
		
		self.progress.reset()
		self.progress.show()
		self.progress.setValue(0)
		QApplication.processEvents()
		
		# Lancement de la conversion dans 250 ms (seule solution trouvée pour éviter
		# le grisage au début)
		self.timer.start(250)
		
	
	def afficherAide(self):
		"""Boîte de dialogue de l'aide"""
		messageAide=QMessageBox(self)
		messageAide.setText(_(u"Blablablabla ... blabla."))
		messageAide.setWindowTitle(_(u"Aide"))
		messageAide.setIcon(QMessageBox.Information)
		messageAide.exec_()
		