1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import os, re
  5. import sys
  6. from gui_modules_music_son.music_son_base_sox import checkSoxEncoding
  7. from moteur_modules_common.EkdProcess import EkdProcess
  8. from moteur_modules_common.EkdTools import debug
  9. from PyQt4.QtCore import Qt, SIGNAL, QSize, QFile, QIODevice, QTextStream
  10. from PyQt4.QtCore import QLocale, QTranslator, QStringList
  11. from PyQt4.QtGui import QDialog, QTabWidget, QVBoxLayout, QFrame, QTextBrowser
  12. from PyQt4.QtGui import QPixmap, QDialogButtonBox, QImage, QMainWindow
  13. from PyQt4.QtGui import QApplication, QMessageBox, QStyleFactory
  14.  
  15.  
  16. # Pour windows uniquement
  17. if os.name == 'nt':
  18. "#! "+sys.executable
  19.  
  20. '''
  21. -----------------------------------------------------------------------
  22. GPL v3
  23. -----------------------------------------------------------------------
  24. EKD can be used to make post production operations for video files and images.
  25. Copyright (C) 2008 Lama Angelo (the historical developer of the
  26. program) with the contribution of Aurélien Cedeyn and Olivier Ponchaut to
  27. this 2010 version of EKD.
  28.  
  29. EKD is free software; you can redistribute it and/or modify it under
  30. the terms of the GNU General Public License as published by the Free
  31. Software Foundation; either version 3 of the License, or (at your
  32. option) any later version.
  33.  
  34. EKD is distributed in the hope that it will be useful, but WITHOUT
  35. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  36. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  37. for more details.
  38.  
  39. You should have received a copy of the GNU General Public License
  40. along with this program; if not, see http://www.gnu.org/licenses
  41. or write to the Free Software Foundation,Inc., 51 Franklin Street,
  42. Fifth Floor, Boston, MA 02110-1301 USA
  43.  
  44. To contact the developpers of EKD, go here:
  45. http://ekd.tuxfamily.org/forum/forumdisplay.php?fid=8
  46. -----------------------------------------------------------------------
  47. '''
  48.  
  49. ### Vérification des possibilités ffmpeg - Sox ########
  50. import subprocess
  51. ###############################################################################
  52. import gettext
  53.  
  54.  
  55. ### Import de minidom pour Videoporama
  56. ##############################################################
  57. from xml.dom import minidom
  58.  
  59.  
  60.  
  61. def verifAppliManquante():
  62. """# -------------------------------------
  63. # Dépendances ...
  64. # Vérification de la présence des logs
  65. # indispensables au lancement d'EKD
  66. # -------------------------------------"""
  67.  
  68. print ""
  69. manquantes = []
  70.  
  71. ##########################################################################
  72. all = ['pyqt4', 'python imaging library', 'numpy', 'mplayer', 'mencoder',\
  73. 'imagemagick', 'ffmpeg', 'ffmpeg2theora', 'lame', 'mjpegtools', 'sox']
  74. ##########################################################################
  75.  
  76. ### Les vérifications pour FFMPEG sont valable pour Win.
  77. if os.name in ['posix', 'mac']:
  78.  
  79. commandesBash = ['mplayer', 'mencoder', 'composite', 'ffmpeg',
  80. 'ffmpeg2theora', 'lame', 'ppmtoy4m', 'sox']
  81.  
  82. for commande in commandesBash:
  83. resultat = os.popen("which " + commande).readline()
  84. if not resultat:
  85. if commande == 'composite': manquantes.append('imagemagick')
  86. # ppmtoy4m est inclu dans mjpegtools dans ubuntu hardy #########
  87. elif commande == 'ppmtoy4m': manquantes.append('mjpegtools')
  88. else: manquantes.append(commande)
  89. ####################################################################
  90.  
  91. fmsg = 0
  92. msgffmpeg = QStringList()
  93. listformats = QStringList()
  94. convertformat = []
  95.  
  96. #f = subprocess.Popen("ffmpeg -version", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid)
  97. f = EkdProcess("ffmpeg -version")
  98.  
  99. ffmpeglib=[[0,"raw","RAW DV (dv)","","dv"],[1,"VCD","VCD","","mpg"],[2,"SVCD","SVCD","","mpg"],[3,"DVD","DVD","","mpg"],[4,"flv","Flash FLV","","flv"],[5,"libtheora","Theora (ogg)","--enable-libtheora","ogg"],[6,"mjpeg","MJPEG (avi)","","avi"],[7,"libxvid","Xvid (avi)","--enable-libxvid","avi"],[8,"libx264","H264 (avi)","--enable-libx264","avi"]]
  100.  
  101. verffmpeg = f.communicate()[1]
  102. # Vérification de la version de FFmpeg pour les fonctions AVCHD
  103. z = verffmpeg.split("\n")
  104. avchd = False
  105. for a in z :
  106. ## Utilisation des expression regulières
  107. if re.match('\s+libavformat.*', a):
  108. ffmpegversion = re.findall("\d+", a)[0]
  109. if int(ffmpegversion) >= 52 :
  110. avchd = True
  111.  
  112. for ff in ffmpeglib :
  113. if verffmpeg.find(ff[3]) == -1 :
  114. fmsg = 1
  115. msgffmpeg.append(u"Le package ffmpeg installé n'inclut pas %s et n'est pas capable d'encoder en %s. Ce format sera désactivé de l'interface utilisateur." % (ff[1],ff[2]))
  116. else :
  117. listformats.append(ff[2])
  118. convertformat.append((ff[0],ff[1],ff[4]))
  119. #s = subprocess.Popen("sox -h", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid).communicate()[0]
  120. s = EkdProcess("sox -h").communicate()[0]
  121. soxErr=0
  122. msgsox = QStringList()
  123. if s.find("wav") == -1 :
  124. soxErr = 1
  125. msgsox.append(_(u"Le format Wav n'est pas supporté par votre package SoX. Ajouter les paquets nécessaires au départ des dépôts de votre distribution sans quoi vous ne serez pas en mesure de faire des diaporamas d'image vidéo."))
  126. if s.find("ogg") == -1 :
  127. soxErr = 1
  128. msgsox.append(_(u"Le format Ogg n'est pas supporté par votre package SoX. Ajouter les paquets nécessaires au départ des dépôts de votre distribution sans quoi vous ne serez pas en mesure d'utiliser des fichiers son au format Ogg."))
  129. if s.find("mp3") == -1 :
  130. soxErr = 1
  131. msgsox.append(_(u"Le format Mp3 n'est pas supporté par votre package SoX. Ajouter les paquets nécessaires au départ des dépôts de votre distribution sans quoi vous ne serez pas en mesure d'utiliser des fichiers son au format Mp3."))
  132. ############################################################################################################
  133.  
  134. try: from PyQt4 import QtGui, QtCore
  135. except ImportError, e:
  136. manquantes.append('python-qt4')
  137. print "ImportError:", e
  138.  
  139. try: from numpy import lib
  140. except ImportError, e:
  141. manquantes.append('python-numpy')
  142. print "ImportError:", e
  143.  
  144. try: from PIL import Image
  145. except ImportError, e:
  146. manquantes.append('python-imaging')
  147. print "ImportError:", e
  148.  
  149. a=u'\n'+u'='*40+u'\n'
  150. if manquantes:
  151. apps = u', '.join(manquantes)
  152. m1=u"Les applications suivantes n'ont pas été détectées:\n"
  153. m2=u"\nEKD ne sera pas pleinement fonctionnel (s'il démarre...)\n\
  154. \nYou must install the packages:\n"
  155. print a,m1.encode("UTF-8"),apps.encode("UTF-8"),m2.encode("UTF-8"),apps.encode("UTF-8"),a,msgffmpeg,msgsox
  156. return 0, ', '.join(manquantes), fmsg, msgffmpeg, listformats, convertformat, soxErr, msgsox
  157.  
  158. else:
  159. print u'PyQT version : ', QtCore.PYQT_VERSION_STR
  160. m = u"Toutes les dépendances sont satisfaites\n\nAll packages are installed"
  161. return 1, ', '.join(all), fmsg, msgffmpeg, listformats, convertformat, soxErr, msgsox, avchd
  162.  
  163.  
  164. import ConfigParser, locale, platform
  165.  
  166. os.chdir(os.path.dirname(os.path.abspath(sys.argv[0])))
  167.  
  168. # Version de ekd
  169. __version__ = "2.0.5"
  170.  
  171.  
  172. class Aide_Info(QDialog):
  173. '''# -------------------------------------------------------------
  174. # Classe pour Chargement de la boîte de dialogue pour afficher
  175. # l'aide en ligne (affichée dans le browser web par défaut du
  176. # système), les infos de développement et la licence
  177. # -------------------------------------------------------------
  178. '''
  179. ## La largeur de la fenêtre est définie de façon à pouvoir afficher les caractères suivants sur une ligne
  180. #WSTRING = "EKD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public"
  181.  
  182. def __init__(self, parent=None):
  183. QDialog.__init__(self, parent)
  184.  
  185. self.setAttribute(Qt.WA_DeleteOnClose)
  186.  
  187. self.setMinimumSize(QSize(800, 600))
  188. # Titre de la fenetre
  189. self.setWindowTitle(_(u'Infos'))
  190.  
  191. vbox_aide=QVBoxLayout()
  192.  
  193. self.tabwidget=QTabWidget()
  194.  
  195. #=== 1er onglet ===#
  196. self.fram_2=QFrame()
  197. vboxFram_2=QVBoxLayout(self.fram_2)
  198.  
  199. txt = ""
  200. txt += _(u"<p><u><b>Version</b></u>")
  201. txt += "<p><b>Ekd</b> v %s" % __version__
  202. txt_ = _(u"Cette application peut être utilisée pour des opérations de post-production pour vidéo et lots d'images")
  203. txt += "<p>" + txt_
  204. txt_ = _(u"Août 2010")
  205. txt += "<p>" + txt_
  206. txt += """<p>Python %s - Qt %s - PyQt %s - %s""" % (
  207. platform.python_version(),
  208. QT_VERSION_STR, PYQT_VERSION_STR, platform.system())
  209. txt += _(u"<p><u><b>Développement</b></u>")
  210. txt += _(u"<p>* Lama Angelo: développeur historique du logiciel")
  211. txt += _(u"<p>* Olivier Ponchaut (Marmotte): développeur")
  212. txt += _(u"<p>* Aurélien Cedeyn (Ptah): développeur")
  213. txt += _(u"<p><u><b>Anciens développeurs :</b></u>")
  214. txt += _(u"<p>* Romain (alteo_gange): intégration de l'interface graphique")
  215. txt += _(u"<p>* Jean-Rémy Bancel: travaux de développement divers")
  216. txt += _(u"<p><u><b>Traduction anglaise</b></u>")
  217. txt += _(u"<p>* Bellegarde Sophie")
  218. txt += _(u"<p>* Bellegarde Laurent")
  219. txt += _(u"<p><u><b>Traduction espagnole</b></u>")
  220. txt += _(u"<p>* Jesús MUÑOZ")
  221. txt += _(u"<p><u><b>Graphisme</b></u>")
  222. txt += _(u"<p>* Labarussias Thomas: conception des icônes et du logo officiel")
  223. txt += _(u"<p><u><b>Avec la participation de ...</b></u>")
  224. txt += _(u"<p>* Bellegarde Laurent: tests divers et conseils")
  225. txt += _(u"<p>* Lusson Julien: tests divers et conseils")
  226. txt += _(u"<p><u><b>Partenariat (le projet EKD est soutenu par):</b></u>")
  227. txt += _(u"<p>* Lprod: http://fr.lprod.org")
  228. txt += _(u"<p>* Le collège Dunois à Caen (France): http://lcs.dunois.clg14.ac-caen.fr/~site-web")
  229. txt += _(u"<p><u><b>Suivre EKD:</b></u>")
  230. txt += _(u"<p>* Le site: http://ekd.tuxfamily.org")
  231. txt += _(u"<p>* Le blog: http://ekdm.wordpress.com")
  232. txt += _(u"<p>* Le forum: http://ekd.tuxfamily.org/forum")
  233.  
  234. zoneText = QTextEdit(txt)
  235. if PYQT_VERSION_STR >= "4.1.0":
  236. zoneText.setTextInteractionFlags(Qt.TextSelectableByMouse|Qt.TextSelectableByKeyboard)
  237. zoneText.setReadOnly(True)
  238.  
  239. vboxFram_2.addWidget(zoneText,1)
  240. vboxFram_2.setAlignment(Qt.AlignHCenter)
  241. vboxFram_2.addStretch()
  242. #########################################################################################################################
  243.  
  244. #=== 2ème onglet ===#
  245. if PYQT_VERSION_STR >= "4.1.0":
  246. textBrowser = QTextBrowser()
  247.  
  248. textBrowser.setHtml(
  249. "<h3><center>" + _(u"Documentation et didacticiels") + "</center></h3>"
  250.  
  251. "<br>"
  252. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/Linux\">" +
  253. _(u"Documentation générale") +"</a></p>"
  254. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/MenuEtBarreOutils\">" +
  255. _(u"Barre d'outils et configuration d'EKD") +"</a></p>"
  256. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/TraitementVideoPresentation\">" +
  257. _(u"Le traitement vidéo par l&#8217;exemple") +"</a></p>"
  258. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/TraitementImagePresentation\">" +
  259. _(u"Le traitement des images par l&#8217;exemple") +"</a></p>"
  260. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/VideoFiltres\">" +
  261. _(u"Les filtres vidéo") +"</a></p>"
  262. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/VideoMontageVideo\">" +
  263. _(u"Le montage vidéo") +"</a></p>"
  264. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/VideoTitrageDansVideo\">" +
  265. _(u"Titrage dans une vidéo") +"</a></p>"
  266. "<p align=\"center\"><a href=\"http://ekdm.wordpress.com/2009/11/09/gestion-de-lavchd-dans-ekd\">" +
  267. _(u"Gestion de l'AVCHD dans EKD") +"</a></p>"
  268. "<p align=\"center\"><a href=\"http://ekdm.wordpress.com/2010/01/02/la-gestion-de-projet-dans-ekd\">" +
  269. _(u"La gestion de projet dans EKD") +"</a></p>"
  270. "<p align=\"center\"><a href=\"http://ekdm.wordpress.com/2010/01/18/structure-du-format-de-fichier-pour-ekd\">" +
  271. _(u"Structure du format de fichier pour EKD") +"</a></p>"
  272. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/ImagesPlancheContact\">" +
  273. _(u"Planche-contact pour les images") +"</a></p>"
  274. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/ImagesInformation\">" +
  275. _(u"Informations pour les images/photos") +"</a></p>"
  276. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/AjoutElements\">" +
  277. _(u"Ajout d&#8217;éléments (texte/images)") +"</a></p>"
  278. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/ImageComposite\">" +
  279. _(u"Faire du compositing avec EKD") +"</a></p>"
  280. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/RenommageImages\">" +
  281. _(u"Le renommage d&#8217;images dans EKD") +"</a></p>"
  282. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/Transitions\">" +
  283. _(u"Transitions pour les images") +"</a></p>"
  284. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/MasqueAlpha3D\">" +
  285. _(u"Masque alpha/3D (chroma key) pour les images") +"</a></p>"
  286. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/FiltresImage\">" +
  287. _(u"Les différents filtres image pour EKD") +"</a></p>"
  288. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/LectureImage\">" +
  289. _(u"Visionner des images sous EKD") +"</a></p>"
  290. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/LectureVideo\">" +
  291. _(u"Lecture de vidéos dans EKD") +"</a></p>"
  292. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/INSTekd/Linux\">" +
  293. _(u"Installation des sources d&#8217;EKD sous Linux") +"</a></p>"
  294. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/KitWindows\">" +
  295. _(u"Kit EKD Windows à partir du dépôt SVN") +"</a></p>"
  296. "<p align=\"center\"><a href=\"http://ekd.tuxfamily.org/index.php/Documents/ConstructExeWindows\">" +
  297. _(u"Construire un exécutable d&#8217;EKD pour Windows") +"</a></p>"
  298. )
  299.  
  300. textBrowser.setOpenExternalLinks(True)
  301.  
  302. else:
  303. # On fait au plus simple sous debian etch
  304. textBrowser = QWidget()
  305. vboxLiens = QVBoxLayout(textBrowser)
  306. lab = EkdLabel(_(u"Documentation générale"),"http://ekd.tuxfamily.org/index.php/Documents/Linux")
  307. vboxLiens.addWidget(lab, 0, Qt.AlignTop)
  308.  
  309. #=== 3ème onglet ===#
  310. self.fram_3=QFrame()
  311. vboxFram_3=QVBoxLayout(self.fram_3)
  312.  
  313. v_box_fram_3=QVBoxLayout()
  314.  
  315. label_texte=QLabel(_(u"<b><center>EKD est placé sous licence libre <font color=red>GNU GPL version 3</font>: Vous pouvez l&#8217;utiliser, le copier, le modifier (l&#8217;équipe de développement souhaiterait tout de même avoir accès au code modifié) et le diffuser librement.</center></b>"))
  316. label_texte.setWordWrap(1)
  317.  
  318. vboxFram_3.addWidget(label_texte)
  319.  
  320. # Ajout de l'image logo GPL v3 au milieu de la fenêtre
  321. objImg = QImage("Icones"+os.sep+"gplv3-127x51.png") # objet-image
  322. label = QLabel()
  323. label.setPixmap(QPixmap.fromImage(objImg)) # on inclut l'image dans le QLabel
  324. label.setAlignment(Qt.AlignCenter) # centrage de l'image
  325.  
  326. texte_1=_(u"<h2><b>Termes de l'utilisation d'EKD par la GPL version 3</b></h2>")
  327.  
  328. fh = QFile('menu_et_toolbar'+os.sep+'copyright_ekd_gplv3_mise_en_forme.txt')
  329. fh.open(QIODevice.ReadOnly)
  330. stream = QTextStream(fh)
  331. stream.setCodec("UTF-8")
  332. texte_2 = unicode(stream.readLine())
  333. fh.close()
  334.  
  335. texte_3="<h2><b>GNU General Public License Version 3, 29 June 2007</b></h2>"
  336.  
  337. fh = QFile('menu_et_toolbar'+os.sep+'gplv3_mise_en_forme.txt')
  338. fh.open(QIODevice.ReadOnly)
  339. stream = QTextStream(fh)
  340. stream.setCodec("UTF-8")
  341. texte_4 = unicode(stream.readLine())
  342. fh.close()
  343.  
  344. zoneTexte = QTextEdit(texte_1+texte_2+texte_3+texte_4)
  345. zoneTexte.setReadOnly(True)
  346. zoneTexte.setMinimumHeight(408)
  347.  
  348. vboxFram_3.addLayout(v_box_fram_3)
  349. vboxFram_3.addWidget(label)
  350. vboxFram_3.addWidget(zoneTexte)
  351. vboxFram_3.addStretch()
  352.  
  353. self.index_1=self.tabwidget.addTab(self.fram_2, _(u'Développement et graphisme'))
  354. self.index_2=self.tabwidget.addTab(textBrowser, _(u'Documentation'))
  355. self.index_3=self.tabwidget.addTab(self.fram_3, _(u'Licence'))
  356.  
  357. boutonFermer = QPushButton(_(u"Revenir"))
  358. boutonFermer.setIcon(QIcon("Icones"+os.sep+"revenir.png"))
  359. self.connect(boutonFermer, SIGNAL('clicked()'), SLOT('close()'))
  360.  
  361. vbox_aide.addWidget(self.tabwidget)
  362. vbox_aide.addWidget(boutonFermer)
  363. self.setLayout(vbox_aide)
  364.  
  365.  
  366.  
  367. class DialogQuitter(QDialog):
  368. '''
  369. Boite de dialogue de fermeture de ekd
  370. sauverConfCase : Case à cocher de sauvegarde des paramètres
  371. '''
  372. def __init__(self, parent=None):
  373. QDialog.__init__(self, parent)
  374.  
  375. self.setWindowTitle(_(u'Message'))
  376.  
  377. vbox = QVBoxLayout(self)
  378. questionLabel = QLabel(_(u"Voulez-vous sauver les nouveaux paramètres de configuration?"))
  379. self.sauverConfCase = QCheckBox(_(u"Ne plus poser la question à chaque fois"))
  380. if PYQT_VERSION_STR >= "4.1.0":
  381. buttonBox = QDialogButtonBox(QDialogButtonBox.Yes|QDialogButtonBox.No)
  382. boutonOui = buttonBox.button(QDialogButtonBox.Yes)
  383. boutonNon = buttonBox.button(QDialogButtonBox.No)
  384. else:
  385. buttonBox = QWidget()
  386. vboxButtonBox = QHBoxLayout(buttonBox)
  387. vboxButtonBox.addStretch()
  388. boutonOui = QPushButton(_(u'&Oui'))
  389. boutonNon = QPushButton(_(u'&Non'))
  390. vboxButtonBox.addWidget(boutonOui)
  391. vboxButtonBox.addWidget(boutonNon)
  392. messagebox_info = QPixmap("Icones"+os.sep+"messagebox_info.png")
  393. icone = QLabel()
  394. icone.setPixmap(messagebox_info)
  395. hboxButton = QHBoxLayout()
  396. hboxButton.addStretch()
  397. hboxButton.addWidget(buttonBox)
  398. vboxText = QVBoxLayout()
  399. vboxText.addWidget(questionLabel)
  400. vboxText.addWidget(self.sauverConfCase)
  401. hboxIconText = QHBoxLayout()
  402. hboxIconText.addWidget(icone)
  403. hboxIconText.addStretch(0)
  404. hboxIconText.addLayout(vboxText)
  405. vbox.addLayout(hboxIconText)
  406. vbox.addStretch(0)
  407. vbox.addLayout(hboxButton)
  408. boutonOui.setFocus()
  409. self.connect(boutonOui,SIGNAL("clicked()"),self.accept)
  410. self.connect(boutonNon,SIGNAL("clicked()"),self.reject)
  411.  
  412.  
  413. class Gui_EKD(QMainWindow):
  414. '''
  415. # -----------------------------------------
  416. # Classe principale . Base de l'interface .
  417. # -----------------------------------------
  418. '''
  419.  
  420. ## On ajoute la taille minimale du split gauche
  421. minMenuSize = 250
  422.  
  423. def __init__(self):
  424. QMainWindow.__init__(self)
  425.  
  426. # -----------------------------------------------------
  427. # Parametres Generaux de la fenetre Principale (début)
  428. # -----------------------------------------------------
  429.  
  430. # Titre de la fenetre
  431. self.setWindowTitle('EnKoDeur-Mixeur')
  432.  
  433. # Icone de EKD
  434. self.setWindowIcon(QIcon('Icones' + os.sep + 'logo_ekd.png'))
  435.  
  436. # Dimension mini de la fenêtre. La taille est différente sous windows et sous Linux.
  437. # Pour windows uniquement
  438. #if os.name == 'nt':
  439. # self.setMinimumSize(QSize(1010, 584))
  440. # Pour Linux et MacOSX
  441. #elif os.name in ['posix', 'mac']:
  442. # # Dimension mini de la fenêtre
  443. # self.setMinimumSize(QSize(800, 550))
  444. #######################################################################################################
  445. self.setMinimumSize(QSize(800, 550))
  446.  
  447. #=== chargement et lecture du fichier de configuration
  448. # (plutôt méthode linux) ===#
  449. home = unicode(QDir.homePath())
  450.  
  451. # Pour windows uniquement
  452. if os.name == 'nt':
  453. # Pour windows. Les fichiers de config sont mis directement dans l'arborescence d'EKD.
  454. # L'arborescence d'EKD sous windows sera:
  455. # windows\\...\\... tous les reps. et fichiers spécifiques à la version windows
  456. self.configdir = 'windows'
  457. pathConfig = 'windows'
  458. ##############################################################################
  459. if not QDir(pathConfig).exists():
  460. print " pathConfig didn't exist, creating - " + pathConfig
  461. os.makedirs(os.getcwd + os.sep + pathConfig)
  462. else:
  463. print " pathConfig exists, not creating - " + pathConfig
  464.  
  465. # Pour Linux et MacOSX
  466. elif os.name in ['posix', 'mac']:
  467. # appelé depuis une fonction
  468. self.configdir = '.config' + os.sep +'ekd'
  469. pathConfig = home + os.sep + self.configdir
  470. if not QDir(pathConfig).exists():
  471. print " pathConfig didn't exist, creating - " + pathConfig
  472. if not QDir(home).mkpath(pathConfig):
  473. print " Création : echec"
  474. else:
  475. print " pathConfig exists, not creating - " + pathConfig
  476. #######################################################################################################
  477.  
  478. pathname = os.path.dirname (sys.argv[0])
  479. refdir = os.path.abspath (pathname) + os.sep + "videoporama" + os.sep + "template" + os.sep
  480. ### Vérification que les fichiers de config videoporama existent, sinon les copier
  481. ### à partir du répertoire template.
  482. if (not os.path.exists(pathConfig + os.sep + "template_data.idv")) :
  483. reffile=open(refdir + os.sep +u"template_data.idv","r")
  484. destfile=open(pathConfig + os.sep + u"template_data.idv","w")
  485. destfile.write(reffile.read())
  486. destfile.close()
  487. #######################################################################################################
  488.  
  489. # Import de données de configurations au départ du fichier xml
  490. self.msgDiapo = 0
  491. ### Activation ou non de l'onglet Audio si Sox est installé ou non
  492. self.audioSox = True
  493. #####################################################################################
  494. # Vérification des possibilités de Sox en encodage
  495. #####################################################################################
  496. self.soxSuppFormat = []
  497. if not verif[0] and "sox" in verif[1] :
  498. self.audioSox = False
  499. self.suitInit()
  500. else :
  501. usableFormat = [u"wav",u"ogg",u"flac",u"mp3",u"mp2"]
  502. checkSox = checkSoxEncoding(usableFormat,self)
  503. self.connect(checkSox,SIGNAL("checkSox"),self.composeListeFormat)
  504. checkSox.run()
  505.  
  506. ### Lorsque la verification des possibilites de Sox seront terminees, les fonctions
  507. ### d'initialisation se poursuivent.
  508. def composeListeFormat(self,formatValide) :
  509. for format in formatValide :
  510. if format[1] :
  511. self.soxSuppFormat.append(format[0])
  512. self.suitInit()
  513.  
  514. def suitInit(self) :
  515. # Suite des fonctions d'initialisation.
  516. # ---------------------------------------------------------
  517. # Menu principal - Barre d'outils
  518. # ---------------------------------------------------------
  519.  
  520. #=== Actions générales ===#
  521.  
  522. #################################################################################
  523. if PYQT_VERSION_STR >= "4.1.0": raccourcis = QKeySequence.Save
  524. else : raccourcis = "Ctrl + S"
  525. sauverProjetAction = self.createAction(_(u'&Sauver le projet'), slot=self.sauver,
  526. shortcut=raccourcis, icon='Icones'+os.sep+'icone_save_128.png',tip=_(u"Sauver le projet"),signal="triggered()")
  527.  
  528. if PYQT_VERSION_STR >= "4.1.0": raccourcis = QKeySequence.Open
  529. else : raccourcis = "Ctrl + O"
  530. chargerProjetAction = self.createAction(_(u'&Charger le projet'), slot=self.charger,
  531. shortcut=raccourcis, icon='Icones'+os.sep+'icone_load_128.png',tip=_(u"Charger le projet"),signal="triggered()")
  532.  
  533. if PYQT_VERSION_STR >= "4.1.0": raccourcis = QKeySequence.Close
  534. else : raccourcis = "Ctrl + Q"
  535. quitterAction = self.createAction(_(u'&Quitter'), slot=self.close,
  536. shortcut=raccourcis, icon='Icones'+os.sep+'icone_quit_128.png',tip=_(u"Fermer l'application"),signal="triggered()")
  537. #######################################################################################################
  538.  
  539. self.barreOutilsAction = self.createAction(_(u"&Barre d'outils"), slot=self.barreOutils,
  540. tip=_(u"Afficher" + os.sep + "Masquer la barre d'outils"), checkable=True, signal="triggered()")
  541.  
  542. if PYQT_VERSION_STR >= "4.1.0": raccourcis = QKeySequence.HelpContents
  543. else: raccourcis = "F1"
  544. aboutAction = self.createAction(_(u"&A propos d'EKD"), slot=self.info_aide,
  545. shortcut=raccourcis, icon='Icones' + os.sep + 'icone_info_128.png',
  546. tip=_(u"Afficher les contributeurs, les liens vers documentation et la licence de EKD"), signal="triggered()")
  547.  
  548. mplayerAction = self.createAction(_(u"&Lecteur vidéo"), slot=self.mplayerAction,
  549. icon='Icones' + os.sep + 'icone_visionner_128.png',tip=_(u"Lancer un lecteur vidéo"), signal="triggered()")
  550. """
  551. # Inutilisé, ces action sont gérées dans la configuration générale
  552. self.dialogSauvAction = self.createAction(_(u"B&oite de dialogue de sauvegarde"), checkable=True, slot=self.dialogSauv, signal="triggered()", tip=_(u"Afficher la boite de dialogue de sauvegarde des paramètres de configuration à la fermeture de EKD"))
  553.  
  554. self.splitAction = self.createAction(_(u"&Conserver les positions relatives des menus verticaux et des cadres (split)"), checkable=True, slot=self.splitPosition, signal="triggered()", tip=_(u"Risqué! Cette action prendra effet au prochain démarrage de EKD. Les positions seront enregistrées à la fermeture si vous le décidez."))
  555.  
  556. self.purgeConfigAction = self.createAction(_(u"&Réinitialiser les paramètres de configuration"), checkable=True, slot=self.purgeConfig, signal="triggered()", tip=_(u"Purge des fichiers de configurations. Cette action prendra effet au prochain démarrage de EKD"))
  557. """
  558. ### Ajout de la boite de dialogue de configuration
  559. self.ConfigAction = self.createAction(_(u"&Configuration générale"), slot=self.launchConfig, signal="triggered()", tip=_(u"Configuration des différents composants de Ekd"))
  560.  
  561. # Uniquement pour Linux et MacOSX
  562. if os.name == 'posix':
  563. # Sortie vidéo de mplayer
  564. groupVideoOutput = QActionGroup(self)
  565. defautvoAction = self.createAction(_(u"&défaut"), checkable=True,
  566. slot=lambda a, b='':self.videoOutput(a, b),
  567. tip=_(u"Sortie vidéo définie dans les fichiers de configuration de mplayer"),
  568. signal="toggled(bool)")
  569. groupVideoOutput.addAction(defautvoAction)
  570. xmgaAction = self.createAction("x&mga", checkable=True,
  571. slot=lambda a, b='xmga':self.videoOutput(a, b),
  572. tip=_(u"Matrox G200/G4x0/G550 overlay in X11 window (using /dev/mga_vid)"),
  573. signal="toggled(bool)")
  574. groupVideoOutput.addAction(xmgaAction)
  575. xvAction = self.createAction("&xv", checkable=True,
  576. slot=lambda a, b='xv':self.videoOutput(a, b), tip=_(u" X11/Xv"), signal="toggled(bool)")
  577. groupVideoOutput.addAction(xvAction)
  578. x11Action = self.createAction("x&11", checkable=True,
  579. slot=lambda a, b='x11':self.videoOutput(a, b), tip=_(u"X11 (XImage/Shm)"),
  580. signal="toggled(bool)")
  581. groupVideoOutput.addAction(x11Action)
  582. glAction = self.createAction("&gl", checkable=True,
  583. slot=lambda a, b='gl':self.videoOutput(a, b), tip=_(u"X11 (OpenGL)"),
  584. signal="toggled(bool)")
  585. groupVideoOutput.addAction(glAction)
  586. gl2Action = self.createAction("gl&2", checkable=True,
  587. slot=lambda a, b='gl2':self.videoOutput(a, b),
  588. tip=_(u"X11 (OpenGl) - multiple textures version"), signal="toggled(bool)")
  589. groupVideoOutput.addAction(gl2Action)
  590. dxr3Action = self.createAction("dx&r3", checkable=True,
  591. slot=lambda a, b='dxr3':self.videoOutput(a, b), tip=_(u"DXR3/H+ video out"),
  592. signal="toggled(bool)")
  593. groupVideoOutput.addAction(dxr3Action)
  594. xvidixAction = self.createAction("xv&idix", checkable=True,
  595. slot=lambda a, b='xvidix':self.videoOutput(a, b), tip=_(u"X11 (VIDIX)"),
  596. signal="toggled(bool)")
  597. groupVideoOutput.addAction(xvidixAction)
  598. vidixAction = self.createAction("v&idix", checkable=True,
  599. slot=lambda a, b='vidix':self.videoOutput(a, b), tip=_(u"VIDIX (VIDeo Interface for *niX)"),
  600. signal="toggled(bool)")
  601. groupVideoOutput.addAction(vidixAction)
  602. cvidixAction = self.createAction("cv&idix", checkable=True,
  603. slot=lambda a, b='cvidix':self.videoOutput(a, b), tip=_(u"Generic and platform independent VIDIX frontend"),
  604. signal="toggled(bool)")
  605. groupVideoOutput.addAction(cvidixAction)
  606. vesaAction = self.createAction("vesa", checkable=True,
  607. slot=lambda a, b='vesa':self.videoOutput(a, b), tip=_(u"Very general video output driver that should work on any VESA VBE 2.0 compatible card"),
  608. signal="toggled(bool)")
  609. groupVideoOutput.addAction(vesaAction)
  610. svgaAction = self.createAction("svga", checkable=True,
  611. slot=lambda a, b='svga':self.videoOutput(a, b), tip=_(u"Play video using the SVGA library"),
  612. signal="toggled(bool)")
  613. groupVideoOutput.addAction(svgaAction)
  614. fbdevAction = self.createAction("fbdev", checkable=True,
  615. slot=lambda a, b='fbdev':self.videoOutput(a, b), tip=_(u"Uses the kernel framebuffer to play video"),
  616. signal="toggled(bool)")
  617. groupVideoOutput.addAction(fbdevAction)
  618. dfbmgaAction = self.createAction("dfbmga", checkable=True,
  619. slot=lambda a, b='dfbmga':self.videoOutput(a, b), tip=_(u"Matrox G400/:G450/:G550 specific video output driver that uses the DirectFB library"),
  620. signal="toggled(bool)")
  621. groupVideoOutput.addAction(dfbmgaAction)
  622. s3fbAction = self.createAction("s3fb", checkable=True,
  623. slot=lambda a, b='s3fb':self.videoOutput(a, b), tip=_(u"S3 Virge specific video output driver"),
  624. signal="toggled(bool)")
  625. groupVideoOutput.addAction(s3fbAction)
  626. wiiAction = self.createAction("wii", checkable=True,
  627. slot=lambda a, b='wii':self.videoOutput(a, b), tip=_(u"Nintendo Wii/GameCube specific video output driver"),
  628. signal="toggled(bool)")
  629. groupVideoOutput.addAction(wiiAction)
  630. a3dfxAction = self.createAction("3dfx", checkable=True,
  631. slot=lambda a, b='3dfx':self.videoOutput(a, b), tip=_(u"3dfx-specific video output driver that directly uses the hardware on top of X11"),
  632. signal="toggled(bool)")
  633. groupVideoOutput.addAction(a3dfxAction)
  634. #############################################
  635. xvmcAction = self.createAction("xvm&c", checkable=True,
  636. slot=lambda a, b='xvmc':self.videoOutput(a, b), tip=_(u"XVideo Motion Conpensation"),
  637. signal="toggled(bool)")
  638. groupVideoOutput.addAction(xvmcAction)
  639.  
  640. # Uniquement pour MacOSX
  641. if os.name == 'mac':
  642. # Sortie vidéo de mplayer
  643. groupVideoOutput = QActionGroup(self)
  644. defautvoAction = self.createAction(_(u"&défaut"), checkable=True,
  645. slot=lambda a, b='':self.videoOutput(a, b),
  646. tip=_(u"Sortie vidéo définie dans les fichiers de configuration de mplayer"),
  647. signal="toggled(bool)")
  648. groupVideoOutput.addAction(defautvoAction)
  649. quartzAction = self.createAction("quartz", checkable=True,
  650. slot=lambda a, b='quartz':self.videoOutput(a, b),
  651. tip=_(u"Mac OS X Quartz video output driver"),
  652. signal="toggled(bool)")
  653. groupVideoOutput.addAction(quartzAction)
  654. macosxAction = self.createAction("macosx", checkable=True,
  655. slot=lambda a, b='macosx':self.videoOutput(a, b),
  656. tip=_(u"Mac OS X CoreVideo video output driver"),
  657. signal="toggled(bool)")
  658. groupVideoOutput.addAction(macosxAction)
  659. vesaAction = self.createAction("vesa", checkable=True,
  660. slot=lambda a, b='vesa':self.videoOutput(a, b), tip=_(u"Very general video output driver that should work on any VESA VBE 2.0 compatible card"),
  661. signal="toggled(bool)")
  662. groupVideoOutput.addAction(vesaAction)
  663. svgaAction = self.createAction("svga", checkable=True,
  664. slot=lambda a, b='svga':self.videoOutput(a, b), tip=_(u"Play video using the SVGA library"),
  665. signal="toggled(bool)")
  666. groupVideoOutput.addAction(svgaAction)
  667. glAction = self.createAction("&gl", checkable=True,
  668. slot=lambda a, b='gl':self.videoOutput(a, b), tip=_(u"OpenGL 1"),
  669. signal="toggled(bool)")
  670. groupVideoOutput.addAction(glAction)
  671. gl2Action = self.createAction("gl&2", checkable=True,
  672. slot=lambda a, b='gl2':self.videoOutput(a, b),
  673. tip=_(u"OpenGl 2 - multiple textures version"), signal="toggled(bool)")
  674. groupVideoOutput.addAction(gl2Action)
  675.  
  676. # Uniquement pour Windows
  677. if os.name == 'nt':
  678. # Sortie vidéo de mplayer
  679. groupVideoOutput = QActionGroup(self)
  680. defautvoAction = self.createAction(_(u"&défaut"), checkable=True,
  681. slot=lambda a, b='':self.videoOutput(a, b),
  682. tip=_(u"Sortie vidéo définie dans les fichiers de configuration de mplayer"),
  683. signal="toggled(bool)")
  684. groupVideoOutput.addAction(defautvoAction)
  685. directxAction = self.createAction("&directx", checkable=True,
  686. slot=lambda a, b='directx':self.videoOutput(a, b),
  687. tip=_(u"DirectX"),
  688. signal="toggled(bool)")
  689. groupVideoOutput.addAction(directxAction)
  690. glAction = self.createAction("&gl", checkable=True,
  691. slot=lambda a, b='gl':self.videoOutput(a, b), tip=_(u"OpenGL 1"),
  692. signal="toggled(bool)")
  693. groupVideoOutput.addAction(glAction)
  694. gl2Action = self.createAction("gl&2", checkable=True,
  695. slot=lambda a, b='gl2':self.videoOutput(a, b),
  696. tip=_(u"OpenGl 2 - multiple textures version"), signal="toggled(bool)")
  697. groupVideoOutput.addAction(gl2Action)
  698. ##################################
  699. winvidixAction = self.createAction("winvidix", checkable=True,
  700. slot=lambda a, b='winvidix':self.videoOutput(a, b),
  701. tip=_(u"Windows frontend for VIDIX"), signal="toggled(bool)")
  702. groupVideoOutput.addAction(winvidixAction)
  703. direct3dAction = self.createAction("direct3d", checkable=True,
  704. slot=lambda a, b='direct3d':self.videoOutput(a, b),
  705. tip=_(u"Video output driver that uses the Direct3D interface (useful for Vista)"), signal="toggled(bool)")
  706. groupVideoOutput.addAction(direct3dAction)
  707. dfbmgaAction = self.createAction("dfbmga", checkable=True,
  708. slot=lambda a, b='dfbmga':self.videoOutput(a, b), tip=_(u"Matrox G400/:G450/:G550 specific video output driver that uses the DirectFB library"),
  709. signal="toggled(bool)")
  710. groupVideoOutput.addAction(dfbmgaAction)
  711. vesaAction = self.createAction("vesa", checkable=True,
  712. slot=lambda a, b='vesa':self.videoOutput(a, b), tip=_(u"Very general video output driver that should work on any VESA VBE 2.0 compatible card"),
  713. signal="toggled(bool)")
  714. groupVideoOutput.addAction(vesaAction)
  715. svgaAction = self.createAction("svga", checkable=True,
  716. slot=lambda a, b='svga':self.videoOutput(a, b), tip=_(u"Play video using the SVGA library"),
  717. signal="toggled(bool)")
  718. groupVideoOutput.addAction(svgaAction)
  719. #############################################
  720.  
  721. settings = QSettings()
  722.  
  723. # Uniquement pour Linux et MacOSX
  724. if os.name == 'posix':
  725. vo = settings.value("vo", QVariant('')).toString()
  726. if vo == '':
  727. defautvoAction.setChecked(True)
  728. elif vo == 'xmga':
  729. xmgaAction.setChecked(True)
  730. elif vo == 'xv':
  731. xvAction.setChecked(True)
  732. elif vo == 'x11':
  733. x11Action.setChecked(True)
  734. elif vo == 'gl':
  735. glAction.setChecked(True)
  736. elif vo == 'gl2':
  737. gl2Action.setChecked(True)
  738. elif vo == 'dxr3':
  739. gl2Action.setChecked(True)
  740. elif vo == 'xvidix':
  741. gl2Action.setChecked(True)
  742. ###################################
  743. elif vo == 'vidix':
  744. vidixAction.setChecked(True)
  745. elif vo == 'cvidix':
  746. cvidixAction.setChecked(True)
  747. elif vo == 'vesa':
  748. vesaAction.setChecked(True)
  749. elif vo == 'svga':
  750. svgaAction.setChecked(True)
  751. elif vo == 'fbdev':
  752. fbdevAction.setChecked(True)
  753. elif vo == 'dfbmga':
  754. dfbmgaAction.setChecked(True)
  755. elif vo == 's3fb':
  756. s3fbAction.setChecked(True)
  757. elif vo == 'wii':
  758. wiiAction.setChecked(True)
  759. elif vo == '3dfx':
  760. a3dfxAction.setChecked(True)
  761. #############################################
  762. elif vo == 'xvmc':
  763. xvmcAction.setChecked(True)
  764.  
  765. # Uniquement pour MacOSX
  766. if os.name == 'mac':
  767. vo = settings.value("vo", QVariant('')).toString()
  768. if vo == '':
  769. defautvoAction.setChecked(True)
  770. elif vo == 'quartz':
  771. quartzAction.setChecked(True)
  772. elif vo == 'macosx':
  773. macosxAction.setChecked(True)
  774. elif vo == 'vesa':
  775. vesaAction.setChecked(True)
  776. elif vo == 'svga':
  777. svgaAction.setChecked(True)
  778. elif vo == 'gl':
  779. glAction.setChecked(True)
  780. elif vo == 'gl2':
  781. gl2Action.setChecked(True)
  782.  
  783. # Uniquement pour Windows
  784. if os.name == 'nt':
  785. vo = settings.value("vo", QVariant('')).toString()
  786. if vo == '':
  787. defautvoAction.setChecked(True)
  788. elif vo == 'directx':
  789. directxAction.setChecked(True)
  790. elif vo == 'gl':
  791. glAction.setChecked(True)
  792. elif vo == 'gl2':
  793. gl2Action.setChecked(True)
  794. ###################################
  795. elif vo == 'winvidix':
  796. winvidixAction.setChecked(True)
  797. elif vo == 'direct3d':
  798. direct3dAction.setChecked(True)
  799. elif vo == 'dfbmga':
  800. dfbmgaAction.setChecked(True)
  801. elif vo == 'vesa':
  802. vesaAction.setChecked(True)
  803. elif vo == 'svga':
  804. svgaAction.setChecked(True)
  805. #############################################
  806.  
  807. #=== Menus ===#
  808. # Menu Fichier ==========================================
  809. menuFichier=self.menuBar().addMenu(_(u'&Fichier'))
  810. self.addActions(menuFichier, (chargerProjetAction, sauverProjetAction, None, quitterAction,))
  811.  
  812.  
  813. # Menu Outils =================================
  814. menuOutils=self.menuBar().addMenu(_(u'O&utils'))
  815. self.addActions(menuOutils, (mplayerAction,) )
  816.  
  817. # Menu Configuration ==========================================
  818. self.menuConfig=self.menuBar().addMenu(_(u'&Configuration'))
  819. self.addActions(self.menuConfig, (self.ConfigAction, self.barreOutilsAction
  820. ))
  821. ### N'est plus nécessaire, géré dans la configuration Générale
  822. #self.connect(self.menuConfig,SIGNAL("aboutToShow()"),self.fctMenuConfig)
  823.  
  824.  
  825. # Uniquement pour Linux
  826. if os.name == 'posix':
  827. menuMplayer = self.menuConfig.addMenu(_(u"&Sortie vidéo de mplayer"))
  828. self.addActions(menuMplayer, (defautvoAction, xmgaAction, xvAction, x11Action, glAction, gl2Action, dxr3Action, xvidixAction, vidixAction, cvidixAction, vesaAction, svgaAction, fbdevAction, dfbmgaAction, s3fbAction, s3fbAction, wiiAction, a3dfxAction, xvmcAction))
  829.  
  830. # Uniquement MacOSX
  831. if os.name == 'mac':
  832. menuMplayer = self.menuConfig.addMenu(_(u"&Sortie vidéo de mplayer"))
  833. self.addActions(menuMplayer, (defautvoAction, quartzAction, macosxAction, vesaAction, svgaAction, glAction, gl2Action))
  834.  
  835. # Uniquement pour Windows
  836. if os.name == 'nt':
  837. menuMplayer = self.menuConfig.addMenu(_(u"&Sortie vidéo de mplayer"))
  838. self.addActions(menuMplayer, (defautvoAction, directxAction, glAction, gl2Action, winvidixAction, direct3dAction, dfbmgaAction, vesaAction, svgaAction))
  839.  
  840. # Menu Aide ==========================================
  841. menu=self.menuBar().addMenu(_(u'&Infos'))
  842. self.addActions(menu, (aboutAction,))
  843.  
  844. #=== Barre d'outils ===#
  845. self.toolBar = self.addToolBar(_(u"&Barre d'outils"))
  846. self.toolBar.setObjectName("BarreOutils") # obligatoire pour le déplacement
  847. self.toolBar.setIconSize(QSize(16,16))
  848. self.toolBar.hide()
  849.  
  850. self.toolBar.addAction(quitterAction)
  851. self.toolBar.addSeparator()
  852. self.toolBar.addAction(mplayerAction)
  853. self.toolBar.addSeparator()
  854. self.toolBar.addAction(aboutAction)
  855. self.toolBar.addSeparator()
  856.  
  857. # Dictionnaire pour ne pas avoir à changer la fonction connectée à chaque
  858. # modif du nom d'un item . Une valeur (et non pas une clé) de notre
  859. # dictionnaire est unique. Elle est différente du texte de l'item pour
  860. # éviter les pièges et pour pouvoir donner des noms identiques à certains
  861. # items au besoin .
  862. self.itemDict = {}
  863.  
  864. # ---------------------------------------------------------
  865. # Onglets
  866. # ---------------------------------------------------------
  867. tabWidget=QTabWidget()
  868.  
  869. largeurEcran = QDesktopWidget().screenGeometry().height()
  870. # Sous Qt4.0 pas moyen de paramètrer la taille des icônes pour les en-têtes d'onglet.
  871. # Elles sont beaucoup trop petite -> on préfère le texte seul (on préfère aussi le texte
  872. # pour les petites écrans)
  873. if largeurEcran < 800 or PYQT_VERSION_STR < "4.1.0": petitEcran = 1
  874. else:
  875. petitEcran = 0
  876. tabWidget.setIconSize(QSize(36,36))
  877.  
  878. self.connect(tabWidget,SIGNAL('currentChanged(int)'),self.changeOnglet)
  879.  
  880. # onglet Animation ============================
  881. # DICO - clé: référence du split; valeur: paramètres de configuration
  882. # Permet de faire le lien entre la stack de widget et l'arbre de menu
  883. self.dicoSplit = {}
  884. self.animSplitter = QSplitter(Qt.Horizontal)
  885. self.dicoSplit[self.animSplitter] = "AnimSplitter"
  886.  
  887. # Liste de hbox
  888. # Rq: les self de cette partie (sauf pour le dictionnaire) sont nécessaires
  889. # à l'activation les liens hypertextes du cadre d'accueil "Montage Vidéo"
  890. self.treeWidgetAnimation=QTreeWidget()
  891.  
  892. self.animSplitter.addWidget(self.treeWidgetAnimation)
  893. self.treeWidgetAnimation.headerItem().setText(0, _(u"Vidéo"))
  894. self.treeWidgetAnimation.setMinimumWidth(Gui_EKD.minMenuSize)
  895. ###################################################################################################################
  896.  
  897. # ajout de la liste et des widgets associés dans hbox
  898. self.stacked_onglet_animation=QStackedWidget()
  899.  
  900. # widget principal de la page d'accueil contenant le logo ekd
  901. widget_img_accueil = self.widgetOngletAccueil("Icones" + os.sep + "logo_ekd.png")
  902. # Drapeau pour savoir éventuellement afficher l'image d'accueil propre à l'onglet
  903. self.clicInitialAnim = 1
  904. # widget principal de la page d'accueil animation
  905. imageAccueilAnim = self.widgetOngletAccueil("Icones" + os.sep + "icone_video_256.png")
  906.  
  907. # page d'accueil de ekd
  908. self.stacked_page_accueil=self.stacked_onglet_animation.addWidget(widget_img_accueil)
  909. # page d'accueil de animation
  910. self.imageAccueilAnim=self.stacked_onglet_animation.addWidget(imageAccueilAnim)
  911. # Animation >> Encodage
  912. (self.itemTree_Encodage, self.stacked_animation_encodage)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  913. Animation_Encodage(self), _(u"Transcodage"),\
  914. QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
  915.  
  916. # Animation >> Encodage >> Général
  917. (self.itemTree_Encodage_General, self.stacked_animation_encodage_general)=self.createMenu(self.itemTree_Encodage, self.stacked_onglet_animation,\
  918. Animation_Encodage_General(), _(u"Général"),\
  919. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  920.  
  921. # Animation >> Encodage >> Pour le web
  922. (self.itemTree_Encodage_Web, self.stacked_animation_encodage_web)=self.createMenu(self.itemTree_Encodage, self.stacked_onglet_animation,\
  923. AnimationEncodageWeb(), _(u"Pour le web"),\
  924. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  925.  
  926. # Animation >> Encodage >> Haute Définition
  927. (self.itemTree_Encodage_HD, self.stacked_animation_encodage_hd)=self.createMenu(self.itemTree_Encodage, self.stacked_onglet_animation,\
  928. AnimationEncodageHD(), _(u"Haute Définition"),\
  929. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  930.  
  931. # Animation >> Encodage >> AVCHD
  932. # Utilisation de la vérification de la version de ffmpeg
  933. if verif[8] :
  934. (self.itemTree_Encodage_AVCHD, self.stacked_animation_encodage_avchd)=self.createMenu(self.itemTree_Encodage, self.stacked_onglet_animation,\
  935. AnimationEncodageAVCHD(), _(u"Gestion AVCHD"),\
  936. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  937.  
  938. # Animation >> filtres vidéos
  939. (trash, self.stacked_animation_filtesVideos)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  940. Animation_FiltresVideos(), _(u"Filtres"),\
  941. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  942.  
  943. # Animation >> montage vidéo
  944. (self.itemTree_MontagVideo, self.stacked_animation_MontagVideo)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  945. Animation_MontagVideo(self), _(u"Montage vidéo"),\
  946. QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
  947.  
  948. # Animation >> montage vidéo >> video seulement
  949. (self.itemTree_SVideo, self.stacked_animation_MontagVideoVidSeul)=self.createMenu(self.itemTree_MontagVideo, self.stacked_onglet_animation,\
  950. Animation_MontagVideoVidSeul(self.statusBar()), _(u"Vidéo seulement"),\
  951. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  952. # Animation >> montage vidéo >> video + audio
  953. (self.itemTree_SVideoAudio, self.stacked_animation_MontagVideoVidPlusAudio)=self.createMenu(self.itemTree_MontagVideo, self.stacked_onglet_animation,\
  954. Animation_MontagVideoVidPlusAudio(self.statusBar(), self), _(u"Vidéo + audio"),\
  955. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  956.  
  957. # Animation >> montage vidéo >> decouper une video
  958. (self.itemTree_SDecouperVideo, self.stacked_animation_MontagVideoDecoupUneVideo)=self.createMenu(self.itemTree_MontagVideo, self.stacked_onglet_animation,\
  959. Animation_MontagVideoDecoupUneVideo(self.statusBar()), _(u"Découpage d'une vidéo"),\
  960. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  961.  
  962. # Animation >> separer video et audio
  963. (trash, self.stacked_animation_SeparVideoEtAudio)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  964. Animation_SeparVideoEtAudio(), _(u"Séparation audio-vidéo"),\
  965. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  966.  
  967. # Animation >> convertir des images en animation
  968. (trash, self.stacked_animation_ConvertirImgEnAnim)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  969. Animation_ConvertirImgEnAnim(self.statusBar(), self.frameGeometry), _(u"Conversion d'images en vidéo"),\
  970. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  971.  
  972. # Animation >> convertir une animation en images
  973. (trash, self.stacked_animation_ConvertirUneAnimEnImg)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  974. Animation_ConvertirUneAnimEnImg(self.statusBar(), self.frameGeometry), _(u"Conversion d'une vidéo en images"),\
  975. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  976.  
  977. # Animation >> reglages divers
  978. (trash, self.stacked_animation_ReglagesDivers)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  979. Animation_ReglagesDivers(), _(u"Nombre d'images par seconde"),\
  980. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  981.  
  982. # Animation >> conversion une vidéo en 16/9 ou 4/3
  983. (trash, self.stacked_animation_ConvertirAnimEn_16_9_Ou_4_3)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  984. Animation_ConvertirAnimEn_16_9_Ou_4_3(self.statusBar()), _(u"Convertir une vidéo en 16/9 ou 4/3"),\
  985. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  986.  
  987. ### Menu Diaporama d'images en vidéo (Videoporama) ###
  988. # Animation >> Diaporama d'images en vidéo
  989. (trash, self.stacked_animation_Videoporama)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  990. Videoporama_Main(verif,self), _(u"Diaporama d'images en vidéo"),\
  991. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  992.  
  993. ### Ajouté le 05/09/10 pour la gestion des Tags vidéo ##############################################################
  994. # Animation >> Tags vidéo
  995. (trash, self.stacked_animation_TagsVideo)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
  996. Animation_TagsVideo(), _(u"Tags vidéo"),\
  997. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  998. ####################################################################################################################
  999.  
  1000. # connecteur de la liste
  1001. self.connect(self.treeWidgetAnimation,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_animation)
  1002.  
  1003.  
  1004. self.animSplitter.addWidget(self.stacked_onglet_animation)
  1005.  
  1006. # ajout du widget contenant la boite dans l'onglet Animation
  1007. i = tabWidget.addTab(self.animSplitter, '')
  1008. txt = _(u"Vidéo")
  1009. tabWidget.setTabToolTip(i, txt)
  1010. if not petitEcran:
  1011. tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_video_128.png"))
  1012. else: tabWidget.setTabText(i, txt)
  1013.  
  1014. # onglet Image ================================
  1015. self.imageSplitter = QSplitter(Qt.Horizontal)
  1016. self.dicoSplit[self.imageSplitter] = "ImageSplitter"
  1017.  
  1018. # liste de hbox
  1019. self.treeWidgetDiversImage=QTreeWidget()
  1020. self.imageSplitter.addWidget(self.treeWidgetDiversImage)
  1021. self.treeWidgetDiversImage.headerItem().setText(0,_(u"Image"))
  1022. self.treeWidgetDiversImage.setMinimumWidth(Gui_EKD.minMenuSize)
  1023.  
  1024. # widget principal de la page d'accueil
  1025. widget_img_accueil = self.widgetOngletAccueil("Icones" + os.sep + "icone_images_256.png")
  1026.  
  1027. # ajout de la liste et des widgets associés dans hbox
  1028. self.stacked_onglet_image=QStackedWidget(self)
  1029. # page d'accueil
  1030. self.stacked_onglet_image.addWidget(widget_img_accueil)
  1031. # Image >> Divers
  1032. (self.treeWidgetImagesDivers, self.stacked_image_divers)=self.createMenu(self.treeWidgetDiversImage, self.stacked_onglet_image,\
  1033. Image_Divers(self), _(u"Divers"),\
  1034. QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
  1035.  
  1036. # Image >> Divers >> Planche-contact
  1037. (self.itemTree_PlContact, self.stacked_image_divers_PlContact)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
  1038. Image_Divers_PlContact(self.statusBar(), self.frameGeometry), _(u"Planche-contact"),\
  1039. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1040.  
  1041. # Image >> Divers >> Information
  1042. (self.itemTree_Information, self.stacked_image_divers_Information)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
  1043. Image_Divers_Info(self.frameGeometry), _(u"Information"),\
  1044. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1045.  
  1046. # Image >> Divers >> Changer format
  1047. (self.itemTree_ChangFormat, self.stacked_image_divers_ChangFormat)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
  1048. Image_Divers_ChangFormat(self.statusBar(), self.frameGeometry), _(u"Changement de format"),\
  1049. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1050.  
  1051. # Image >> Divers >> Redimensionner
  1052. (self.itemTree_Redimens, self.stacked_image_divers_Redimens)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
  1053. Image_Divers_Redimensionner(self.statusBar(), self.frameGeometry), _(u"Redimension"),\
  1054. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1055.  
  1056. # Image >> Divers >> Texte sur images
  1057. if PYQT_VERSION_STR >= "4.1.0":
  1058. (self.itemTree_TxtSurImg, self.stacked_image_divers_TxtSurImg)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
  1059. Image_Divers_TxtSurImg(self.statusBar(), self.frameGeometry), _(u"Ajout d'éléments"),\
  1060. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1061.  
  1062. # Image >> Divers >> Compositing
  1063. (self.itemTree_ImgComposit, self.stacked_image_divers_Compositing)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
  1064. Image_Divers_Compositing(self.statusBar(), self.frameGeometry), _(u"Image composite"),\
  1065. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1066.  
  1067. # Image >> Divers >> Renommer images
  1068. (self.itemTree_RenomImg, self.stacked_image_divers_RenomImg)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
  1069. Image_Divers_RenomImg(self.frameGeometry), _(u"Renommage d'images"),\
  1070. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1071.  
  1072. # Image >> Divers >> Pour le web
  1073. (self.itemTree_PourLeWeb, self.stacked_image_divers_PourLeWeb)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
  1074. Image_Divers_PourLeWeb(self.statusBar(), self.frameGeometry), _(u"Pour le web"),\
  1075. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1076.  
  1077. # Image >> Divers >> Multiplication d'images
  1078. (self.itemTree_MultiplicImg, self.stacked_image_divers_MultiplicImg)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
  1079. Image_Divers_MultiplicImg(self.statusBar(), self.frameGeometry), _(u"Multiplication d'images"),\
  1080. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1081.  
  1082. # Image >> Transitions
  1083. (self.itemTree_Transition, self.stacked_image_transitions)=self.createMenu(self.treeWidgetDiversImage, self.stacked_onglet_image,\
  1084. Image_Transitions(self), _(u"Transitions"),\
  1085. QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
  1086.  
  1087. # Image >> Transitions >> Fondu enchaîné
  1088. (self.itemTree_FonduEnchaine, self.stacked_image_transitions_fondEnch)=self.createMenu(self.itemTree_Transition, self.stacked_onglet_image,\
  1089. Image_Transitions_FondEnch(self.statusBar(), self.frameGeometry), _(u"Fondu enchaîné"),\
  1090. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1091.  
  1092. # Image >> Transitions >> Spirale
  1093. (self.itemTree_Spirale, self.stacked_image_transitions_Spirale)=self.createMenu(self.itemTree_Transition, self.stacked_onglet_image,\
  1094. Image_Transitions_Spirale(self.statusBar(), self.frameGeometry), _(u"Spirale"),\
  1095. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1096.  
  1097. # Image >> Masque alpha/3D
  1098. (self.itemTree_ImageMasqueAlpha3D, self.stacked_image_masque_alpha_3d)=self.createMenu(self.treeWidgetDiversImage, self.stacked_onglet_image,\
  1099. Image_MasqueAlpha3D(self.statusBar(), self.frameGeometry), _(u"Masque alpha/3D"),\
  1100. QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
  1101.  
  1102. # Image >> Filtres image
  1103. (self.itemTree_FiltresImage, self.stacked_image_filtres_image)=self.createMenu(self.treeWidgetDiversImage, self.stacked_onglet_image,\
  1104. Image_FiltresImage(self.statusBar(), self.frameGeometry), _(u"Filtres"),\
  1105. QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
  1106.  
  1107.  
  1108. # connecteur de la liste
  1109. self.connect(self.treeWidgetDiversImage,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_image)
  1110.  
  1111. self.imageSplitter.addWidget(self.stacked_onglet_image)
  1112.  
  1113. # ajout du widget contenant la boite dans l'onglet Image
  1114. i = tabWidget.addTab(self.imageSplitter, '')
  1115. txt = _(u"Image")
  1116. tabWidget.setTabToolTip(i, txt)
  1117. if not petitEcran:
  1118. tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_images_128.png"))
  1119. else: tabWidget.setTabText(i, txt)
  1120.  
  1121. if self.audioSox :
  1122. self.sonSplitter = QSplitter(Qt.Horizontal)
  1123. self.dicoSplit[self.sonSplitter] = "SonSplitter"
  1124.  
  1125. # liste de hbox
  1126. self.treeWidgetSon=QTreeWidget()
  1127. self.sonSplitter.addWidget(self.treeWidgetSon)
  1128. self.treeWidgetSon.headerItem().setText(0, _(u"Musique-Son"))
  1129. self.treeWidgetSon.setMinimumWidth(Gui_EKD.minMenuSize)
  1130.  
  1131. # ajout de la liste et des widgets associés dans hbox
  1132. self.stacked_onglet_musique_son=QStackedWidget()
  1133.  
  1134. # page d'accueil
  1135. # widget principal de la page d'accueil
  1136. widget_img_accueil = self.widgetOngletAccueil("Icones" + os.sep + "icone_sons_256.png")
  1137. self.stacked_onglet_musique_son.addWidget(widget_img_accueil)
  1138.  
  1139. # Musique-Son >> Encodage
  1140. (self.itemTree_MusiqueSonEcodage, self.stacked_musique_son_encodage)=self.createMenu(self.treeWidgetSon, self.stacked_onglet_musique_son,\
  1141. MusiqueSon_Encodage(self), _(u"Transcodage audio"),\
  1142. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1143.  
  1144. # Musique-Son >> Join multiple file
  1145. (self.itemTree_MusiqueSonEcodage, self.stacked_musique_son_join_sound)=self.createMenu(self.treeWidgetSon, self.stacked_onglet_musique_son,\
  1146. MusiqueSon_Join(self), _(u"Joindre plusieurs fichiers audio"),\
  1147. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1148.  
  1149. # Musique-Son >> Découpe fichier son
  1150. (self.itemTree_MusiqueSonEcodage, self.stacked_musique_son_decoupe)=self.createMenu(self.treeWidgetSon, self.stacked_onglet_musique_son,\
  1151. MusiqueSon_decoupe(self), _(u"Découpe dans un fichier audio"),\
  1152. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1153.  
  1154. # Musique-Son >> Normalize fichier audio
  1155. (self.itemTree_MusiqueSonEcodage, self.stacked_musique_son_decoupe)=self.createMenu(self.treeWidgetSon, self.stacked_onglet_musique_son,\
  1156. MusiqueSon_normalize(self), _(u"Normaliser et convertir un fichier audio"),\
  1157. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1158.  
  1159. self.connect(self.treeWidgetSon,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_musique_son)
  1160.  
  1161. self.sonSplitter.addWidget(self.stacked_onglet_musique_son)
  1162.  
  1163. # ajout du widget contenant la boite dans l'onglet Musique_Son
  1164. i = tabWidget.addTab(self.sonSplitter, '')
  1165. txt = _(u"Musique-Son")
  1166. tabWidget.setTabToolTip(i, txt)
  1167. if not petitEcran:
  1168. tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_sons_128.png"))
  1169. else: tabWidget.setTabText(i, txt)
  1170.  
  1171. # onglet Lecture ==============================
  1172. self.lectureSplitter = QSplitter(Qt.Horizontal)
  1173. self.dicoSplit[self.lectureSplitter] = "LectureSplitter"
  1174.  
  1175. splitLect=QSplitter(Qt.Vertical)
  1176.  
  1177. # liste des entrées de menu de splitLect
  1178. self.treeWidgetLecture=QTreeWidget()
  1179. self.treeWidgetLecture.headerItem().setText(0, _(u"Lecture"))
  1180. ## Ajouté le 3/07/2009 : On s'assure que la taille du treeWidget est suffisante
  1181. self.treeWidgetLecture.setMinimumWidth(Gui_EKD.minMenuSize)
  1182.  
  1183. splitLect.addWidget(self.treeWidgetLecture)
  1184.  
  1185.  
  1186. self.stackedVisio = QStackedWidget()
  1187.  
  1188. splitLect.addWidget(self.stackedVisio)
  1189.  
  1190. self.lectureSplitter.addWidget(splitLect)
  1191.  
  1192. # connecteur de la liste
  1193. self.connect(self.treeWidgetLecture,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_lecture)
  1194.  
  1195. # ajout de la liste et des widgets associés dans hbox
  1196. self.stacked_onglet_lecture=QStackedWidget()
  1197.  
  1198. # page d'accueil
  1199. # widget principal de la page d'accueil
  1200. widget_img_accueil = self.widgetOngletAccueil("Icones" + os.sep + "icone_visionner_256.png")
  1201. self.stacked_onglet_lecture.addWidget(widget_img_accueil)
  1202. # Lecture >> Visionner des images
  1203. self.lecture_VisionImage = Lecture_VisionImage(self.statusBar(), True, False)
  1204.  
  1205. (self.itemTree_LectureVisionImage, self.stacked_lecture_vision_image)=self.createMenu(self.treeWidgetLecture, self.stacked_onglet_lecture,\
  1206. self.lecture_VisionImage, _(u"Lecture d'images"),\
  1207. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1208. self.indexStacked_visioImg = self.stackedVisio.addWidget(self.lecture_VisionImage.getFolder())
  1209.  
  1210. # Lecture >> Visionner des vidéos
  1211. self.lecture_VisionVideo = Lecture_VisionVideo(self.statusBar())
  1212. (self.itemTree_LectureVisionVideo, self.stacked_lecture_vision_video)=self.createMenu(self.treeWidgetLecture, self.stacked_onglet_lecture,\
  1213. self.lecture_VisionVideo, _(u"Lecture de vidéos"),\
  1214. QIcon("Icones" + os.sep + "database.png"), self.itemDict)
  1215. self.indexStacked_visioVideo = self.stackedVisio.addWidget(self.lecture_VisionVideo.getFolder())
  1216.  
  1217. self.lectureSplitter.addWidget(self.stacked_onglet_lecture)
  1218.  
  1219. # ajout du widget contenant la boite dans l'onglet Lecture
  1220. i = tabWidget.addTab(self.lectureSplitter, '')
  1221. txt = _(u"Lecture")
  1222. tabWidget.setTabToolTip(i, txt)
  1223. if not petitEcran:
  1224. tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_visionner_128.png"))
  1225. else: tabWidget.setTabText(i, txt)
  1226.  
  1227.  
  1228. # onglet Mode Séquentiel ===========================
  1229.  
  1230. # En construction
  1231. if len(sys.argv)==2 and sys.argv[1]=="sequentiel":
  1232. # widget de base du dernier onglet
  1233. sequentiel = Sequentiel(self)
  1234.  
  1235. # ajout du widget contenant la boite dans l'onglet Séquentiel
  1236. i = tabWidget.addTab(sequentiel, '')
  1237. tabWidget.setTabToolTip(i, _(u"Conversions séquentielles"))
  1238. if not petitEcran:
  1239. tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_sequenciel_128.png"))
  1240. else: tabWidget.setTabText(i, _(u"Sequentiel"))
  1241.  
  1242.  
  1243. # -----------------
  1244. # Barre des tâches
  1245. # -----------------
  1246. self.statusBar().showMessage(u'Prêt', 5000)
  1247.  
  1248. # affichage des onglets au centre de la fenêtre
  1249. self.setCentralWidget(tabWidget)
  1250.  
  1251. # A pour effet d'assurer une taille minimale
  1252. # aux QTreeWidget lors de la 1ère ouverture de ekd
  1253. self.animSplitter.setStretchFactor(0, 4)
  1254. self.animSplitter.setStretchFactor(1, 4)
  1255. self.imageSplitter.setStretchFactor(0, 3)
  1256. self.imageSplitter.setStretchFactor(1, 4)
  1257. if self.audioSox :
  1258. self.sonSplitter.setStretchFactor(0, 1)
  1259. self.sonSplitter.setStretchFactor(1, 3)
  1260. self.lectureSplitter.setStretchFactor(0, 1)
  1261. self.lectureSplitter.setStretchFactor(1, 1)
  1262.  
  1263. #--------------------------------------------------
  1264. # Paramètres généraux de la fenêtre (suite et fin)
  1265. #--------------------------------------------------
  1266. # Paramètres contenus dans ~/.config/ekd/ekd.conf sous linux
  1267. display_mode = EkdConfig.get("general", 'display_mode')
  1268. ## display_mode peut-être : auto ou une résolution type WxH
  1269. if ( display_mode == "auto"):
  1270. size = settings.value("MainWindow/Size", QVariant(QSize(800, 600))).toSize()
  1271. else:
  1272. width, height = display_mode.split("x")
  1273. size = QSize(int(width), int(height))
  1274. settings.setValue("MainWindow/Size", QVariant(size))
  1275. self.resize(size)
  1276. position = settings.value("MainWindow/Position",QVariant(QPoint(0, 0))).toPoint()
  1277. self.move(position)
  1278. self.restoreState(settings.value("MainWindow/State").toByteArray())
  1279. splitList = [self.animSplitter, self.imageSplitter, self.sonSplitter,self.lectureSplitter ]
  1280. if int(EkdConfig.get("general", 'charger_split')):
  1281. for split, optionConfig in self.dicoSplit.items():
  1282. splitSetting = settings.value(optionConfig).toByteArray()
  1283. split.restoreState(splitSetting)
  1284.  
  1285.  
  1286. def info_aide(self):
  1287. """ Chargement de la classe de la boîte de dialogue pour afficher
  1288. l'aide en ligne (affichée dans le browser web par défaut du système),
  1289. les infos de développement et la licence """
  1290. aide_info = Aide_Info(self)
  1291. aide_info.show()
  1292.  
  1293. def fctMenuConfig(self):
  1294. "L'état des cases à cocher du menu configuration sont générés lors du clic sur le menu"
  1295. self.barreOutilsAction.setChecked(self.toolBar.isVisible())
  1296. actif = int(EkdConfig.get("general", 'boite_de_dialogue_de_fermeture'))
  1297. #
  1298. self.dialogSauvAction.setChecked(actif)
  1299. actif = int(EkdConfig.get("general", 'charger_split'))
  1300. #
  1301. self.splitAction.setChecked(actif)
  1302.  
  1303. def barreOutils(self):
  1304. "Affichage/masquage de la barre d'outils"
  1305. self.toolBar.setVisible(not self.toolBar.isVisible())
  1306.  
  1307.  
  1308. def mplayerAction(self):
  1309. "Widget mplayer"
  1310. try:
  1311. repEntree = EkdConfig.get('general','video_input_path').decode("UTF8")
  1312. except IndexError, e: #ConfigParser.NoOptionError, e:
  1313. repEntree = None
  1314.  
  1315. mplayer = Mplayer([], (600, 600*3/4),
  1316. (Mplayer.REVENIR,Mplayer.PRECEDENT_SUIVANT,Mplayer.CURSEUR_A_PART,Mplayer.PARCOURIR),
  1317. cheminParcourir=repEntree, parent=self)
  1318.  
  1319. mplayer.show()
  1320.  
  1321.  
  1322. def changerComboQA(self):
  1323. """ Affichage de l'index du combo """
  1324. print self.comboConfigQA.currentIndex()
  1325.  
  1326.  
  1327. def quoiAfficher(self):
  1328. """ L'utilisateur fait le choix de ce qui doit être visible
  1329. entre le menu, la barre des taches et les deux en même temps """
  1330. if self.comboConfigQA.currentIndex()==0:
  1331. # Uniquement la barre des taches sera visible
  1332. self.menuBar().hide()
  1333. self.toolBar.show()
  1334. elif self.comboConfigQA.currentIndex()==1:
  1335. # Uniquement le menu sera visible
  1336. self.menuBar().show()
  1337. self.toolBar.hide()
  1338. elif self.comboConfigQA.currentIndex()==2:
  1339. # Les deux seront affichés
  1340. self.menuBar().show()
  1341. self.toolBar.show()
  1342. # --------------------------------------------------------------------------
  1343.  
  1344.  
  1345. def dialogSauv(self):
  1346. "Faire apparaître/disparaître la boite de dialogue de sauvegarde en sortie"
  1347. if self.dialogSauvAction.isChecked():
  1348. EkdConfig.set("general", 'boite_de_dialogue_de_fermeture', '1')
  1349. else:
  1350. EkdConfig.set("general", 'boite_de_dialogue_de_fermeture', '0')
  1351.  
  1352.  
  1353. def splitPosition(self):
  1354. "Charger les paramètres de position relatives des menus/cadres (QSplitter)"
  1355. if self.splitAction.isChecked():
  1356. if QMessageBox.critical(self, _(u"Alerte"), _(u"Vous souhaitez activer le chargement des dernières positions relatives des menus verticaux et des cadres (split). Sous certaines configurations, le chargement des positions relatives des menus verticaux/cadres de chaque onglet fait apparaître des onglets vides au démarrage de EKD. Dans ce cas nous vous conseillons de ne plus charger les positions relatives des menus verticaux/cadres des onglets voire de réinitialiser les paramètres de configuration (voir les entrées du menu «Configuration» appropriées).\n\nVoulez-vous quand-même confimer votre choix?"), QMessageBox.Yes, QMessageBox.No)==QMessageBox.Yes:
  1357. EkdConfig.set("general", 'charger_split', '1')
  1358. else: self.splitAction.setChecked(False)
  1359. else:
  1360. EkdConfig.get("general", 'charger_split', '0')
  1361.  
  1362.  
  1363. def purgeConfig(self):
  1364. "Purge des fichiers de configuration"
  1365. #if self.purgeConfigAction.isChecked():
  1366. if int(EkdConfig.get("general", 'effacer_config')):
  1367. #if QMessageBox.warning(self, _(u"Alerte"), _(u"Vous souhaitez remettre les paramètres de configuration à leurs valeurs initiales. Cela purgera vos fichiers de configurations.\nSi vous faites cela pour résoudre un problème d'onglets vides, nous vous conseillons ensuite de redémarrer EKD.\n\nVoulez-vous quand-même confirmer votre choix?"), QMessageBox.Yes, QMessageBox.No)==QMessageBox.Yes:
  1368. if QMessageBox.warning(self, _(u"Alerte"),
  1369. _(u"Vous souhaitez remettre les paramètres de configuration à leurs valeurs initiales. Cela purgera vos fichiers de configurations.\n Si vous faites cela pour résoudre un problème d'onglets vides, nous vous conseillons ensuite de redémarrer EKD.\n\nVoulez-vous quand-même confirmer votre choix?"),
  1370. QMessageBox.Yes, QMessageBox.No) == QMessageBox.Yes:
  1371. EkdConfig.purge()
  1372.  
  1373.  
  1374. def closeEvent(self, event):
  1375. "actions à effectuer au moment de quitter"
  1376.  
  1377. def sauvChangements():
  1378. EkdConfig.save()
  1379. #
  1380.  
  1381. settings = QSettings()
  1382. settings.setValue("MainWindow/Size", QVariant(self.size()))
  1383. settings.setValue("MainWindow/Position",QVariant(self.pos()))
  1384. settings.setValue("MainWindow/State",QVariant(self.saveState()))
  1385. for split, optionConfig in self.dicoSplit.items():
  1386. settings.setValue(optionConfig, QVariant(split.saveState()))
  1387.  
  1388. if int(EkdConfig.get("general", 'boite_de_dialogue_de_fermeture')):
  1389. dialog = DialogQuitter(self)
  1390. if dialog.exec_():
  1391. sauverConf = not dialog.sauverConfCase.isChecked()
  1392. EkdConfig.set("general", 'boite_de_dialogue_de_fermeture',
  1393. str(int(sauverConf)))
  1394. EkdConfig.set("general", 'sauvegarder_parametres', str(Qt.Checked) )
  1395. sauvChangements()
  1396. else:
  1397. sauverConf = not dialog.sauverConfCase.isChecked()
  1398. EkdConfig.set("general", 'boite_de_dialogue_de_fermeture',
  1399. str(int(sauverConf)))
  1400. EkdConfig.set("general", 'sauvegarder_parametres', str(Qt.Unchecked))
  1401. self.purgeConfig()
  1402.  
  1403. elif int(EkdConfig.get("general", 'sauvegarder_parametres')):
  1404. sauvChangements()
  1405. self.purgeConfig()
  1406. event.accept()
  1407.  
  1408.  
  1409. def changeOnglet(self,i):
  1410. """ Effacer les données de la barre des tâches lorsque l'on change
  1411. d'onglet
  1412. """
  1413. if i==1 and self.clicInitialAnim:
  1414. self.stacked_onglet_animation.setCurrentIndex(self.imageAccueilAnim)
  1415. self.clicInitialAnim = 0
  1416. self.statusBar().clearMessage()
  1417.  
  1418.  
  1419. def createAction(self, text, slot=None, shortcut=None, icon=None,
  1420. tip=None, checkable=False, signal="triggered()"):
  1421. action = QAction(text, self)
  1422. if icon is not None:
  1423. action.setIcon(QIcon(icon))
  1424. if shortcut is not None:
  1425. action.setShortcut(shortcut)
  1426. if tip is not None:
  1427. action.setToolTip(tip)
  1428. action.setStatusTip(tip)
  1429. if slot is not None:
  1430. self.connect(action, SIGNAL(signal), slot)
  1431. if checkable:
  1432. action.setCheckable(True)
  1433. return action
  1434.  
  1435.  
  1436. def addActions(self, target, actions):
  1437. '''
  1438. Ajoute une liste d'actions à un menu :
  1439. target doit être un menu
  1440. actions une liste de QActions
  1441. ex : addActions(menu, (Ouvrir, Enregistrer, None, Quitter))
  1442. crée le menu suivant :
  1443. menu
  1444. |- Ouvrir
  1445. |- Enregistrer
  1446. |-------------
  1447. |- Quitter
  1448. '''
  1449. for action in actions:
  1450. if action is None:
  1451. target.addSeparator()
  1452. else:
  1453. target.addAction(action)
  1454.  
  1455.  
  1456. def videoOutput(self, vrai, vo):
  1457. "Enregistre la valeur de l'option '-vo' de mplayer dans un fichier de configuration"
  1458. if vrai:
  1459. settings = QSettings()
  1460. settings.setValue("vo", QVariant(vo))
  1461.  
  1462.  
  1463. def widgetOngletAccueil(self, cheminImg):
  1464. "Widget principal de la page d'accueil d'un onglet"
  1465. widget_img_accueil=QWidget()
  1466. # fond gris
  1467. if PYQT_VERSION_STR >= "4.1.0":
  1468. widget_img_accueil.setStyleSheet("QWidget { background-color: %s }"\
  1469. % QColor(140,140,140).name())
  1470. else:
  1471. widget_img_accueil.setAutoFillBackground(True)
  1472. widget_img_accueil.setPalette(QPalette(QColor(140,140,140)))
  1473. hbox_label=QHBoxLayout(widget_img_accueil)
  1474. objImg = QPixmap(cheminImg) # objet-image
  1475. label = QLabel()
  1476. label.setPixmap(objImg) # on inclut l'image dans le QLabel
  1477. hbox_label.addWidget(label, 0, Qt.AlignHCenter)
  1478. return widget_img_accueil
  1479.  
  1480.  
  1481. def naviguerImages(self, item):
  1482. "Ouvrir le contenu d'un répertoire (images)"
  1483. self.listViewVisioImg.setRootIndex(item)
  1484. modele = item.model()
  1485. rep=QDir(modele.filePath(item)).absolutePath()
  1486. print rep
  1487. self.statusBar().showMessage(rep)
  1488.  
  1489.  
  1490. def naviguerVideos(self, item):
  1491. "Ouvrir le contenu d'un répertoire (vidéos)"
  1492. self.listViewVisioVideo.setRootIndex(item)
  1493. modele = item.model()
  1494. rep=QDir(modele.filePath(item)).absolutePath()
  1495. self.statusBar().showMessage(rep)
  1496.  
  1497.  
  1498. def liste_animation(self, item):
  1499. '''Les éléments de la liste de menu à gauche modifient le contenu de la boite de droite de l'onglet animation'''
  1500. # item renvoie la référence de l'objet QTreeWidgetItem.
  1501. # Effacer les données de la barre des tâches lorsque l'on change d'entrée de l'arborescence
  1502. self.statusBar().clearMessage()
  1503. self.clicInitialAnim = 0
  1504. self.stacked_onglet_animation.setCurrentIndex(self.itemDict[item])
  1505. # temporaire !!!
  1506. z=16
  1507. if verif[8] :
  1508. z = 17
  1509. if self.itemDict[item] == z :
  1510. if verif[2] == 1 or verif[6] and self.msgDiapo == 0 :
  1511. QMessageBox.critical(None,_(u"Vérification des possibilités de FFMPEG"), verif[3].join("\n")+"\n"+verif[7].join("\n"))
  1512. self.msgDiapo = 1
  1513.  
  1514.  
  1515.  
  1516. def liste_image(self, item):
  1517. """Les éléments de la liste 2 modifient le contenu de la boite de droite de l'onglet images"""
  1518. # item renvoie la référence de l'objet QTreeWidgetItem.
  1519. self.statusBar().clearMessage()
  1520. self.stacked_onglet_image.setCurrentIndex(self.itemDict[item])
  1521.  
  1522.  
  1523. def liste_musique_son(self, item):
  1524. """Les éléments de la liste 1 modifient le contenu de la boite de droite de l'onglet musique_son"""
  1525. # item renvoie la référence de l'objet QTreeWidgetItem.
  1526. self.statusBar().clearMessage()
  1527. self.stacked_onglet_musique_son.setCurrentIndex(self.itemDict[item])
  1528.  
  1529.  
  1530.  
  1531. def liste_lecture(self, item):
  1532. """Les éléments de la liste 1 modifient le contenu de la boite de droite de l'onglet lecture"""
  1533. # item renvoie la référence de l'objet QTreeWidgetItem.
  1534. if item == self.itemTree_LectureVisionImage:
  1535. try :
  1536. self.stackedVisio.setCurrentIndex(self.indexStacked_visioImg)
  1537. except :
  1538. None
  1539. elif item == self.itemTree_LectureVisionVideo:
  1540. try :
  1541. self.stackedVisio.setCurrentIndex(self.indexStacked_visioVideo)
  1542. except :
  1543. None
  1544. self.stacked_onglet_lecture.setCurrentIndex(self.itemDict[item])
  1545.  
  1546.  
  1547.  
  1548. def createMenu(self, menuTree, widgetStack, Widget, name, icone, dico, expanded=True):
  1549. '''
  1550. Permet de faciliter la création des menu et des widget dans la stack
  1551. Le lien entre les deux est fait par cette fonction
  1552. Prend en paramètre:
  1553. * menuTree : racine du menu
  1554. * widgetStack : stack d'objet à lier au menu
  1555. * Widget : Objet à ajouter à la stack
  1556. * name : nom du menu
  1557. * icone : icone du menu
  1558. * dico : tableau contenant les index des objets dans le menu et dans la stack (les deux sont identiques)
  1559. * expended : est-ce que le menu doit être étendu ?
  1560. '''
  1561.  
  1562. itemTree=QTreeWidgetItem(menuTree)
  1563. itemTree.setText(0,_(name))
  1564. itemTree.setIcon(0,QIcon(icone))
  1565.  
  1566. dico[itemTree]=widgetStack.addWidget(Widget)
  1567. itemTree.setExpanded(expanded)
  1568.  
  1569. return (itemTree, dico[itemTree])
  1570. ###################################################################################################################
  1571.  
  1572. def sauver(self):
  1573. """
  1574. Sauve la configuration dans un fichier particulier
  1575. """
  1576. projectFile = EkdSaveDialog(self, path=None, suffix=('.ekd'), title=u"Sauver").getFile()
  1577. print "Sauvegarde de la configuration : ", projectFile
  1578. if projectFile :
  1579. idvProject = projectFile[:-4]+u".idv"
  1580. try : self.stacked_onglet_animation.widget(self.stacked_animation_Videoporama).saveprj(idvProject)
  1581. except : print "Echec sauvegarde du diaporama"
  1582. count = self.stacked_onglet_animation.count()
  1583. for objet in range(count):
  1584. try :
  1585. self.stacked_onglet_animation.widget(objet).save()
  1586. except :
  1587. print "Debug : Sauvegarde impossible de l'objet : ", objet
  1588.  
  1589. count = self.stacked_onglet_animation.count()
  1590.  
  1591. count = self.stacked_onglet_image.count()
  1592. for objet in range(count):
  1593. try :
  1594. self.stacked_onglet_image.widget(objet).save()
  1595. except :
  1596. print "Debug : Sauvegarde impossible de l'objet : ", objet
  1597.  
  1598. count = self.stacked_onglet_musique_son.count()
  1599. for objet in range(count):
  1600. try :
  1601. self.stacked_onglet_musique_son.widget(objet).save()
  1602. except :
  1603. print "Debug : Sauvegarde impossible de l'objet : ", objet
  1604.  
  1605. EkdConfig.save(configfile=projectFile)
  1606.  
  1607. def charger(self):
  1608. """
  1609. Charge la configuration à partir d'un fichier particulier
  1610. """
  1611. projectFile = EkdOpenDialog(self, path=None, suffix=('.ekd'), title=u"Charger").getFile()
  1612. print "Chargement de la configuration : ", projectFile
  1613. if projectFile :
  1614. idvProject = projectFile[:-4]+u".idv"
  1615. try :
  1616. self.stacked_onglet_animation.widget(self.stacked_animation_Videoporama).empty()
  1617. self.stacked_onglet_animation.widget(self.stacked_animation_Videoporama).loadprj(idvProject)
  1618. except : print "Pas de fichier idv à charger ou projet idv sans fichiers images"
  1619. EkdConfig.init(projectFile)
  1620. # Reload all objet
  1621. count = self.stacked_onglet_animation.count()
  1622. for objet in range(count):
  1623. try :
  1624. self.stacked_onglet_animation.widget(objet).load()
  1625. except :
  1626. print "Debug : Chargement impossible de l'objet : ", objet
  1627.  
  1628. count = self.stacked_onglet_image.count()
  1629. for objet in range(count):
  1630. try :
  1631. self.stacked_onglet_image.widget(objet).load()
  1632. except :
  1633. print "Debug : Chargement impossible de l'objet : ", objet
  1634.  
  1635. count = self.stacked_onglet_musique_son.count()
  1636. for objet in range(count):
  1637. try :
  1638. self.stacked_onglet_musique_son.widget(objet).load()
  1639. except :
  1640. print "Debug : Chargement impossible de l'objet : ", objet
  1641.  
  1642. def launchConfig(self):
  1643. """
  1644. Lance l'outil de configuration à partir du menu configuration
  1645. """
  1646. self.configBox = EkdConfigBox(parent=self)
  1647. self.configBox.show()
  1648.  
  1649.  
  1650. if __name__ == "__main__":
  1651.  
  1652. import __builtin__
  1653. from functools import partial
  1654.  
  1655. # Traduction des boites de dialogue Qt
  1656. locale = unicode(QLocale.system().name()) # ex: fr_FR
  1657. print "\n\n", locale
  1658.  
  1659. # Sélection du répertoire de traduction
  1660. localeDir = os.path.join(os.getcwd(), "locale")
  1661. if not os.path.exists(localeDir):
  1662. localeDir = os.path.join(os.path.dirname(sys.argv[0]), "locale")
  1663.  
  1664. app = QApplication(sys.argv)
  1665.  
  1666. qtTranslator = QTranslator()
  1667. try: symboleLangue = locale.split('_')[0] # ex: fr
  1668. except ValueError, e:
  1669. print e
  1670. symboleLangue = "inconnu"
  1671. if qtTranslator.load("qt_"+locale, os.path.join(localeDir, 'translations')):
  1672. app.installTranslator(qtTranslator)
  1673. elif qtTranslator.load("qt_"+symboleLangue, os.path.join(localeDir, 'translations')):
  1674. app.installTranslator(qtTranslator)
  1675. else:
  1676. print "Pas de fichier", "qt_"+locale+'.qm', "ou", "qt_"+symboleLangue+'.qm', "détecté"
  1677.  
  1678. qtTranslator2 = QTranslator()
  1679. if qtTranslator2.load("videoporama_"+symboleLangue,os.path.join(localeDir, 'translations')) :
  1680. app.installTranslator(qtTranslator2)
  1681. print "Langue videoporama OK"
  1682. elif qtTranslator.load("videoporama_"+locale,os.path.join(localeDir, 'translations')) :
  1683. app.installTranslator(qtTranslator2)
  1684. print "Langue videoporama OK"
  1685.  
  1686. # Traduction de l'interface courante (ex. locale/es_ES/LC_MESSAGES/ekd.po pour l'espagnol)
  1687. try:
  1688. traduction = gettext.translation('ekd', localeDir, languages=[locale])
  1689. except IOError, e:
  1690. traduction = gettext.translation('ekd', localeDir, languages=[symboleLangue], fallback=True)
  1691. # Traduction de l'aide (ex. locale/es_ES/LC_MESSAGES/ekdDoc.po pour l'espagnol)
  1692. try:
  1693. traductionDoc = gettext.translation('ekdDoc', localeDir, languages=[locale])
  1694. except IOError:
  1695. traductionDoc = gettext.translation('ekdDoc', localeDir, languages=[symboleLangue], fallback=True)
  1696.  
  1697. __builtin__.__dict__['_'] = partial(traduction.ugettext)
  1698. __builtin__.__dict__['tr'] = partial(traductionDoc.ugettext)
  1699.  
  1700. verif = verifAppliManquante()
  1701.  
  1702.  
  1703. # Nom du répertoire et du début du fichier de configuration
  1704. app.setOrganizationName("ekd")
  1705. app.setApplicationName("ekd")
  1706. app.setOrganizationDomain("ekd.tuxfamily.org")
  1707.  
  1708. txt1 = _(u"Les applications suivantes n'ont pas été détectées:")
  1709. txt2 = _(u"EKD ne sera pas pleinement fonctionnel (s'il démarre...) \n")
  1710.  
  1711. depMsg = u""
  1712.  
  1713. if not verif[0]:
  1714. depMsg = txt1 + u" " + verif[1] + u"\n"
  1715.  
  1716. if verif[6] or not verif[0] : #or verif[2] :
  1717. QMessageBox.critical(None,_(u"Vérification des dépendances de EKD"),depMsg + verif[7].join("\n" + txt2))
  1718.  
  1719.  
  1720. # -------------------------------------------------------------
  1721. # Import des modules contenus dans des fichiers separes
  1722. # -------------------------------------------------------------
  1723.  
  1724. # Uniquement pour windows
  1725. #
  1726. # Nombre de dependances pour EKD
  1727. nbre_dep = 11
  1728. # Chemin du script d'installation sous windows
  1729. chem_inst_win = os.getcwd()+os.sep+'windows'+os.sep+'chemin_install_applis'
  1730. # Liste des fichiers contenus ds le repertoire
  1731. liste_chem_inst_win = os.listdir(chem_inst_win)
  1732. # Si un fichier est vide (c'est à dire d'un poids 0 octet) il est signale ds cette liste
  1733. l_lect_dep_non_inst = [[dep_no] for dep_no in liste_chem_inst_win if os.path.getsize(chem_inst_win+os.sep+dep_no) == 0]
  1734. #
  1735. if os.name == 'nt':
  1736. if len(liste_chem_inst_win) < nbre_dep or len(l_lect_dep_non_inst) > 0:
  1737. # DEPENDANCES (vérif de la présence de ttes les applis pour EKD) -----
  1738. from dependances_windows.chemin_install_applis import DetectionRegistreApplis
  1739. # Appel de la classe
  1740. detect = DetectionRegistreApplis()
  1741.  
  1742. # GESTION DES LANGUES ------------------------------------------------
  1743. from gestion_des_langues_en_local import GestionLangues
  1744. # Appel de la classe
  1745. glang = GestionLangues()
  1746.  
  1747. # Outils Communs --------------------------------------------------------------------------
  1748. from gui_modules_common.EkdWidgets import EkdLabel, EkdSaveDialog, EkdOpenDialog, EkdConfigBox
  1749. from moteur_modules_common.EkdConfig import EkdConfig
  1750.  
  1751.  
  1752. # ANIMATION --------------
  1753.  
  1754. from gui_modules_animation.animation_encodage import Animation_Encodage
  1755. # + ---------------------------
  1756. from gui_modules_animation.animation_encodage_general import Animation_Encodage_General
  1757. from gui_modules_animation.animation_encodage_web import AnimationEncodageWeb
  1758. from gui_modules_animation.animation_encodage_hd import AnimationEncodageHD
  1759. if verif[8] :
  1760. from gui_modules_animation.animation_encodage_avchd import AnimationEncodageAVCHD
  1761. # + ---------------------------
  1762. from gui_modules_animation.animation_filtres_video import Animation_FiltresVideos
  1763. from gui_modules_animation.animation_montage_video import Animation_MontagVideo
  1764. # + ---------------------------
  1765. from gui_modules_animation.animation_montage_video_vid_seul import Animation_MontagVideoVidSeul
  1766. from gui_modules_animation.animation_montage_video_vid_plus_audio import Animation_MontagVideoVidPlusAudio
  1767. from gui_modules_animation.animation_montage_video_decoup_une_vid import Animation_MontagVideoDecoupUneVideo
  1768. # -----------------------------
  1769. from gui_modules_animation.animation_separer_video_et_audio import Animation_SeparVideoEtAudio
  1770. from gui_modules_animation.animation_conv_img_en_anim import Animation_ConvertirImgEnAnim
  1771. from gui_modules_animation.animation_conv_anim_en_img import Animation_ConvertirUneAnimEnImg
  1772. from gui_modules_animation.animation_reglag_divers import Animation_ReglagesDivers
  1773. from gui_modules_animation.animation_conv_vid_16_9_ou_4_3 import Animation_ConvertirAnimEn_16_9_Ou_4_3
  1774. # -----------------------------
  1775. from videoporama.videoporama_main import *
  1776. # -----------------------------
  1777. ### Ajouté le 05/09/10 pour la gestion des Tags vidéo #####################
  1778. from gui_modules_animation.animation_tags_video import Animation_TagsVideo
  1779. ###########################################################################
  1780.  
  1781. # IMAGE ------------------
  1782. # divers
  1783. from gui_modules_image.divers.image_divers import Image_Divers
  1784. # + ---------------------------
  1785. from gui_modules_image.divers.image_divers_chang_format import Image_Divers_ChangFormat
  1786. from gui_modules_image.divers.image_divers_compositing import Image_Divers_Compositing
  1787. from gui_modules_image.divers.image_divers_info import Image_Divers_Info
  1788. from gui_modules_image.divers.image_divers_pl_contact import Image_Divers_PlContact
  1789. from gui_modules_image.divers.image_divers_pour_le_web import Image_Divers_PourLeWeb
  1790. from gui_modules_image.divers.image_divers_redimensionner import Image_Divers_Redimensionner
  1791. from gui_modules_image.divers.image_divers_renom_img import Image_Divers_RenomImg
  1792. from gui_modules_image.divers.image_divers_multiplic_img import Image_Divers_MultiplicImg
  1793. # Pas de module texte sur items sous debian etch
  1794. if PYQT_VERSION_STR >= "4.1.0":
  1795. from gui_modules_image.divers.image_divers_txt_sur_img import Image_Divers_TxtSurImg
  1796. # -----------------------------
  1797. # transitions
  1798. from gui_modules_image.transitions.image_transitions import Image_Transitions
  1799. # + ---------------------------
  1800. from gui_modules_image.transitions.image_transitions_fond_ench import Image_Transitions_FondEnch
  1801. from gui_modules_image.transitions.image_transitions_spirale import Image_Transitions_Spirale
  1802. # -----------------------------
  1803. # masque_alpha_3d
  1804. from gui_modules_image.masque_alpha_3d.image_masque_alpha_3d import Image_MasqueAlpha3D
  1805. # -----------------------------
  1806. # filtres_images
  1807. from gui_modules_image.filtres_images.image_filtres_image import Image_FiltresImage
  1808.  
  1809. # MUSIQUE-SON ------------
  1810. from gui_modules_music_son.music_son_encodage import MusiqueSon_Encodage
  1811. from gui_modules_music_son.music_son_join_multiplefile import MusiqueSon_Join
  1812. from gui_modules_music_son.music_son_decoupe import MusiqueSon_decoupe
  1813. from gui_modules_music_son.music_son_normalize import MusiqueSon_normalize
  1814.  
  1815. # LECTURE ----------------
  1816. from gui_modules_lecture.lecture_image import Lecture_VisionImage
  1817. from gui_modules_lecture.lecture_video import Lecture_VisionVideo
  1818.  
  1819. # MODE-SEQUENTIEL ------------- # En construction
  1820. if len(sys.argv)==2 and sys.argv[1]=="sequentiel":
  1821. from gui_modules_sequentiel.sequentiel import Sequentiel
  1822. # -------------------------------------------------------------
  1823.  
  1824. # ----------------------------------------------------------
  1825. # MPlayer
  1826. from moteur_modules_animation.mplayer import Mplayer
  1827. # ----------------------------------------------------------
  1828.  
  1829. EkdConfig.init()
  1830.  
  1831. main = Gui_EKD()
  1832.  
  1833. app.setStyle(QStyleFactory.create(EkdConfig.get("general", "qtstyle")))
  1834.  
  1835. main.show()
  1836. sys.exit(app.exec_())
  1837.