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

import sys, os, string
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from gui_modules_image.image_base import Base

class Image_Divers_RenomImg(QWidget):
	# -----------------------------------
	# Cadre accueillant les widgets de :
	# Image >> Divers >> Renommer images
	# -----------------------------------
	def __init__(self, parent):
        	QWidget.__init__(self)
		
		# Boite d'alignement vertical
		vbox=QVBoxLayout(self)
		
		#=== Variable de configuration ===#
		self.config=parent.config
		
		# -------------------------------------------------------------------
		# Titre de la page
		# -------------------------------------------------------------------
		
		#txt1=_(u'Renommer images')
		#titre_du_cadre=QLabel('<H2><CENTER>%s</CENTER></H2>' %txt1, self)
		
		# Ajout du titre de la page a la boite verticale
		#vbox.addWidget(titre_du_cadre, 0)

		# Fonctions communes à plusieurs cadres du module Image
		self.base = Base()
		# Paramètres de configuration
		self.config = parent.config
		self.listeChem = []

		# -------------------------------------------------------------------
		# Boîte de groupe : "Fichier vidéo source"
		# -------------------------------------------------------------------
		
		# widgets contenus dans la boite
		self.ligneCheminFichier=QLineEdit()
		self.ligneCheminFichier.setReadOnly(True)
		
		# Si le fichier de configuration contient un paramètre de chemin pour la vidéo
		# et que le chemin spécifié dans le fichier de configuration pour la vidéo est 
		# valide alors on remplit le QLineEdit avec le(s) chemin(s)
		#self.remplirLigneCheminFichier()
		
		# là où s'afficheront les infos
		self.zoneTexte = QTextEdit("")
		self.zoneTexte.setReadOnly(True)
		
		# Bouton parcourir (pour charger la video)
		boutOuvChargerImages=QPushButton(_(u'Parcourir...'))
		
		self.connect(boutOuvChargerImages, SIGNAL("clicked()"), self.ouvrirImages)
		
		# les boîtes de groupes seront placés dans des boîtes horizontales
		group=QGroupBox(_(u"Fichiers images sources"))
		hbox=QHBoxLayout(group)
		hbox.addWidget(self.ligneCheminFichier)
		hbox.addWidget(boutOuvChargerImages)
		vbox.addWidget(group)
		
		self.group=QGroupBox(_(u"Affichage du résultat avant et après renommage des fichiers"))
		vboxZT=QVBoxLayout(self.group)
		vboxZT.addWidget(self.zoneTexte)
		vbox.addWidget(self.group)
		self.group.setEnabled(False)
		
		# -------------------------------------------------------------------
		# widgets du bas : ligne + boutons Aide et Appliquer
		# -------------------------------------------------------------------
		
		# boutons
		boutAidetRenomImg=QPushButton(_(u" Aide"))
		boutAidetRenomImg.setIcon(QIcon("Icones/icone_aide_128.png"))
		self.connect(boutAidetRenomImg, SIGNAL("clicked()"), self.afficherAide)
		self.boutApp=QPushButton(_(u" Renommer"))
		self.boutApp.setIcon(QIcon("Icones/icone_appliquer_128.png"))
		
		# Si pas de chemin spécifié dans la ligne d'édition -> bouton inactif
		if not self.ligneCheminFichier.text(): 
			self.boutApp.setEnabled(False)
		self.connect(self.boutApp, SIGNAL("clicked()"), self.appliquer)
		
		# 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(boutAidetRenomImg)
		hbox.addStretch()	# espace entre les 2 boutons
		hbox.addWidget(self.boutApp)
		vbox.addLayout(hbox)
		
		# affichage de la boîte principale
		self.setLayout(vbox)
		
		
	def ouvrirImages(self):
		""" Récupération du chemin de la vidéo sélectionnée """
		
		# Chargement des fichiers/images
		#chemin=QFileDialog.getOpenFileNames(None, _(u"Open"), os.path.expanduser('~'),  ("All files (*.*);;JPG (*.jpg);;JPEG (*.jpeg);;PGM (*.pgm);;PNG (*.png);;GIF (*.gif);;BMP (*.bmp);;SGI (*.sgi);;TIF (*.tif)"))
		rep = self.base.getRepSource(self.listeChem, self.config)
		chemin=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);;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():
			self.listeChem=[str(chemin[i]) for i in range(chemin.count())]
		
		self.base.setRepSource(self.listeChem, self.config)
		
		self.a1='###########################\n'
		self.b1=_('Fichiers avant renommage')+':\n'
		self.c1='###########################\n\n'
			
		# L'affichage devient complètement visible
		self.group.setEnabled(True)
		# Affichage dans zoneTexte des fichiers avant renommage (uniquement)
		self.zoneTexte.setText(self.a1+self.b1+self.c1+"\n".join(self.listeChem))
		self.zoneTexte.show()
		
		# Affichage du chemin + nom de fichier dans la zone
		# de texte du widget QLineEdit (de l'init) .
		if len(self.listeChem)>1:
			self.ligneCheminFichier.setText(self.listeChem[0]+' [...] '+self.listeChem[len(self.listeChem)-1])
		elif len(self.listeChem)==1:
			self.ligneCheminFichier.setText(self.listeChem[0])
		
		# Quand un fichier est sélectionné, le bouton "Renommer" devient
		# cliquable 
		self.boutApp.setEnabled(True)
		
		
	def afficherAide(self):
		""" Boîte de dialogue de l'aide du cadre Image > Renommer """
		messageAide=QMessageBox(self)
		messageAide.setText(_(u"Blabla ... blablabla ... blabla"))
		messageAide.setWindowTitle(_(u"Aide"))
		messageAide.setIcon(QMessageBox.Information)
		messageAide.exec_()
		
	
	def appliquer(self):
		"""appliquer le renommage des images"""
		
		# Récupération du chemin + vidéo chargée et de l'extension 
		# (la première image de la liste) 
		fich, ext=os.path.splitext(self.listeChem[0])
		
		rep = self.base.getRepSource(self.listeChem, self.config)
		# Boîte de dialogue pour sauvegarder (nom du nouveau fichier)
		sauver=QFileDialog.getSaveFileName(None, _(u"Sauver"), rep, _(u"Images avec cette extension (*%s)" %ext))
		
		if sauver=='': return
		
		# Barre de progression dans une fenêtre séparée . Attention la fenêtre
		# de la barre se ferme dès que la progression est terminée . En cas de
		# process très court, la fenêtre peut n'apparaître que très brièvement
		# (voire pas du tout si le temps est très très court) .
		self.progress=QProgressDialog(_(u"Operation in progress ..."), _(u"Abord progress"), 0, 100)
		self.progress.setWindowTitle(_(u'EnKoDeur-Mixeur . Progress window'))
		# Attribution des nouvelles dimensions 
		self.progress.setMinimumWidth(500)
		self.progress.setMinimumHeight(100)
		# setGeometry est utilisé ici uniquement pour le placement à la position 0, 0
		# je ne suis pas un adepte de la position 0,0 :-P (Romain)
		#self.progress.setGeometry(QRect(0, 0, 500, 100))
		
		self.progress.show()
		
		try :
			listeSauve=[]
			
			nbreElem=len(self.listeChem)
		
			for parc in range(nbreElem) :
			
				# Renommage
				os.rename(self.listeChem[parc], sauver+'_'+string.zfill((parc+1), 6)+ext)
				
				# Liste pour affichage dans zoneTexte
				listeSauve.append(str(sauver+'_'+string.zfill((parc+1), 6)+ext))
				
				# --------------------------------------------
				# Affichage de la progression (avec
				# QProgressDialog) ds une fenêtre séparée .
				val_pourc=((parc+1)*100)/nbreElem

				# Bouton Cancel pour arrêter la progression donc le process
				if (self.progress.wasCanceled()):
					break

				self.progress.setValue(val_pourc)
			
				QApplication.processEvents()
				# --------------------------------------------
				
			#self.progress.setVisible(True)
			
			self.a2='###########################\n'
			self.b2=_(u'Fichiers après renommage')+':\n'
			self.c2='###########################\n\n'

			# Affichage dans zoneTexte des fichiers avant et après renommage
			self.zoneTexte.setText(self.a1+self.b1+self.c1+"\n".join(self.listeChem)+'\n\n'+self.a2+self.b2+self.c2+"\n".join(listeSauve))
			self.zoneTexte.show()
				
			messageOk=QMessageBox(self)
			messageOk.setText(_(u"All has been done correctly"))
			messageOk.setWindowTitle(_(u"Process"))
			messageOk.setIcon(QMessageBox.Information)
			messageOk.exec_()
			
		except:
			messageErreur=QMessageBox(self)
			messageErreur.setText(_(u"An error has occured !"))
			messageErreur.setWindowTitle(_(u"Process"))
			messageErreur.setIcon(QMessageBox.Critical)
			messageErreur.exec_()
			
			print "AIEAIEAIE !!!"