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

'''
-----------------------------------------------------------------------
GPL v3
-----------------------------------------------------------------------
EKD can be used to post production operations for video files and images.
Copyright (C) 2008 Lama Angelo (the historical developer of the 
program) with the contribution of Romain (alteo_gange) and Jean-Rémy 
Bancel to this 2008 version of EKD.

EKD is free software; you can redistribute it and/or modify it under 
the terms of the GNU General Public License as published by the Free 
Software Foundation; either version 3 of the License, or (at your 
option) any later version.

EKD is distributed in the hope that it will be useful, but WITHOUT 
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, see http://www.gnu.org/licenses
or write to the Free Software Foundation,Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301  USA

To contact the developpers of EKD, go here: 
http://ekd-forum.tolosano.info/forumdisplay.php?fid=4
-----------------------------------------------------------------------
'''

import sys, os, ConfigParser, locale, webbrowser, platform
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import gettext

os.chdir(os.path.dirname(os.path.abspath(sys.argv[0])))

# Version de ekd
__version__ = "1.4-1"

# -------------------------------------------------------------
# Import des modules contenus ds des fichiers separes
# -------------------------------------------------------------

# DEPENDANCES ------------
from dependances.scan_applis import verifAppliManquante

# ANIMATION --------------

from gui_modules_animation.animation_encodage import Animation_Encodage
from gui_modules_animation.animation_filtres_video import Animation_FiltresVideos
from gui_modules_animation.animation_montage_video import Animation_MontagVideo
# + ---------------------------
from gui_modules_animation.animation_montage_video_vid_seul import Animation_MontagVideoVidSeul
from gui_modules_animation.animation_montage_video_vid_plus_audio import Animation_MontagVideoVidPlusAudio
from gui_modules_animation.animation_montage_video_decoup_une_vid import Animation_MontagVideoDecoupUneVideo
# -----------------------------
from gui_modules_animation.animation_separer_video_et_audio import Animation_SeparVideoEtAudio
from gui_modules_animation.animation_conv_img_en_anim import Animation_ConvertirImgEnAnim
from gui_modules_animation.animation_conv_anim_en_img import Animation_ConvertirUneAnimEnImg
from gui_modules_animation.animation_reglag_divers import Animation_ReglagesDivers

# IMAGE ------------------
# divers
from gui_modules_image.divers.image_divers import Image_Divers
# + ---------------------------
from gui_modules_image.divers.image_divers_chang_format import Image_Divers_ChangFormat
from gui_modules_image.divers.image_divers_compositing import Image_Divers_Compositing
from gui_modules_image.divers.image_divers_info import Image_Divers_Info
from gui_modules_image.divers.image_divers_pl_contact import Image_Divers_PlContact
from gui_modules_image.divers.image_divers_pour_le_web import Image_Divers_PourLeWeb
from gui_modules_image.divers.image_divers_redimensionner import Image_Divers_Redimensionner
from gui_modules_image.divers.image_divers_renom_img import Image_Divers_RenomImg
from gui_modules_image.divers.image_divers_txt_sur_img import Image_Divers_TxtSurImg
# -----------------------------
# transitions
from gui_modules_image.transitions.image_transitions import Image_Transitions
# + ---------------------------
from gui_modules_image.transitions.image_transitions_fond_ench import Image_Transitions_FondEnch
from gui_modules_image.transitions.image_transitions_spirale import Image_Transitions_Spirale
# -----------------------------
# masque_alpha_3d
from gui_modules_image.masque_alpha_3d.image_masque_alpha_3d import Image_MasqueAlpha3D
# -----------------------------
# filtres_images
from gui_modules_image.filtres_images.image_filtres_image import Image_FiltresImage

# MUSIQUE-SON ------------
from gui_modules_music_son.music_son_encodage import MusiqueSon_Encodage

# LECTURE ----------------
from gui_modules_lecture.lecture_image import Lecture_VisionImage
from gui_modules_lecture.lecture_video import Lecture_VisionVideo

# MODE-SEQUENTIEL ------------- # En construction
if len(sys.argv)==2 and sys.argv[1]=="sequentiel":
	from gui_modules_sequentiel.sequentiel import Sequentiel
# -------------------------------------------------------------


