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

import os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from gui_modules_animation.animation_base import Base
from moteur_modules_animation.mencoder import WidgetMEncoder
from moteur_modules_animation.mplayer import Mplayer

class Animation_ReglagesDivers(QWidget):
	# ----------------------------------------------------------------------------------------
	# Cadre accueillant les widgets de : Animation >> Séparer le flux vidéo et le flux audio
	# ----------------------------------------------------------------------------------------
	def __init__(self, parent):
		QWidget.__init__(self)
		
		# -------------------------------
		# Parametres généraux du widget
		# -------------------------------
		self.base = Base(self) # module de animation
		#=== tout sera mis dans une boîte verticale ===#
		vbox=QVBoxLayout(self)
		
		#=== Variable de configuration ===#
		self.config=parent.config
		
		#=== Identifiant de la classe ===#
		self.idSection = "Animation - Reglages Supplementaires"
		self.base.printSection()
		
		# -------------------------------------------------------------------
		# Boîte de groupe : "Fichier vidéo source"
		# -------------------------------------------------------------------
		self.base.widgetSource(vbox)
		
		# -------------------------------------------------------------------
		# Boîte de groupe "Réglage de sortie de l'encodage"
		# -------------------------------------------------------------------
		
		#=== Création de la boite de groupe de réglage (contenant la boite self.layoutReglage) ===#
		self.base.widgetReglage(vbox, nomReglage=_(u"Réglage du nombre d'images par seconde de la vidéo"), boite='hbox')
		
		##=== Widget qui seront inclus dans la boite de réglage ===#
		
		# boite de spin
		self.spin=QSpinBox()		# self car on va récupérer la variable depuis le moteur
		self.spin.setRange(1,60) # valeur 22 par défaut
		self.connect(self.spin,SIGNAL("valueChanged(int)"),self.spinChange)
		
		# curseur
		self.curseur = QSlider(Qt.Horizontal)
		self.curseur.setRange(1,60)
		self.connect(self.curseur, SIGNAL("sliderMoved(int)"), self.curseurChange)
		
		#=== Chargement du paramètre de configuration ===#
		try:
			self.spin.setValue(int(self.config.get(self.idSection,'spin')))
		except:
			self.spin.setValue(22)
		
		# info
		txt2 = _(u"La vidéo source contient")
		txt3=_(u"img/s")
		self.info=QLabel("%s x %s" %(txt2,txt3))
		
		self.layoutReglage.addWidget(self.spin)
		self.layoutReglage.addWidget(self.curseur)
		self.layoutReglage.addWidget(self.info)
		
		# -----------------------------
		# Boite de groupe de mplayer
		# -----------------------------
		group=QGroupBox("")
		vboxMplayer = QVBoxLayout(group)
		self.mplayer=Mplayer(taille=self.base.tailleMplayer)
		self.mplayer.setEnabled(False)
		self.mplayer.listeVideos = [self.ligneEditionSource.text()]
		hbox = QHBoxLayout()
		hbox.addStretch()
		hbox.addWidget(self.mplayer)
		hbox.addStretch()
		vboxMplayer.addLayout(hbox)
		
		self.radioSource = QRadioButton(_(u"vidéo(s) source(s)"))
		self.radioSource.setEnabled(False)
		self.radioSource.setChecked(True)
		self.connect(self.radioSource, SIGNAL("toggled(bool)"), self.fctRadioSource)
		self.radioConvert = QRadioButton(_(u"vidéo convertie"))
		self.radioConvert.setEnabled(False)
		self.connect(self.radioConvert, SIGNAL("toggled(bool)"), self.fctRadioConvert)
		self.boutCompare = QPushButton(_(u"Comparateur de vidéos"))
		self.boutCompare.setEnabled(False)
		hbox = QHBoxLayout()
		hbox.addWidget(self.radioSource)
		hbox.addWidget(self.radioConvert)
		hbox.addWidget(self.boutCompare)
		hbox.setAlignment(Qt.AlignHCenter)
		vboxMplayer.addLayout(hbox)
		
		group.setAlignment(Qt.AlignHCenter)
		vbox.addWidget(group)
		
		# -------------------------------------------------------------------
		# widgets du bas : ligne + boutons Aide et Appliquer
		# -------------------------------------------------------------------
		self.base.widgetBas(vbox)
		
		# affichage du nombre d'images/s si une vidéo est sélectionnée
		self.nbrImgSecIni()
		
		# affichage de la boîte principale
		self.setLayout(vbox)
	
	
	def spinChange(self,i):
		"""conserver le spin dans le fichier de configuration et modifie le curseur"""
		print "nbr img/s :", i
		# sauver spin
		self.config.set(self.idSection,'spin',i)
		# sauver curseur
		self.curseur.setValue(i)
	
	
	def curseurChange(self, i):
		"""Quand on change la position du curseur la valeur du spin est automatiquement modifiée"""
		self.spin.setValue(i)
	
	
	def fctRadioSource(self, bool=None):
		""""Communique la vidéo appropriée à mplayer"""
		if bool: self.mplayer.listeVideos = [self.ligneEditionSource.text()]
		
	
	def fctRadioConvert(self, bool=None):
		""""Communique la vidéo appropriée à mplayer"""
		if bool: self.mplayer.listeVideos = self.lstFichiersSortie
	
	
	def nbrImgSecIni(self):
		""" Calcule et affiche le nombre d'images par seconde de la vidéo source """
		fps=0
		if self.ligneEditionSource.text():
			recDonnees_Video=os.popen('mplayer ' + str(self.ligneEditionSource.text()) + ' -vo null -ao null -frames 0 -identify "$@" 2>/dev/null').readlines()
			
			for ligne in recDonnees_Video:
				if "ID_VIDEO_FPS" in ligne:
					ligne = ligne.replace("ID_VIDEO_FPS", "")
					ligne = ligne.replace("=", "")
					ligne = ligne.replace("\n", "")
					ligne = ligne.replace(" ", "")
					fps = str(int(float(ligne)))
		if fps:
			txt1 = _(u"La vidéo source contient")
			txt2=_(u"img/s")
			self.info.setText(u"%s %s %s" %(txt1,fps,txt2))
	
	
	def ouvrirSource(self, nomEntree=None):
		"""Récupération du chemin de la vidéo sélectionnée et activation de certains widgets"""
		
		# Récupération du chemin de la vidéo
		chemin = self.base.recupSource(nomEntree)
		if not chemin: return
		print "chemin vidéo d'entrée:", chemin, type(chemin)
		
		# Affichage du chemin + nom de fichier dans la ligne d'édition
		self.ligneEditionSource.setText(chemin)
		
		self.boutApp.setEnabled(True)
		
		self.mplayer.setEnabled(True)
		self.mplayer.listeVideos = [chemin]
		self.radioSource.setChecked(True)
		self.radioSource.setEnabled(False)
		self.radioConvert.setEnabled(False)
		self.boutCompare.setEnabled(False)
		
		self.nbrImgSecIni()
	
	
	def afficherAide(self):
		""" Boîte de dialogue de l'aide """
		#self.base.afficherAide(_(u"Blablabla"))
		self.base.afficherAide(_(u"Blablablablablablablablablabla ... blablabla ... blablablabla ... blablabla."))
		'''
		messageAide=QMessageBox(self)
		messageAide.setText(_(u"Blablablabla ... blabla anim_raglag_divers."))
		messageAide.setWindowTitle(_(u"Aide"))
		messageAide.setIcon(QMessageBox.Information)
		messageAide.exec_()
		'''
	
	
	def appliquer(self, nomSortie=None, ouvert=1):
		""" appelle la boite de dialogue de sélection de fichier à sauver et appel de la fonction de changement du nombre d'images par seconde """
		
		#=== Détermination des chemins d'entrée et sortie ===#
		
		if not nomSortie:
			# récupération du chemin de la vidéo de destination (à l'exception de l'extension)
			cheminVideoSorti=str(QFileDialog.getSaveFileName(None, _(u"Sauver"), os.path.expanduser(self.base.repSortieProv()), _(u"Tous les fichiers *.*")))
		else: # module séquentiel
			cheminVideoSorti=nomSortie
		
		if cheminVideoSorti=="": return
		
		# récupération du chemin de la vidéo source
		cheminVideoSource=str(self.ligneEditionSource.text())
		fich, ext=os.path.splitext(cheminVideoSource)
		
		# extension de fichier: ext
		fich, ext=os.path.splitext(cheminVideoSource)
		
		# chemins complets de sortie du fichier vidéo
		cheminVideoSorti = cheminVideoSorti + ext
		
		nbrImgSec = str(self.spin.value())
		
		commande = 'mencoder -idx -ovc copy -oac copy -ofps '+nbrImgSec+' -o '+"\""+cheminVideoSorti+"\""+' '+"\""+cheminVideoSource+"\""
		
		print "Commande de changement du nombre d'images par seconde de la vidéo :\n", commande
		
		try:
			mencoder = WidgetMEncoder('idx', cheminVideoSource, cheminVideoSorti, valeurNum=nbrImgSec, laisserOuvert=ouvert)
			mencoder.setWindowTitle(_(u"Réglage divers"))
			mencoder.exec_()
		except:
			messageErrAnEnc=QMessageBox(self)
			messageErrAnEnc.setText(_(u"Problème lors du changement du nombre d'images par seconde (mencodeur)"))
			messageErrAnEnc.setWindowTitle(_(u"Erreur"))
			messageErrAnEnc.setIcon(QMessageBox.Warning)
			messageErrAnEnc.exec_()
			return
		
		self.lstFichiersSortie = cheminVideoSorti # chemin de la vidéo convertie pour le 2ème mplayer
		self.radioSource.setEnabled(True)
		self.radioConvert.setEnabled(True)
		self.boutCompare.setEnabled(True)
		return cheminVideoSorti # module séquentiel
	
	
	def sequentiel(self, entree, sortie, ouvert=0):
		"""Utile dans le module du même nom. Applique les opérations de la classe. Retourne le vrai nom du fichier de sortie"""
		self.ouvrirSource(entree)
		return self.appliquer(sortie, ouvert)
	
	
	def sequentielReglage(self):
		"""Utile dans le module du même nom. Récupère le widget de réglage associé à l'identifiant donné en 1er argument. Retourne l'instance du widget de réglage"""
		return self.groupReglage