class Aide_Info(QDialog):
	# -------------------------------------------------------------
	# Classe pour Chargement de la boîte de dialogue pour afficher
	# l'aide en ligne (affichée dans le browser web par défaut du
	# système), les infos de développement et la licence
	# -------------------------------------------------------------
	
	## La largeur de la fenêtre est définie de façon à pouvoir afficher les caractères suivants sur une ligne
	#WSTRING = "EKD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public"
	
	def __init__(self, parent=None):
		QDialog.__init__(self, parent)
		
		self.setAttribute(Qt.WA_DeleteOnClose)
		
		self.setMinimumSize(QSize(700, 500))
		#self.minimumSizeHint()
		# Titre de la fenetre
		self.setWindowTitle(_(u'Infos'))
		
		vbox_aide=QVBoxLayout()
		
		self.tabwidget=QTabWidget()
		
		#=== 1er onglet ===#
		textBrowser = QTextBrowser()

		textBrowser.setHtml(
			"<h3><center>" + _(u"Documentation et didacticiels") + "</center></h3>"
			"<p align=\"center\"><font color=red>" + 
				_(u"Attention (pour l'instant) la doc en ligne est celle de l'ancienne version d'EKD") + "</font></p>"
			"<br>"
			"<p align=\"center\"><a href=\"http://ekd.tolosano.info/Documents/Linux\">" + 	
				_(u"Documentation générale") +"</a></p>"
			"<p align=\"center\"><a href=\"http://ekd.tolosano.info/Documents/TUTtxtIm\">" +
				_(u"Didacticiel texte sur images") +"</a></p>"
			"<p align=\"center\"><a href=\"http://ekd.tolosano.info/Documents/TUTdfbv\">" +
				_(u"Didacticiel découpe de fond bleu ou vert (chroma key)") +"</a></p>"
			"<p align=\"center\"><a href=\"http://ekd.tolosano.info/Documents/TUTtrans\">" +
				_(u"Didacticiel transitions") +"</a></p>"
			"<p align=\"center\"><a href=\"http://ekd.tolosano.info/INSTekd/Linux\">" +
				_(u"Didacticiel installation sous Linux") +"</a></p>"
			)
		
		textBrowser.setOpenExternalLinks(True)
		
		#=== 2ème onglet ===#
		self.fram_2=QFrame()
		vboxFram_2=QVBoxLayout(self.fram_2)
		
		v_box_fram_2=QVBoxLayout()
		txt = ""
		txt += _(u"<p><u><b>Version</b></u>")
		txt += "<p><b>Ekd</b> v %s" %__version__
		txt_ = _(u"Cette application peut être utilisée pour des opérations de post-production pour vidéo et lots d'images")
		txt += "<p>" + txt_
		txt_ = _(u"Avril 2008")
		txt += "<p>" + txt_
		txt += """<p>Python %s - Qt %s - PyQt %s - %s""" % (
			platform.python_version(),
			QT_VERSION_STR, PYQT_VERSION_STR, platform.system())
		txt += _(u"<p><u><b>Développement</b></u>")
		txt += _(u"<p>* Lama Angelo: développeur historique du logiciel")
		txt += _(u"<p>* Romain (alteo_gange): intégration de l'interface graphique")
		txt += _(u"<p>* Jean-Rémy Bancel: travaux de développement divers")
		txt += _(u"<p><u><b>Graphisme</b></u>")
		txt += _(u"<p>* Labarussias Thomas: conception des icônes et du logo officiel")
		txt += _(u"<p><u><b>Avec la participation de ...</b></u>")
		txt += _(u"<p>* Bellegarde Laurent: tests divers et conseils")
		
		label = QLabel(txt)
		label.setTextInteractionFlags(Qt.TextSelectableByMouse|Qt.TextSelectableByKeyboard)
		v_box_fram_2.addWidget(label)
		v_box_fram_2.setAlignment(Qt.AlignHCenter)
		
		vboxFram_2.addLayout(v_box_fram_2)
		vboxFram_2.addSpacing(20)
		vboxFram_2.addStretch()
		
		#=== 3ème onglet ===#
		self.fram_3=QFrame()
		vboxFram_3=QVBoxLayout(self.fram_3)
		
		v_box_fram_3=QVBoxLayout()
		
		label_texte=QLabel(_(u"<b><center>EKD est placé sous licence libre <font color=red>GNU GPL version 3</font>: Vous pouvez l’utiliser, le copier, le modifier (l’équipe de développement souhaiterait tout de même avoir accès au code modifié) et le diffuser librement.</center></b>"))
		label_texte.setWordWrap(1)

		vboxFram_3.addWidget(label_texte)
		
		# Ajout de l'image logo GPL v3 au milieu de la fenêtre
		objImg = QImage("Icones/gplv3-127x51.png") # objet-image
		label = QLabel()
		label.setPixmap(QPixmap.fromImage(objImg)) # on inclut l'image dans le QLabel
		label.setAlignment(Qt.AlignCenter) # centrage de l'image
		
		texte_1=_(u"<h2><b>Termes de l'utilisation d'EKD par la GPL version 3</b></h2>")
		
		fh = QFile('menu_et_toolbar/copyright_ekd_gplv3_mise_en_forme.txt')
		fh.open(QIODevice.ReadOnly)
		stream = QTextStream(fh)
		stream.setCodec("UTF-8")
		texte_2 = unicode(stream.readLine())
		fh.close()
		
		texte_3="<h2><b>GNU General Public License Version 3, 29 June 2007</b></h2>"
		
		fh = QFile('menu_et_toolbar/gplv3_mise_en_forme.txt')
		fh.open(QIODevice.ReadOnly)
		stream = QTextStream(fh)
		stream.setCodec("UTF-8")
		texte_4 = unicode(stream.readLine())
		fh.close()
		
		zoneTexte = QTextEdit(texte_1+texte_2+texte_3+texte_4)
		zoneTexte.setReadOnly(True)
		zoneTexte.setMinimumHeight(458)
		
		vboxFram_3.addLayout(v_box_fram_3)
		vboxFram_3.addWidget(label)
		vboxFram_3.addWidget(zoneTexte)
		vboxFram_3.addStretch()
		
		self.index_1=self.tabwidget.addTab(textBrowser, _(u'Documentation'))
		self.index_2=self.tabwidget.addTab(self.fram_2, _(u'Développement et graphisme'))
		self.index_3=self.tabwidget.addTab(self.fram_3, _(u'Licence'))
		
		vbox_aide.addWidget(self.tabwidget)
		self.setLayout(vbox_aide)
	
	#def minimumSizeHint(self):
		#"Taille minimale pour la fenêtre"
		##self.sizeHint(QSize(700, 500))
		
		#font = QFont(self.font())
		#fm = QFontMetricsF(font)
		#largeur = fm.width(Aide_Info.WSTRING)
		#return QSize(largeur, largeur*4)


class Gui_EKD(QMainWindow):
	# -----------------------------------------
	# Classe principale . Base de l'interface .
	# -----------------------------------------
	def __init__(self, dicoModel):
		QMainWindow.__init__(self)
		
		# Vérification de la présence (si elles sont bien installées) des 
		# dépendances pour qu'EKD puisse être exécuté normalement (il
		# s'agit de Mplayer, Mencoder, Ffmeg2Theora, Python Imaging Library,
		# ImageMagick, Numpy ... et PyQt4). Comme la fenêtre d'erreur a besoin
		# de PyQt4 pour s'affcher, si PyQt4 n'est pas installé, l'erreur/les
		# applis manquantes sont aussi signalées dans le terminal.
		try:
			dependances=verifAppliManquante()
		except:
			print "\nProblème lors de la vérification des dépendances"
		
		# -----------------------------------------------------
		# Parametres Generaux de la fenetre Principale (début)
		# -----------------------------------------------------
		
		# Titre de la fenetre
		self.setWindowTitle('EnKoDeur-Mixeur')
		
		# Icone de EKD
		self.setWindowIcon(QIcon('Icones/logo_ekd.png'))
		
		#=== chargement et lecture du fichier de configuration (plutôt méthode linux) ===#
		home = unicode(QDir.homePath())
		pathConfig = home+'/.config/ekd/' # appelé depuis une fonction
		if not QDir(pathConfig).exists():
			QDir(home).mkdir('.config/ekd')
			self.fichierConf = home + '/.config/ekd/' + 'ekd.ini'
		else: self.fichierConf = pathConfig + 'ekd.ini'
		self.config = ConfigParser.ConfigParser()
		self.config.read(self.fichierConf) # lecture du fichier
		
		# si le fichier de configuration n'existe pas, on le crée
		self.creationFichierConf()
		
		# si le fichier de configuration est incomplet on ajoute des paramètres
		self.completerFichierConf()
		
		# nouvelle lecture du fichier pour prendre en compte les éventuelles modifications
		self.config.read(self.fichierConf)
		
		#=== Drapeau pour centrer l'image d'accueil de "Lecture" > "Visionner des Images" la 1ère fois ===#
		self.premierClicLectureVisImg = 1
		
		# ---------------------------------------------------------
		# Menu principal - Barre d'outils
		# ---------------------------------------------------------
		
		#=== Actions générales ===#
		quitterAction = self.createAction(_(u'&Quitter le programme'), slot=self.close,
			icon='Icones/icone_quit_128.png',tip=_(u'Quitter le programme'),signal="triggered()")
		
		self.barreOutilsAction = self.createAction(_(u"&Barre d'outils"), slot=self.barreOutils,
			tip=_(u"Barre d'outils"), checkable=True, signal="triggered()")
		
		#configurerAction = self.createAction(_(u'&Configurer EKD'), slot=self.configInterface,
			#icon='Icones/icone_config_128.png', tip=_(u'Configurer EKD'), signal="triggered()")
		
		aboutAction = self.createAction(_(u"&A propos d'EKD"), slot=self.info_aide,
			shortcut=QKeySequence.HelpContents, icon='Icones/icone_info_128.png',
			tip=_(u"A propos d'EKD"), signal="triggered()")
		
		#=== Menus ===#
		# Menu Quitter ==========================================
		menu=self.menuBar().addMenu(_(u'&Quitter'))
		menu.addAction(quitterAction)
		
		# Menu Configuration ==========================================
		self.menuConfig=self.menuBar().addMenu(_(u'&Configuration'))
		self.connect(self.menuConfig,SIGNAL("aboutToShow()"),self.affichBarreOutils)
		self.menuConfig.addAction(self.barreOutilsAction)
		#self.menuConfig.addAction(configurerAction)
		
		# Menu Aide ==========================================
		menu=self.menuBar().addMenu(_(u'&Infos'))
		menu_enfant=menu.addAction(aboutAction)
		
		#=== Barre d'outils ===#
		self.toolBar = self.addToolBar(_(u"&Barre d'outils"))
		self.toolBar.setObjectName("BarreOutils") # obligatoire pour le déplacement
		self.toolBar.setIconSize(QSize(30,30))
		
		self.toolBar.addAction(quitterAction)
		self.toolBar.addSeparator()
		#self.toolBar.addAction(configurerAction)
		#self.toolBar.addSeparator()
		self.toolBar.addAction(aboutAction)
		self.toolBar.addSeparator()
		
		# Dictionnaire pour ne pas avoir à changer la fonction connectée à chaque 
		# modif du nom d'un item . Une valeur (et non pas une clé) de notre
		# dictionnaire est unique. Elle est différente du texte de l'item pour 
		# éviter les pièges et pour pouvoir donner des noms identiques à certains 
		# items au besoin .
		self.itemDict = {}
		
		
		# ---------------------------------------------------------
		# Onglets
		# ---------------------------------------------------------
		tabWidget=QTabWidget()
		#tabWidget.setTabPosition(QTabWidget.West)
		tabWidget.setIconSize(QSize(36,36))
		self.connect(tabWidget,SIGNAL('currentChanged(int)'),self.changeOnglet)
		
		# onglet Animation ============================
		self.animSplitter = QSplitter(Qt.Horizontal)
		
		# Liste de hbox
		# Rq: les self de cette partie (sauf pour le dictionnaire) sont nécessaires
		# à l'activation les liens hypertextes du cadre d'accueil "Montage Vidéo"
		self.treeWidgetAnimation=QTreeWidget()
		
		self.animSplitter.addWidget(self.treeWidgetAnimation)
		
		self.treeWidgetAnimation.headerItem().setText(0, _(u"Vidéo"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetAnimation)
		itemTree.setText(0,_(u"Encodage"))
		self.itemDict[itemTree]="1_0_0_ANIM_sjffu16"
		itemTree.setIcon(0,QIcon("Icones/database.png"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetAnimation)
		itemTree.setText(0,_(u"Filtres vidéos"))
		self.itemDict[itemTree]="2_0_0_ANIM_vpong87"
		itemTree.setIcon(0,QIcon("Icones/database.png"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetAnimation)
		itemTree.setText(0,_(u"Montage vidéo"))
		self.itemDict[itemTree]="3_0_0_ANIM_ds55df5"
		itemTree.setIcon(0,QIcon("Icones/db_update.png"))
		
		self.itemTree_SVideo=QTreeWidgetItem(itemTree)
		self.itemTree_SVideo.setText(0,_(u"Vidéo seulement"))
		self.itemDict[self.itemTree_SVideo]="3_1_0_ANIM_uub115t"
		self.itemTree_SVideo.setIcon(0,QIcon("Icones/database.png"))
		
		self.itemTree_SVideoAudio=QTreeWidgetItem(itemTree)
		self.itemTree_SVideoAudio.setText(0,_(u"Vidéo + audio"))
		self.itemDict[self.itemTree_SVideoAudio]="3_2_0_ANIM_r4gflaz"
		self.itemTree_SVideoAudio.setIcon(0,QIcon("Icones/database.png"))
		
		self.itemTree_SDecouperVideo=QTreeWidgetItem(itemTree)
		self.itemTree_SDecouperVideo.setText(0,_(u"Découper une vidéo"))
		self.itemDict[self.itemTree_SDecouperVideo]="3_3_0_ANIM_a25486q"
		self.itemTree_SDecouperVideo.setIcon(0,QIcon("Icones/database.png"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetAnimation)
		itemTree.setText(0,_(u"Séparer vidéo et audio"))
		self.itemDict[itemTree]="4_0_0_ANIM_f45dd4s"
		itemTree.setIcon(0,QIcon("Icones/database.png"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetAnimation)
		itemTree.setText(0,_(u"Convertir des images en vidéo"))
		self.itemDict[itemTree]="5_0_0_ANIM_l5gf541"
		itemTree.setIcon(0,QIcon("Icones/database.png"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetAnimation)
		itemTree.setText(0,_(u"Convertir une vidéo en images"))
		self.itemDict[itemTree]="6_0_0_ANIM_hlmnn2v"
		itemTree.setIcon(0,QIcon("Icones/database.png"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetAnimation)
		itemTree.setText(0,_(u"Réglages supplémentaires"))
		self.itemDict[itemTree]="7_0_0_ANIM_azec514"
		itemTree.setIcon(0,QIcon("Icones/database.png"))
		
		# On déroule toutes les entrées de l'arbre
		self.treeWidgetAnimation.expandAll()
		
		# connecteur de la liste
		self.connect(self.treeWidgetAnimation,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_animation)
		
		# ajout de la liste et des widgets associés dans hbox
		self.stacked_onglet_animation=QStackedWidget()
		
		# widget principal de la page d'accueil contenant le logo ekd
		widget_img_accueil = self.widgetOngletAccueil("Icones/logo_ekd.png")
		# Drapeau pour savoir éventuellement afficher l'image d'accueil propre à l'onglet
		self.clicInitialAnim = 1
		# widget principal de la page d'accueil animation
		imageAccueilAnim = self.widgetOngletAccueil("Icones/icone_video_256.png")
		
		# page d'accueil de ekd
		self.stacked_page_accueil=self.stacked_onglet_animation.addWidget(widget_img_accueil)
		# page d'accueil de animation
		self.imageAccueilAnim=self.stacked_onglet_animation.addWidget(imageAccueilAnim)
		# Animation >> Encodage
		self.stacked_animation_encodage=self.stacked_onglet_animation.addWidget(Animation_Encodage(self))
		# Animation >> filtres vidéos
		self.stacked_animation_filtresVideos=self.stacked_onglet_animation.addWidget(Animation_FiltresVideos(self))
		# Animation >> montage vidéo 
		self.stacked_animation_MontagVideo=self.stacked_onglet_animation.addWidget(Animation_MontagVideo(self))
		# Animation >> montage vidéo >> video seulement
		self.stacked_animation_MontagVideoVidSeul=self.stacked_onglet_animation.addWidget(Animation_MontagVideoVidSeul(self))
		# Animation >> montage vidéo >> video + audio
		self.stacked_animation_MontagVideoVidPlusAudio=self.stacked_onglet_animation.addWidget(Animation_MontagVideoVidPlusAudio(self))
		# Animation >> montage vidéo >> decouper une video
		self.stacked_animation_MontagVideoDecoupUneVideo=self.stacked_onglet_animation.addWidget(Animation_MontagVideoDecoupUneVideo(self)) 
		# Animation >> separer video et audio
		self.stacked_animation_SeparVideoEtAudio=self.stacked_onglet_animation.addWidget(Animation_SeparVideoEtAudio(self))
		# Animation >> convertir des images en animation
		self.stacked_animation_ConvertirImgEnAnim=self.stacked_onglet_animation.addWidget(Animation_ConvertirImgEnAnim(self))
		# Animation >> convertir une animation en images
		self.stacked_animation_ConvertirUneAnimEnImg=self.stacked_onglet_animation.addWidget(Animation_ConvertirUneAnimEnImg(self))
		# Animation >> reglages divers
		self.stacked_animation_ReglagesDivers=self.stacked_onglet_animation.addWidget(Animation_ReglagesDivers(self))
		
		self.animSplitter.addWidget(self.stacked_onglet_animation)
		
		# ajout du widget contenant la boite dans l'onglet Animation
		i = tabWidget.addTab(self.animSplitter, QIcon("Icones/icone_video_128.png"), '')
		# Modifie la taille de l'icone dans le tabwidget
		tabWidget.setTabToolTip(i, _(u"Vidéo"))
		
		# onglet Image ================================
		self.imageSplitter = QSplitter(Qt.Horizontal)
		
		# liste de hbox
		self.treeWidgetDiversImage=QTreeWidget()
		self.imageSplitter.addWidget(self.treeWidgetDiversImage)
		
		self.treeWidgetDiversImage.headerItem().setText(0,_(u"Image"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetDiversImage)
		itemTree.setText(0,_(u"Divers"))
		self.itemDict[itemTree]="1_0_0_IMAGE_apdjf54"
		itemTree.setIcon(0,QIcon("Icones/db_update.png"))
		
		self.itemTree_PlContact=QTreeWidgetItem(itemTree)
		self.itemTree_PlContact.setText(0,_(u"Planche-contact"))
		self.itemDict[self.itemTree_PlContact]="1_1_0_IMAGE_wxwx93f"
		self.itemTree_PlContact.setIcon(0,QIcon("Icones/database.png"))
		
		self.itemTree_Information=QTreeWidgetItem(itemTree)
		self.itemTree_Information.setText(0,_(u"Information"))
		self.itemDict[self.itemTree_Information]="1_2_0_IMAGE_k1246k1"
		self.itemTree_Information.setIcon(0,QIcon("Icones/database.png"))
		
		self.itemTree_ChangFormat=QTreeWidgetItem(itemTree)
		self.itemTree_ChangFormat.setText(0,_(u"Changer format"))
		self.itemDict[self.itemTree_ChangFormat]="1_3_0_IMAGE_mm01gf6"
		self.itemTree_ChangFormat.setIcon(0,QIcon("Icones/database.png"))
	
		self.itemTree_Redimens=QTreeWidgetItem(itemTree)
		self.itemTree_Redimens.setText(0,_(u"Redimensionner"))
		self.itemDict[self.itemTree_Redimens]="1_4_0_IMAGE_oixw41g"
		self.itemTree_Redimens.setIcon(0,QIcon("Icones/database.png"))
		
		self.itemTree_TxtSurImg=QTreeWidgetItem(itemTree)
		self.itemTree_TxtSurImg.setText(0,_(u"Items sur images"))
		self.itemDict[self.itemTree_TxtSurImg]="1_5_0_IMAGE_h45u68e"
		self.itemTree_TxtSurImg.setIcon(0,QIcon("Icones/database.png"))
		
		self.itemTree_ImgComposit=QTreeWidgetItem(itemTree)
		self.itemTree_ImgComposit.setText(0,_(u"Image composite"))
		self.itemDict[self.itemTree_ImgComposit]="1_6_0_IMAGE_ii7d1rr"
		self.itemTree_ImgComposit.setIcon(0,QIcon("Icones/database.png"))
		
		self.itemTree_RenomImg=QTreeWidgetItem(itemTree)
		self.itemTree_RenomImg.setText(0,_(u"Renommer images"))
		self.itemDict[self.itemTree_RenomImg]="1_7_0_IMAGE_try2abt"
		self.itemTree_RenomImg.setIcon(0,QIcon("Icones/database.png"))
		
		self.itemTree_PourLeWeb=QTreeWidgetItem(itemTree)
		self.itemTree_PourLeWeb.setText(0,_(u"Pour le web"))
		self.itemDict[self.itemTree_PourLeWeb]="1_8_0_IMAGE_x884v03"
		self.itemTree_PourLeWeb.setIcon(0,QIcon("Icones/database.png"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetDiversImage)
		itemTree.setText(0,_(u"Transitions"))
		self.itemDict[itemTree]="2_0_0_IMAGE_pdske43"
		itemTree.setIcon(0,QIcon("Icones/db_update.png"))
		
		self.itemTree_FonduEnchaine=QTreeWidgetItem(itemTree)
		self.itemTree_FonduEnchaine.setText(0,_(u"Fondu enchaîné"))
		self.itemDict[self.itemTree_FonduEnchaine]="2_1_0_IMAGE_cz4g58f"
		self.itemTree_FonduEnchaine.setIcon(0,QIcon("Icones/database.png"))
		
		self.itemTree_Spirale=QTreeWidgetItem(itemTree)
		self.itemTree_Spirale.setText(0,_(u"Spirale"))
		self.itemDict[self.itemTree_Spirale]="2_2_0_IMAGE_n86ret5"
		self.itemTree_Spirale.setIcon(0,QIcon("Icones/database.png"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetDiversImage)
		itemTree.setText(0,_(u"Masque alpha/3D"))
		self.itemDict[itemTree]="3_0_0_IMAGE_a4a6rey"
		itemTree.setIcon(0,QIcon("Icones/db_update.png"))
		
		itemTree=QTreeWidgetItem(self.treeWidgetDiversImage)
		itemTree.setText(0,_(u"Filtres image"))
		self.itemDict[itemTree]="4_0_0_IMAGE_brt45e4"
		itemTree.setIcon(0,QIcon("Icones/db_update.png"))
		
		# On déroule toutes les entrées de l'arbre
		self.treeWidgetDiversImage.expandAll()
		
		# connecteur de la liste
		self.connect(self.treeWidgetDiversImage,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_image)
		
		# widget principal de la page d'accueil
		widget_img_accueil = self.widgetOngletAccueil("Icones/icone_images_256.png")
		
		# ajout de la liste et des widgets associés dans hbox
		self.stacked_onglet_image=QStackedWidget(self)
		# page d'accueil
		self.stacked_onglet_image.addWidget(widget_img_accueil)
		# Image >> Divers
		self.stacked_image_divers=self.stacked_onglet_image.addWidget(Image_Divers(self))
		# Image >> Divers >> Planche-contact
		self.stacked_image_divers_PlContact=self.stacked_onglet_image.addWidget(Image_Divers_PlContact(self))
		# Image >> Divers >> Information
		self.stacked_image_divers_Information=self.stacked_onglet_image.addWidget(Image_Divers_Info(self))
		# Image >> Divers >> Changer format
		self.stacked_image_divers_ChangFormat=self.stacked_onglet_image.addWidget(Image_Divers_ChangFormat(self))
		# Image >> Divers >> Redimensionner
		self.stacked_image_divers_Redimens=self.stacked_onglet_image.addWidget(Image_Divers_Redimensionner(self))
		# Image >> Divers >> Texte sur images
		self.stacked_image_divers_TxtSurImg=self.stacked_onglet_image.addWidget(Image_Divers_TxtSurImg(self))
		# Image >> Divers >> Compositing
		self.stacked_image_divers_Compositing=self.stacked_onglet_image.addWidget(Image_Divers_Compositing(self))
		# Image >> Divers >> Renommer images
		self.stacked_image_divers_RenomImg=self.stacked_onglet_image.addWidget(Image_Divers_RenomImg(self))
		# Image >> Divers >> Pour le web
		self.stacked_image_divers_PourLeWeb=self.stacked_onglet_image.addWidget(Image_Divers_PourLeWeb(self))
		# Image >> Transitions
		self.stacked_image_transitions=self.stacked_onglet_image.addWidget(Image_Transitions(self))
		# Image >> Transitions >> Fondu enchaîné
		self.stacked_image_transitions_fondEnch=self.stacked_onglet_image.addWidget(Image_Transitions_FondEnch(self))
		# Image >> Transitions >> Spirale
		self.stacked_image_transitions_Spirale=self.stacked_onglet_image.addWidget(Image_Transitions_Spirale(self))
		# Image >> Masque alpha/3D
		self.stacked_image_masque_alpha_3d=self.stacked_onglet_image.addWidget(Image_MasqueAlpha3D(self))
		# Image >> Filtres image
		self.stacked_image_filtres_image=self.stacked_onglet_image.addWidget(Image_FiltresImage(self))
		
		self.imageSplitter.addWidget(self.stacked_onglet_image)
		
		# ajout du widget contenant la boite dans l'onglet Image
		i = tabWidget.addTab(self.imageSplitter,QIcon("Icones/icone_images_128.png"),'')
		# Modifie la taille de l'icone dans le tabwidget
		tabWidget.setTabToolTip(i, _(u"Image"))
		
		# onglet Musique-son ==========================
		self.sonSplitter = QSplitter(Qt.Horizontal)
		
		# liste de hbox
		treeWidget=QTreeWidget()
		self.sonSplitter.addWidget(treeWidget)
		
		treeWidget.headerItem().setText(0, _(u"Musique-Son"))
		
		itemTree=QTreeWidgetItem(treeWidget)
		itemTree.setText(0,_(u"Encodage audio"))
		self.itemDict[itemTree]="1_0_0_MUSIC_SON_ug41yd7"
		itemTree.setIcon(0,QIcon("Icones/database.png"))
		
		# connecteur de la liste
		self.connect(treeWidget,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_musique_son)
		
		# ajout de la liste et des widgets associés dans hbox
		self.stacked_onglet_musique_son=QStackedWidget()
		
		# Musique-Son >> Encodage
		
		# page d'accueil
		# widget principal de la page d'accueil
		widget_img_accueil = self.widgetOngletAccueil("Icones/icone_sons_256.png")
		self.stacked_onglet_musique_son.addWidget(widget_img_accueil)
		self.stacked_musique_son_encodage=self.stacked_onglet_musique_son.addWidget(MusiqueSon_Encodage(self))
		
		self.sonSplitter.addWidget(self.stacked_onglet_musique_son)
		
		# ajout du widget contenant la boite dans l'onglet Musique_Son
		i = tabWidget.addTab(self.sonSplitter,QIcon("Icones/icone_sons_128.png"),'')
		# Modifie la taille de l'icone dans le tabwidget
		tabWidget.setTabToolTip(i, _(u"Musique-Son"))
		
		# onglet Lecture ==============================
		self.lectureSplitter = QSplitter(Qt.Horizontal)
		
		splitLect=QSplitter(Qt.Vertical)
		
		# liste des entrées de menu de splitLect
		treeWidget=QTreeWidget()
		splitLect.addWidget(treeWidget)
		
		# arborescence des fichiers et dossiers de "Visionner des images"
		treeViewVisioImg = QTreeView()
		model = dicoModel['visionner_images']
		treeViewVisioImg.setModel(model)
		index = model.index(QDir.homePath())
		treeViewVisioImg.setCurrentIndex(index)
		treeViewVisioImg.setExpanded(index, True)
		treeViewVisioImg.hideColumn(1)
		treeViewVisioImg.hideColumn(2)
		treeViewVisioImg.hideColumn(3)
		#treeView.expand()
		#treeView.setRootIndex(model.index(QDir.currentPath()))
		treeViewVisioImg.show()
		
		# arborescence des fichiers et dossiers de "Visionner des vidéos"
		treeViewVisioVideo = QTreeView()
		model = dicoModel['visionner_videos']
		treeViewVisioVideo.setModel(model)
		index = model.index(QDir.homePath())
		treeViewVisioVideo.setCurrentIndex(index)
		treeViewVisioVideo.setExpanded(index, True)
		#treeViewVisioVideo.setSelectionMode(QAbstractItemView.MultiSelection)
		treeViewVisioVideo.hideColumn(1)
		treeViewVisioVideo.hideColumn(2)
		treeViewVisioVideo.hideColumn(3)
		treeViewVisioVideo.show()
		
		self.stackedVisio = QStackedWidget()
		
		self.indexStacked_visioImg = self.stackedVisio.addWidget(treeViewVisioImg)
		self.indexStacked_visioVideo =self.stackedVisio.addWidget(treeViewVisioVideo)
		
		splitLect.addWidget(self.stackedVisio)
		self.lectureSplitter.addWidget(splitLect)
		
		
		# remplissage des entrées donnant accès aux cadres
		treeWidget.headerItem().setText(0, _(u"Lecture"))
		
		itemTree=QTreeWidgetItem(treeWidget)
		itemTree.setText(0,_(u"Visionner des images"))		
		self.itemDict[itemTree]="visionner_images"
		itemTree.setIcon(0,QIcon("Icones/database.png"))
		
		itemTree=QTreeWidgetItem(treeWidget)
		itemTree.setText(0,_(u"Visionner des vidéos"))
		self.itemDict[itemTree]="visionner_videos"
		itemTree.setIcon(0,QIcon("Icones/database.png"))
		
		
		# connecteur de la liste
		self.connect(treeWidget,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_lecture)
		
		# ajout de la liste et des widgets associés dans hbox
		self.stacked_onglet_lecture=QStackedWidget()
		
		# page d'accueil
		# widget principal de la page d'accueil
		widget_img_accueil = self.widgetOngletAccueil("Icones/icone_visionner_256.png")
		self.stacked_onglet_lecture.addWidget(widget_img_accueil)
		# Lecture >> Visionner des images
		self.lecture_VisionImage = Lecture_VisionImage(self)
		self.stacked_lecture_vision_image=self.stacked_onglet_lecture.addWidget(self.lecture_VisionImage)
		# Lecture >> Visionner des vidéos
		self.lecture_VisionVideo = Lecture_VisionVideo(self)
		self.stacked_lecture_vision_video=self.stacked_onglet_lecture.addWidget(self.lecture_VisionVideo)
		
		# connection TreeView->UpdateDir
		self.connect(treeViewVisioImg,SIGNAL("clicked(QModelIndex)"), self.lecture_VisionImage.updateDir)
		self.connect(treeViewVisioVideo,SIGNAL("clicked(QModelIndex)"), self.lecture_VisionVideo.updateDir)
		#self.lecture_VisionImage.updateDir(os.path.expanduser('~'))
		
		self.lectureSplitter.addWidget(self.stacked_onglet_lecture)
		
		# ajout du widget contenant la boite dans l'onglet Lecture
		self.indexTabLecture = tabWidget.addTab(self.lectureSplitter,
				QIcon("Icones/icone_visionner_128.png"),'')
		# Modifie la taille de l'icone dans le tabwidget
		tabWidget.setTabToolTip(self.indexTabLecture, _(u"Lecture"))
		
		# onglet Mode Séquentiel ===========================
		
		# En construction
		if len(sys.argv)==2 and sys.argv[1]=="sequentiel":
			# widget de base du dernier onglet
			sequentiel = Sequentiel()
			
			# ajout du widget contenant la boite dans l'onglet Séquentiel
			i = tabWidget.addTab(sequentiel,QIcon("Icones/icone_sequenciel_128.png"),'')
			tabWidget.setTabToolTip(i, _(u"Conversions séquentielles"))
		
		
		# -----------------
		# Barre des tâches
		# -----------------
		self.statusBar().showMessage(u'Prêt?', 5000)
		
		# affichage des onglets au centre de la fenêtre
		self.setCentralWidget(tabWidget)
		
		# A pour effet d'assurer une taille minimale
		# aux QTreeWidget lors de la 1ère ouverture de ekd
		self.animSplitter.setStretchFactor(0, 3)
        	self.animSplitter.setStretchFactor(1, 4)
		self.imageSplitter.setStretchFactor(0, 3)
        	self.imageSplitter.setStretchFactor(1, 4)
		self.sonSplitter.setStretchFactor(0, 1)
        	self.sonSplitter.setStretchFactor(1, 4)
		self.lectureSplitter.setStretchFactor(0, 1)
        	self.lectureSplitter.setStretchFactor(1, 1)
		
		#--------------------------------------------------
		# Paramètres généraux de la fenêtre (suite et fin)
		#--------------------------------------------------
		# Paramètres contenus dans ~/.config/ekd/ekd.conf sous linux
		settings = QSettings()
		#self.recentRepertory = settings.value("RecentRepertory").toStringList()
		size = settings.value("MainWindow/Size", QVariant(QSize(900, 800))).toSize()
		#size = settings.value("MainWindow/Size", QVariant(QSize(900, 800))).toSize()
		self.resize(size)
		position = settings.value("MainWindow/Position",QVariant(QPoint(0, 0))).toPoint()
		self.move(position)
		self.restoreState(settings.value("MainWindow/State").toByteArray())
		self.animSplitter.restoreState(settings.value("AnimSplitter").toByteArray())
		self.imageSplitter.restoreState(settings.value("ImageSplitter").toByteArray())
		self.sonSplitter.restoreState(settings.value("SonSplitter").toByteArray())
		self.lectureSplitter.restoreState(settings.value("LectureSplitter").toByteArray())
	
	
	def non_implemente(self):
		print "Non implemente !"
		
		
	def info_aide(self):
		""" Chargement de la classe de la boîte de dialogue pour afficher
		l'aide en ligne (affichée dans le browser web par défaut du système),
		les infos de développement et la licence """
		aide_info = Aide_Info(self)
		aide_info.show()
		
		
	## --------------------------------------------------------------------------
	#def configInterface(self):
		#""" Configuration de l'interface (notamment la barre des taches) """
		
		## Boite de dialogue
		#self.dialog = QDialog()
		#self.dialog.setMinimumSize(QSize(700, 500))
		## Titre de la fenetre
		#self.dialog.setWindowTitle(_(u'Configuration'))
		
		#vbox_config=QVBoxLayout()
		
		#self.tabwidget=QTabWidget()
		
		##=== 1er onglet ===#
		#self.fram_1=QFrame()
		#vboxFram_1=QVBoxLayout(self.fram_1)
		
		## boite de combo (QA: quoi afficher)
		#self.comboConfigQA=QComboBox()
		#listeComboConfigQA=[(_(u'Barre des taches uniquement (par défaut)'), 'barr_tach_uniq'), (_(u'Menu uniquement'), 'menu_uniq'), (_(u'Menu plus barre des taches'), 'menu_plus_barr_tach')]
		
		## Insertion des url dans la combo box
		#for i in listeComboConfigQA:
                	#self.comboConfigQA.addItem(i[0],QVariant(i[1]))
		#self.connect(self.comboConfigQA, SIGNAL("activated(int)"), self.changerComboQA)
		
		#self.boutConfigBT=QPushButton(_(u"Cliquez ici pour afficher/ne pas afficher"))
		#self.boutConfigBT.setFocusPolicy(Qt.NoFocus)
		#self.connect(self.boutConfigBT, SIGNAL("clicked()"), self.quoiAfficher)
		
		#v_box_fram_1=QVBoxLayout()
		#v_box_fram_1.addWidget(QLabel(_(u"<u><b>Qu'est ce qui doit être affiché ?</b></u>")))
		#v_box_fram_1.addWidget(self.comboConfigQA)
		#v_box_fram_1.addWidget(self.boutConfigBT)
		#v_box_fram_1.setAlignment(Qt.AlignHCenter)
		
		#vboxFram_1.addLayout(v_box_fram_1)
		#vboxFram_1.addSpacing(20)
		#vboxFram_1.addStretch()
		
		#self.index_1=self.tabwidget.addTab(self.fram_1, _(u'Menu/barre des taches'))
		
		#vbox_config.addWidget(self.tabwidget)
		#self.dialog.setLayout(vbox_config)
		#self.dialog.exec_()
	
	def affichBarreOutils(self):
		"L'état de la case à cocher de l'entrée «Barre d'outils» est généré lors du clic sur le menu"
		self.barreOutilsAction.setChecked(self.toolBar.isVisible())
	
	def barreOutils(self):
		"Affichage/masquage de la barre d'outils"
		print self.toolBar.isVisible()
		self.toolBar.setVisible(not self.toolBar.isVisible())
	
	def changerComboQA(self):
		""" Affichage de l'index du combo """
		print self.comboConfigQA.currentIndex()
			
			
	def quoiAfficher(self):
		""" L'utilisateur fait le choix de ce qui doit être visible
		entre le menu, la barre des taches et les deux en même temps """
		if self.comboConfigQA.currentIndex()==0:
			# Uniquement la barre des taches sera visible
			self.menuBar().hide()
			self.toolBar.show()
		elif self.comboConfigQA.currentIndex()==1:
			# Uniquement le menu sera visible
			self.menuBar().show()
			self.toolBar.hide()
		elif self.comboConfigQA.currentIndex()==2:
			# Les deux seront affichés
			self.menuBar().show()
			self.toolBar.show()
	# --------------------------------------------------------------------------
	
	
	def closeEvent(self, event):
		"actions à effectuer au moment de quitter"
		reply = QMessageBox.question(self, 'Message',_(u"Voulez-vous sauver les nouveaux paramètres de configuration?"), QMessageBox.Yes,QMessageBox.No)
		if reply == QMessageBox.Yes:
			self.config.write(open(self.fichierConf,'w'))	# sauver les paramètres de configuration
			settings = QSettings()
			#recentRepertory = QVariant(self.recentRepertory) \
				#if self.recentRepertory else QVariant()
			#settings.setValue("RecentRepertory", recentRepertory)
			settings.setValue("MainWindow/Size", QVariant(self.size()))
			settings.setValue("MainWindow/Position",QVariant(self.pos()))
			settings.setValue("MainWindow/State",QVariant(self.saveState()))
			settings.setValue("AnimSplitter", QVariant(self.animSplitter.saveState()))
			settings.setValue("ImageSplitter", QVariant(self.imageSplitter.saveState()))
			settings.setValue("SonSplitter", QVariant(self.imageSplitter.saveState()))
			settings.setValue("LectureSplitter", QVariant(self.imageSplitter.saveState()))
			event.accept()
		else:
			event.accept()
	
	
	def creationFichierConf(self):
		"si le fichier de configuration n'existe pas, on le crée"
		try:
			file(self.fichierConf)
		except:
			print "le fichier de configuration n'existe pas -> on le crée"
			fichierOb=open(self.fichierConf,'w')
			fichierOb.close()
		
		
	def completerFichierConf(self):
		"si le fichier de configuration est incomplet on y ajoute des paramètres"
		
		# dictionnaire: dico[section]=((option1,valeur1),(option2,valeur2),...)
		# NE PAS OUBLIER LA VIRGULE À LA FIN QUAND IL N'Y A QU'UN TUPLE!!! ),) ou ),)}
		# les valeurs path n'ont rien à faire dans le dictionnaire (gérés directement dans les cadres)
		dicoConf={'Animation - Encodage':(
				('macromediaflashvideo',500),
				('codecmpeg1',2),
				('codecmpeg2',2),
				('codecdivx4',2),
				('codecwmv2',2),
				('codecmotionjpeg',2),
				('codecoggtheora',5),
				('codec', 'copie')),
			'Animation - FiltresVideo':(
				('valeur_bruit_luma',23),
				('valeur_bruit_chroma',25),
				('type_bruit_luma','bruituniforme'),
				('type_bruit_chroma','bruituniforme'),
				('luminosite',0),
				('contraste',0),
				('decouper_largeur',800),
				('decouper_longueur',600),
				('couleur',0),
				('saturation',0),
				('flou_boite_rayon',1),
				('flou_boite_puissance',1),
				('codec', 'niveaudegris')),
			'Animation - Separer Audio et Video':(
				('type_extraction', 'video&audio'),),
			'Animation - Convertir des Images en Video':(
				('codec','mpeg1video'),
				('nbr_img_sec',25),
				('nbr_img_sec_mpeg1video',25)),
			'Animation - Convertir Une Video en Images':(),
			'Animation - Reglages Supplementaires':(('spin', 22),),
			'Animation - Decouper une Video':(),
			'Animation - Montage Video Seul':(
				('type_ordre_montage', 'sans_ordre_alpha'),),
			'Animation - Montage Video et Audio':(
				('type_ordre_montage', 'sans_ordre_alpha'),),
			'Animation':(),
			'Image':(),
				}
		
		for section in dicoConf.keys(): # est-ce que toutes les sections existent?
			print section
			if not self.config.has_section(section): # la fct n'existe pas -> création
				self.config.add_section(section)
			for opt_val in dicoConf[section]: # est-ce que toutes les options existent?
				print opt_val, '\n'
				if not self.config.has_option(section,opt_val[0]): # la valeur n'existe pas -> création
					self.config.set(section,opt_val[0],opt_val[1])
		
		self.config.write(open(self.fichierConf,'w'))	# sauver les paramètres de configuration
	
	
	def changeOnglet(self,i):
		"""Effacer les données de la barre des tâches lorsque l'on change d'onglet"""
		if i==1 and self.clicInitialAnim:
			self.stacked_onglet_animation.setCurrentIndex(self.imageAccueilAnim)
			self.clicInitialAnim = 0
		self.statusBar().clearMessage()
	
	
	def createAction(self, text, slot=None, shortcut=None, icon=None,
			tip=None, checkable=False, signal="triggered()"):
		action = QAction(text, self)
		if icon is not None:
			action.setIcon(QIcon(icon))
		if shortcut is not None:
			action.setShortcut(shortcut)
		if tip is not None:
			action.setToolTip(tip)
			action.setStatusTip(tip)
		if slot is not None:
			self.connect(action, SIGNAL(signal), slot)
		if checkable:
			action.setCheckable(True)
		return action
	
	
	def widgetOngletAccueil(self, cheminImg):
		"Widget principal de la page d'accueil d'un onglet"
		widget_img_accueil=QWidget()
		# fond gris
		widget_img_accueil.setStyleSheet("QWidget { background-color: %s }"\
				% QColor(140,140,140).name())
		hbox_label=QHBoxLayout(widget_img_accueil)
		objImg = QPixmap(cheminImg) # objet-image
		label = QLabel()
		label.setPixmap(objImg) # on inclut l'image dans le QLabel
		hbox_label.addStretch() # centrage horizontal
		hbox_label.addWidget(label)
		hbox_label.addStretch() # centrage horizontal
		return widget_img_accueil
	
	
	def liste_animation(self, item):
		"""Les éléments de la liste 1 modifient le contenu de la boite de droite de l'onglet animation"""
		# item renvoie la référence de l'objet QTreeWidgetItem.
		
		idItem=self.itemDict[item]
		
		# Effacer les données de la barre des tâches lorsque l'on change d'entrée de l'arborescence
		self.statusBar().clearMessage()
		
		self.clicInitialAnim = 0
		
		if idItem=="1_0_0_ANIM_sjffu16":	# Encodage
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_encodage) # changer la partie droite de l'onglet
		elif idItem=="2_0_0_ANIM_vpong87":	# Filtres Vidéos
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_filtresVideos)
		elif idItem=="3_0_0_ANIM_ds55df5":	# Montage video
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_MontagVideo)
		elif idItem=="3_1_0_ANIM_uub115t":	# Montage video : video seul
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_MontagVideoVidSeul)
		elif idItem=="3_2_0_ANIM_r4gflaz":	# Montage video : video + audio
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_MontagVideoVidPlusAudio)
		elif idItem=="3_3_0_ANIM_a25486q":	# Montage video : decouper une video
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_MontagVideoDecoupUneVideo)
		elif idItem=="4_0_0_ANIM_f45dd4s":	# Separer video et audio
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_SeparVideoEtAudio)
		elif idItem=="5_0_0_ANIM_l5gf541":	# Convertir des images en animation
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_ConvertirImgEnAnim)
		elif idItem=="6_0_0_ANIM_hlmnn2v":	# Convertir une animation en images
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_ConvertirUneAnimEnImg)
		elif idItem=="7_0_0_ANIM_azec514":	# Reglages divers
			self.stacked_onglet_animation.setCurrentIndex(self.stacked_animation_ReglagesDivers)
	
	
	def liste_image(self, item):
		"""Les éléments de la liste 2 modifient le contenu de la boite de droite de l'onglet images"""
		# item renvoie la référence de l'objet QTreeWidgetItem.

		idItem=self.itemDict[item]
		if idItem=="1_0_0_IMAGE_apdjf54":	# Divers
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_divers)
		elif idItem=="1_1_0_IMAGE_wxwx93f":	# Divers : Planche-contact
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_divers_PlContact)
		elif idItem=="1_2_0_IMAGE_k1246k1":	# Divers : Information
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_divers_Information)
		elif idItem=="1_3_0_IMAGE_mm01gf6":	# Divers : Changer format
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_divers_ChangFormat)
		elif idItem=="1_4_0_IMAGE_oixw41g":	# Divers : Redimensionner
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_divers_Redimens)
		elif idItem=="1_5_0_IMAGE_h45u68e":	# Divers : Texte sur images
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_divers_TxtSurImg)
		elif idItem=="1_6_0_IMAGE_ii7d1rr":	# Divers : Compositing
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_divers_Compositing)
		elif idItem=="1_7_0_IMAGE_try2abt":	# Divers : Renommer images
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_divers_RenomImg)
		elif idItem=="1_8_0_IMAGE_x884v03":	# Divers : Pour le web
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_divers_PourLeWeb)
		elif idItem=="2_0_0_IMAGE_pdske43":	# Transitions
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_transitions)
		elif idItem=="2_1_0_IMAGE_cz4g58f":	# Transitions : Fondu Enchaîné
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_transitions_fondEnch)
		elif idItem=="2_2_0_IMAGE_n86ret5":	# Transitions : Spirale
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_transitions_Spirale)
		elif idItem=="3_0_0_IMAGE_a4a6rey":	# Masque alpha/3D
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_masque_alpha_3d)
		elif idItem=="4_0_0_IMAGE_brt45e4":	# Filtres image
			self.stacked_onglet_image.setCurrentIndex(self.stacked_image_filtres_image)
	
	
	def liste_musique_son(self, item):
		"""Les éléments de la liste 1 modifient le contenu de la boite de droite de l'onglet musique_son"""
		# item renvoie la référence de l'objet QTreeWidgetItem.
		
		idItem=self.itemDict[item]
		
		if idItem=="1_0_0_MUSIC_SON_ug41yd7":	# Musique-son : Encodage
			# changer la partie droite de l'onglet
			self.stacked_onglet_musique_son.setCurrentIndex(self.stacked_musique_son_encodage)
	
	
	def liste_lecture(self, item):
		"""Les éléments de la liste 1 modifient le contenu de la boite de droite de l'onglet lecture"""
		# item renvoie la référence de l'objet QTreeWidgetItem.
		
		idItem=self.itemDict[item]
		
		if idItem=="visionner_videos":	# Lecture : Visionner des vidéos
			# changer la partie droite de l'onglet
			self.stacked_onglet_lecture.setCurrentIndex(self.stacked_lecture_vision_video)
			self.stackedVisio.setCurrentIndex(self.indexStacked_visioVideo)
		elif idItem=="visionner_images": # Lecture : Visionner des images
			self.stacked_onglet_lecture.setCurrentIndex(self.stacked_lecture_vision_image)
			self.stackedVisio.setCurrentIndex(self.indexStacked_visioImg)
			# Centrage de l'image d'accueil
			if self.premierClicLectureVisImg:
				self.lecture_VisionImage.afficheurImg.setTailleFenetre()
				self.premierClicLectureVisImg = 0



if __name__ == "__main__":
	
	app = QApplication(sys.argv)
	
	# Traduction des boites de dialogue Qt
	locale = unicode(QLocale.system().name()) # ex: fr_FR
	print "\n\n", locale
	qtTranslator = QTranslator()
	try: symboleLangue = locale.split('_')[0] # ex: fr
	except ValueError, e:
		print e
		symboleLangue = "inconnu"
	if qtTranslator.load("qt_"+locale, "locale/"+symboleLangue):
		app.installTranslator(qtTranslator)
	# Nom du répertoire et du début du fichier de configuration
	app.setOrganizationName("ekd")
	app.setApplicationName("ekd")
	app.setOrganizationDomain("ekd-forum.tolosano.info")
	
	# Traduction générale
	## Pour les tests
	#chemin = "locale/fr/LC_MESSAGES/ekd_"+symboleLangue+".po"
	#print "Chemin éventuel du *.po de traduction:", chemin
	#print "Existe-t-il un fichier *.po de traduction?", QFileInfo(chemin).exists()
	#Peu importe que le fichier existe ou pas, la ligne suivante est à priori nécessaire
	gettext.install("ekd_"+symboleLangue, "locale")
	
	dicoModel = {}
	model = QDirModel()
	model.setFilter(QDir.Dirs | QDir.NoDotAndDotDot)
	dicoModel['visionner_images'] = model
	filtres_option = QDir.AllDirs | QDir.Files | QDir.NoDotAndDotDot
	filtres = QStringList()
	filtres << "*.avi" << "*.mpg" << "*.mpeg" << "*.mjpeg" << "*.flv" << "*.mp4" << "*.ogg"
	model = QDirModel(filtres, filtres_option, QDir.DirsFirst)
	dicoModel['visionner_videos'] = model
	
	main = Gui_EKD(dicoModel)
	main.show()
	sys.exit(app.exec_())