#!/usr/bin/python # -*- coding: utf-8 -*- import os, re import sys #from gui_modules_music_son.music_son_base_sox import checkSoxEncoding from moteur_modules_common.EkdProcess import EkdProcess ############### from moteur_modules_common.EkdCompatiblePython2Et3 import EkdPrint ############### from moteur_modules_common.EkdTools import debug from moteur_modules_common.EkdConfig import EkdConfig from gui_modules_common.EkdTamponIn import * from PyQt4.QtCore import Qt, SIGNAL, QSize, QFile, QIODevice, QTextStream from PyQt4.QtCore import QLocale, QTranslator, QStringList from PyQt4.QtGui import QDialog, QTabWidget, QVBoxLayout, QFrame, QTextBrowser from PyQt4.QtGui import QPixmap, QDialogButtonBox, QImage, QMainWindow from PyQt4.QtGui import QApplication, QMessageBox, QStyleFactory from moteur_modules_common.EkdVerifAppliManquante import verifAppliManquante ########## # Add a progressbar at startup from gui_modules_common.EkdWidgets import EkdProgress # Pour windows uniquement if os.name == 'nt': "#! "+sys.executable ''' ----------------------------------------------------------------------- GPL v3 ----------------------------------------------------------------------- EKD can be used to make post production operations for video files and images. Copyright (C) 2011 Lama Angelo (the historical developer of the program) with the contribution of Aurélien Cedeyn and Olivier Ponchaut to this 2011 version of EKD. EKD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. EKD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA To contact the developpers of EKD, go here: http://ekd.tuxfamily.org/index.php/Main/ForumDiscussion ----------------------------------------------------------------------- ''' import gettext ### Import de minidom pour Videoporama from xml.dom import minidom import ConfigParser, locale, platform os.chdir(os.path.dirname(os.path.abspath(sys.argv[0]))) # Version de ekd __version__ = "3.1.3" class Documentation(QDialog): ''' # ------------------------------------------------------------- # Classe pour Chargement de la boîte de dialogue pour afficher # l'aide en ligne (affichée dans le browser web par défaut du # système). # ------------------------------------------------------------- ''' def __init__(self, parent=None): QDialog.__init__(self, parent) self.setAttribute(Qt.WA_DeleteOnClose) self.setMinimumSize(QSize(800, 480)) # Titre de la fenetre self.setWindowTitle(_(u'Aide en ligne')) locale_debut = str(QLocale.system().name())[0:2] vbox_doc = QVBoxLayout() self.tabWid = QTabWidget() #=== 1er onglet ===# self.framdoc_1 = QFrame() vboxFramDoc_1 = QVBoxLayout(self.framdoc_1) # Liens en français if locale_debut == 'fr': docGen = "
" # Documentation générale
docBarrOutConfEkd = " " # Barre d'outils et configuration d'EKD
docTraitVidParExemp = " " # Le traitement vidéo par l’exemple
docTraitImgParExemp = " " # Le traitement des images par l’exemple
docFiltresVid = " " # Les filtres vidéo
docMontagVid = " " # Le montage vidéo
docTitDsUneVid = " " # Titrage dans une vidéo
docGestionAVCHD = " " # Gestion de l'AVCHD dans EKD
docGestProjetDsEkd = " " # La gestion de projet dans EKD
docStructFormFichPourEkd = " " # Structure du format de fichier pour EKD
PlanchContactImg = " " # Planche-contact pour les images
docInfosImgPhoto = " " # Informations pour les images/photos
docRomanPhoto = " " # Réaliser un roman-photo avec EKD
docAjoutTxtSurImg = " " # Ajout d’éléments (texte/images)
docCompositing = " " # Faire du compositing avec EKD
docRenomImg = " " # Le renommage d’images dans EKD
docPourLeWeb = " " # Pour le web (gif animé et morcellement/découpe)
docTransitionsImg = " " # Transitions pour les images
docMasqueAlpha3D = " " # Masque alpha/3D (chroma key) pour les images
docFiltresImg = " " # Utilisation des filtres image dans EKD
docLecturImg = " " # Visionner des images sous EKD
docLecturVid = " " # Lecture de vidéos dans EKD
docInstallSourcEkdLinux = " " # Installation d’EKD sous GNU/Linux par le script d'install facile
docKitWindows = " " # Kit EKD Windows à partir du dépôt SVN
docCreationVersPortable = " " # Construire la version portable pour windows
docContructExeEkd = " " # Construire un exécutable d’EKD pour Windows
# Liens en anglais (ou dans toute autre langue que francophone)
else:
docGen = " " # Documentation générale
docBarrOutConfEkd = " " # Barre d'outils et configuration d'EKD
docTraitVidParExemp = " " # Le traitement vidéo par l’exemple
docTraitImgParExemp = " " # Le traitement des images par l’exemple
docFiltresVid = " " # Les filtres vidéo
docMontagVid = " " # Le montage vidéo
docTitDsUneVid = " " # Titrage dans une vidéo
docGestionAVCHD = " " # Gestion de l'AVCHD dans EKD
docGestProjetDsEkd = " " # La gestion de projet dans EKD
docStructFormFichPourEkd = " " # Structure du format de fichier pour EKD
PlanchContactImg = " " # Planche-contact pour les images
docInfosImgPhoto = " " # Informations pour les images/photos
docRomanPhoto = " " # Réaliser un roman-photo avec EKD
docAjoutTxtSurImg = " " # Ajout d’éléments (texte/images)
docCompositing = " " # Faire du compositing avec EKD
docRenomImg = " " # Le renommage d’images dans EKD
docPourLeWeb = " " # Pour le web (gif animé et morcellement/découpe)
docTransitionsImg = " " # Transitions pour les images
docMasqueAlpha3D = " " # Masque alpha/3D (chroma key) pour les images
docFiltresImg = " " # Utilisation des filtres image dans EKD
docLecturImg = " " # Visionner des images sous EKD
docLecturVid = " " # Lecture de vidéos dans EKD
docInstallSourcEkdLinux = " " # Installation d’EKD sous GNU/Linux par le script d'install facile
docKitWindows = " " # Kit EKD Windows à partir du dépôt SVN
docCreationVersPortable = ""
+ docTraitVidParExemp + _(u"Le traitement vidéo par l’exemple") +" " # Didacticiel vidéo 1
didacVid_2 = " " # Didacticiel vidéo 2
didacVid_3 = " " # Didacticiel vidéo 3
didacVid_4 = " " # Didacticiel vidéo 4
didacVid_5 = " " # Didacticiel vidéo 5
didacVid_6 = " " # Didacticiel vidéo 6
didacVid_7 = " " # Didacticiel vidéo 7
didacVid_8 = " " # Didacticiel vidéo 8
didacVid_9 = " " # Didacticiel vidéo 9
didacVid_10 = " " # Didacticiel vidéo 10
didacVid_11 = " " # Didacticiel vidéo 11
didacVid_12 = ""
+ didacVid_2 + _(u"Diaporama d’images en vidéo") +" Version")
txt += " Ekd v {0}".format(__version__)
txt_ = _(u"Cette application peut être utilisée pour des opérations de post-production pour vidéo et lots d'images")
txt += " " + txt_
txt_ = _(u"Octobre 2012")
txt += " " + txt_
txt += """ Python {0} - Qt {1} - PyQt {2} - {3}""".format(
platform.python_version(),
QT_VERSION_STR, PYQT_VERSION_STR, platform.system())
txt += _(u" Développement")
txt += _(u" * Lama Angelo: développeur historique du logiciel")
txt += _(u" * Olivier Ponchaut (Marmotte): développeur")
txt += _(u" * Aurélien Cedeyn (Ptah): développeur")
txt += _(u" Traduction anglaise")
txt += _(u" * Bellegarde Sophie")
txt += _(u" * Bellegarde Laurent")
txt += _(u" Traduction espagnole")
txt += _(u" * Jesús MUÑOZ")
txt += _(u" Traduction allemande")
txt += _(u" * Magdalena Auguste")
txt += _(u" Traduction néerlandaise")
txt += _(u" * Ward De Ridder")
txt += _(u" Traduction portugaise")
txt += _(u" * Renata Wojtas")
txt += _(u" Traduction anglaise du site officiel")
txt += _(u" * Paparelle Giorgio")
txt += _(u" Graphisme")
txt += _(u" * Labarussias Thomas: conception des icônes et du logo officiel")
txt += _(u" Avec la participation de ...")
txt += _(u" * Bellegarde Laurent: tests divers et conseils")
txt += _(u" Partenariat (le projet EKD est soutenu par):")
txt += _(u" * Lprod: http://fr.lprod.org")
txt += _(u" * Le collège Dunois à Caen (France): http://lcs.dunois.clg14.ac-caen.fr/~site-web")
txt += _(u" Suivre EKD:")
txt += _(u" * Le site: http://ekd.tuxfamily.org")
txt += _(u" * Le blog: http://ekdm.wordpress.com")
txt += _(u" * Le forum: http://sourceforge.net/apps/phpbb/ekd")
txt += _(u" Documentation et didacticiels réalisés par:")
txt += _(u" * Lama Angelo")
zoneText = QTextEdit(txt)
if PYQT_VERSION_STR >= "4.1.0":
zoneText.setTextInteractionFlags(Qt.TextSelectableByMouse|Qt.TextSelectableByKeyboard)
zoneText.setReadOnly(True)
vboxFram_1.addWidget(zoneText,1)
vboxFram_1.setAlignment(Qt.AlignHCenter)
vboxFram_1.addStretch()
#=== 2ème onglet ===#
self.fram_2 = QFrame()
vboxFram_2 = QVBoxLayout(self.fram_2)
v_box_fram_2 = QVBoxLayout()
label_texte=QLabel(_(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). Voulez-vous quand-même confimer votre choix ? Vous souhaitez remettre les paramètres de configuration à leurs valeurs initiales. Cela purgera vos fichiers de configurations. Si vous faites cela pour résoudre un problème d'onglets vides, nous vous conseillons ensuite de redémarrer EKD. Voulez-vous quand-même confirmer votre choix ?Termes de l'utilisation d'EKD par la GPL version 3
")
fh = QFile('menu_et_toolbar'+os.sep+'copyright_ekd_gplv3_mise_en_forme.txt')
fh.open(QIODevice.ReadOnly)
stream = QTextStream(fh)
stream.setCodec("UTF-8")
texte_2 = unicode(stream.readLine())
fh.close()
texte_3="GNU General Public License Version 3, 29 June 2007
"
fh = QFile('menu_et_toolbar'+os.sep+'gplv3_mise_en_forme.txt')
fh.open(QIODevice.ReadOnly)
stream = QTextStream(fh)
stream.setCodec("UTF-8")
texte_4 = unicode(stream.readLine())
fh.close()
zoneTexte = QTextEdit(texte_1+texte_2+texte_3+texte_4)
zoneTexte.setReadOnly(True)
#zoneTexte.setMinimumHeight(408)
zoneTexte.setMinimumHeight(204)
vboxFram_2.addLayout(v_box_fram_2)
vboxFram_2.addWidget(label)
vboxFram_2.addWidget(zoneTexte)
vboxFram_2.addStretch()
self.index_1 = self.tabWidget.addTab(self.fram_1, _(u'Développement et graphisme'))
self.index_2 = self.tabWidget.addTab(self.fram_2, _(u'Licence'))
boutonFermer = QPushButton(_(u"Revenir"))
boutonFermer.setIcon(QIcon("Icones"+os.sep+"revenir.png"))
self.connect(boutonFermer, SIGNAL('clicked()'), SLOT('close()'))
vbox_info.addWidget(self.tabWidget)
vbox_info.addWidget(boutonFermer)
self.setLayout(vbox_info)
class DialogQuitter(QDialog):
'''
Boite de dialogue de fermeture de ekd
sauverConfCase : Case à cocher de sauvegarde des paramètres
'''
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.setWindowTitle(_(u'Message'))
vbox = QVBoxLayout(self)
questionLabel = QLabel(_(u"Voulez-vous sauver les nouveaux paramètres de configuration?"))
self.sauverConfCase = QCheckBox(_(u"Ne plus poser la question à chaque fois"))
if PYQT_VERSION_STR >= "4.1.0":
buttonBox = QDialogButtonBox(QDialogButtonBox.Yes|QDialogButtonBox.No)
boutonOui = buttonBox.button(QDialogButtonBox.Yes)
boutonNon = buttonBox.button(QDialogButtonBox.No)
else:
buttonBox = QWidget()
vboxButtonBox = QHBoxLayout(buttonBox)
vboxButtonBox.addStretch()
boutonOui = QPushButton(_(u'&Oui'))
boutonNon = QPushButton(_(u'&Non'))
vboxButtonBox.addWidget(boutonOui)
vboxButtonBox.addWidget(boutonNon)
messagebox_info = QPixmap("Icones"+os.sep+"messagebox_info.png")
icone = QLabel()
icone.setPixmap(messagebox_info)
hboxButton = QHBoxLayout()
hboxButton.addStretch()
hboxButton.addWidget(buttonBox)
vboxText = QVBoxLayout()
vboxText.addWidget(questionLabel)
vboxText.addWidget(self.sauverConfCase)
hboxIconText = QHBoxLayout()
hboxIconText.addWidget(icone)
hboxIconText.addStretch(0)
hboxIconText.addLayout(vboxText)
vbox.addLayout(hboxIconText)
vbox.addStretch(0)
vbox.addLayout(hboxButton)
boutonOui.setFocus()
self.connect(boutonOui,SIGNAL("clicked()"),self.accept)
self.connect(boutonNon,SIGNAL("clicked()"),self.reject)
class Gui_EKD(QMainWindow):
'''
# -----------------------------------------
# Classe principale . Base de l'interface .
# -----------------------------------------
'''
## On ajoute la taille minimale du split gauche
minMenuSize = 250
def __init__(self):
QMainWindow.__init__(self)
# -----------------------------------------------------
# Parametres Generaux de la fenetre Principale (début)
# -----------------------------------------------------
# Titre de la fenetre
self.setWindowTitle('EnKoDeur-Mixeur')
# Icone de EKD
self.setWindowIcon(QIcon('Icones' + os.sep + 'logo_ekd.png'))
# Dimension mini de la fenêtre
self.setMinimumSize(QSize(800, 480))
# Start a progressbar
self.progress=EkdProgress(parent=self, totfile=8, closable=True)
self.progress.setWindowTitle(_(u"Démarrage de EnKoDeur-Mixeur..."))
self.progress.show()
#=== chargement et lecture du fichier de configuration
# (plutôt méthode linux) ===#
home = unicode(QDir.homePath())
# Variable pour la fonction tamponEKD
self.tableauCourant = None
# Pour windows uniquement
if os.name == 'nt':
# Pour windows. Les fichiers de config sont mis directement dans l'arborescence d'EKD.
# L'arborescence d'EKD sous windows sera:
# windows\\...\\... tous les reps. et fichiers spécifiques à la version windows
self.configdir = 'windows'
pathConfig = 'windows'
if not QDir(pathConfig).exists():
EkdPrint(u" pathConfig didn't exist, creating - {0}".format(pathConfig))
os.makedirs(os.getcwd + os.sep + pathConfig)
else:
EkdPrint(u" pathConfig exists, not creating - {0}".format(pathConfig))
# Pour Linux et MacOSX
elif os.name in ['posix', 'mac']:
# appelé depuis une fonction
self.configdir = '.config' + os.sep +'ekd'
pathConfig = home + os.sep + self.configdir
if not QDir(pathConfig).exists():
EkdPrint(u" pathConfig didn't exist, creating - {0}".format(pathConfig))
if not QDir(home).mkpath(pathConfig):
EkdPrint(u" Création : echec")
else:
EkdPrint(u" pathConfig exists, not creating - {0}".format(pathConfig))
pathname = os.path.dirname (sys.argv[0])
refdir = os.path.abspath (pathname) + os.sep + "videoporama" + os.sep + "template" + os.sep
# Step Videoporama
self.progress.addText(_(u"Initialisation du chemin.... OK"))
self.progress.upProgress()
### Vérification que les fichiers de config videoporama existent, sinon les copier
### à partir du répertoire template.
if (not os.path.exists(pathConfig + os.sep + "template_data.idv")) :
reffile=open(refdir + os.sep +u"template_data.idv","r")
destfile=open(pathConfig + os.sep + u"template_data.idv","w")
destfile.write(reffile.read())
destfile.close()
# Step sox
self.progress.addText(_(u"Initialisation de Videoporama.... OK"))
self.progress.upProgress()
# Import de données de configurations au départ du fichier xml
self.msgDiapo = 0
### Activation ou non de l'onglet Audio si Sox est installé ou non
self.audioSox = True
#####################################################################################
# Vérification des possibilités de Sox en encodage
#####################################################################################
#self.soxSuppFormat = []
#if not verif[0] and "sox" in verif[1] :
# self.audioSox = False
# self.suitInit()
#else :
# usableFormat = [u"wav",u"ogg",u"flac",u"mp3",u"mp2",u"wma"]
# checkSox = checkSoxEncoding(usableFormat,self)
# self.connect(checkSox,SIGNAL("checkSox"),self.composeListeFormat)
# checkSox.run()
### Lorsque la verification des possibilites de Sox seront terminees, les fonctions
### d'initialisation se poursuivent.
#def composeListeFormat(self,formatValide) :
# for format in formatValide :
# if format[1] :
# self.soxSuppFormat.append(format[0])
# self.suitInit()
#def suitInit(self) :
# Suite des fonctions d'initialisation.
# ---------------------------------------------------------
# Menu principal - Barre d'outils
# ---------------------------------------------------------
#=== Actions générales ===#
# Step GUI
self.progress.addText(_(u"Initialisation de Sox.... OK"))
self.progress.upProgress()
if PYQT_VERSION_STR >= "4.1.0": raccourcis = QKeySequence.Save
else : raccourcis = "Ctrl + S"
sauverProjetAction = self.createAction(_(u'&Sauver le projet'), slot=self.sauver,
shortcut=raccourcis, icon='Icones'+os.sep+'icone_save_128.png',tip=_(u"Sauver le projet"),signal="triggered()")
if PYQT_VERSION_STR >= "4.1.0": raccourcis = QKeySequence.Open
else : raccourcis = "Ctrl + O"
chargerProjetAction = self.createAction(_(u'&Charger le projet'), slot=self.charger,
shortcut=raccourcis, icon='Icones'+os.sep+'icone_load_128.png',tip=_(u"Charger le projet"),signal="triggered()")
if PYQT_VERSION_STR >= "4.1.0": raccourcis = QKeySequence.Close
else : raccourcis = "Ctrl + Q"
quitterAction = self.createAction(_(u'&Quitter'), slot=self.close,
shortcut=raccourcis, icon='Icones'+os.sep+'icone_quit_128.png',tip=_(u"Fermer l'application"),signal="triggered()")
self.barreOutilsAction = self.createAction(_(u"&Barre d'outils"), slot=self.barreOutils,
tip=_(u"Afficher" + os.sep + "Masquer la barre d'outils"), checkable=True, signal="triggered()")
if PYQT_VERSION_STR >= "4.1.0": raccourcis = QKeySequence.HelpContents
else: raccourcis = "F1"
aboutAction = self.createAction(_(u"&A propos d'EKD"), slot=self.info,
shortcut=raccourcis, icon='Icones' + os.sep + 'icone_info_128.png',
tip=_(u"Afficher les contributeurs, les liens vers documentation et la licence de EKD"), signal="triggered()")
raccourcis = "F2"
docAction = self.createAction(_(u"&Aide en ligne"), slot=self.documentation,
shortcut=raccourcis, icon='Icones' + os.sep + 'icone_aide_128.png',
tip=_(u"Afficher les liens vers la documentation d'EKD"), signal="triggered()")
mplayerAction = self.createAction(_(u"&Lecteur vidéo"), slot=self.mplayerAction,
icon='Icones' + os.sep + 'icone_visionner_128.png',tip=_(u"Lancer un lecteur vidéo"), signal="triggered()")
tamponEKDAction = self.createAction(_(u"&Tampon"), slot=self.tamponEKDAction,
icon='Icones' + os.sep + 'database.png', tip=_(u"Réserve de fichiers sources"), signal="triggered()")
"""
# Inutilisé, ces action sont gérées dans la configuration générale
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"))
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."))
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"))
"""
### Ajout de la boite de dialogue de configuration
self.ConfigAction = self.createAction(_(u"&Configuration générale"), slot=self.launchConfig,
icon='Icones' + os.sep + 'icone_config_128.png', signal="triggered()", tip=_(u"Configuration des différents composants de Ekd"))
# Uniquement pour Linux et MacOSX
if os.name == 'posix':
# Sortie vidéo de mplayer
groupVideoOutput = QActionGroup(self)
defautvoAction = self.createAction(_(u"&défaut"), checkable=True,
slot=lambda a, b='':self.videoOutput(a, b),
tip=_(u"Sortie vidéo définie dans les fichiers de configuration de mplayer"),
signal="toggled(bool)")
groupVideoOutput.addAction(defautvoAction)
xmgaAction = self.createAction("x&mga", checkable=True,
slot=lambda a, b='xmga':self.videoOutput(a, b),
tip=_(u"Matrox G200/G4x0/G550 overlay in X11 window (using /dev/mga_vid)"),
signal="toggled(bool)")
groupVideoOutput.addAction(xmgaAction)
xvAction = self.createAction("&xv", checkable=True,
slot=lambda a, b='xv':self.videoOutput(a, b), tip=_(u" X11/Xv"), signal="toggled(bool)")
groupVideoOutput.addAction(xvAction)
x11Action = self.createAction("x&11", checkable=True,
slot=lambda a, b='x11':self.videoOutput(a, b), tip=_(u"X11 (XImage/Shm)"),
signal="toggled(bool)")
groupVideoOutput.addAction(x11Action)
glAction = self.createAction("&gl", checkable=True,
slot=lambda a, b='gl':self.videoOutput(a, b), tip=_(u"X11 (OpenGL)"),
signal="toggled(bool)")
groupVideoOutput.addAction(glAction)
gl2Action = self.createAction("gl&2", checkable=True,
slot=lambda a, b='gl2':self.videoOutput(a, b),
tip=_(u"X11 (OpenGl) - multiple textures version"), signal="toggled(bool)")
groupVideoOutput.addAction(gl2Action)
dxr3Action = self.createAction("dx&r3", checkable=True,
slot=lambda a, b='dxr3':self.videoOutput(a, b), tip=_(u"DXR3/H+ video out"),
signal="toggled(bool)")
groupVideoOutput.addAction(dxr3Action)
xvidixAction = self.createAction("xv&idix", checkable=True,
slot=lambda a, b='xvidix':self.videoOutput(a, b), tip=_(u"X11 (VIDIX)"),
signal="toggled(bool)")
groupVideoOutput.addAction(xvidixAction)
vidixAction = self.createAction("v&idix", checkable=True,
slot=lambda a, b='vidix':self.videoOutput(a, b), tip=_(u"VIDIX (VIDeo Interface for *niX)"),
signal="toggled(bool)")
groupVideoOutput.addAction(vidixAction)
cvidixAction = self.createAction("cv&idix", checkable=True,
slot=lambda a, b='cvidix':self.videoOutput(a, b), tip=_(u"Generic and platform independent VIDIX frontend"),
signal="toggled(bool)")
groupVideoOutput.addAction(cvidixAction)
vesaAction = self.createAction("vesa", checkable=True,
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"),
signal="toggled(bool)")
groupVideoOutput.addAction(vesaAction)
svgaAction = self.createAction("svga", checkable=True,
slot=lambda a, b='svga':self.videoOutput(a, b), tip=_(u"Play video using the SVGA library"),
signal="toggled(bool)")
groupVideoOutput.addAction(svgaAction)
fbdevAction = self.createAction("fbdev", checkable=True,
slot=lambda a, b='fbdev':self.videoOutput(a, b), tip=_(u"Uses the kernel framebuffer to play video"),
signal="toggled(bool)")
groupVideoOutput.addAction(fbdevAction)
dfbmgaAction = self.createAction("dfbmga", checkable=True,
slot=lambda a, b='dfbmga':self.videoOutput(a, b), tip=_(u"Matrox G400/:G450/:G550 specific video output driver that uses the DirectFB library"),
signal="toggled(bool)")
groupVideoOutput.addAction(dfbmgaAction)
s3fbAction = self.createAction("s3fb", checkable=True,
slot=lambda a, b='s3fb':self.videoOutput(a, b), tip=_(u"S3 Virge specific video output driver"),
signal="toggled(bool)")
groupVideoOutput.addAction(s3fbAction)
wiiAction = self.createAction("wii", checkable=True,
slot=lambda a, b='wii':self.videoOutput(a, b), tip=_(u"Nintendo Wii/GameCube specific video output driver"),
signal="toggled(bool)")
groupVideoOutput.addAction(wiiAction)
a3dfxAction = self.createAction("3dfx", checkable=True,
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"),
signal="toggled(bool)")
groupVideoOutput.addAction(a3dfxAction)
xvmcAction = self.createAction("xvm&c", checkable=True,
slot=lambda a, b='xvmc':self.videoOutput(a, b), tip=_(u"XVideo Motion Conpensation"),
signal="toggled(bool)")
groupVideoOutput.addAction(xvmcAction)
# Uniquement pour MacOSX
if os.name == 'mac':
# Sortie vidéo de mplayer
groupVideoOutput = QActionGroup(self)
defautvoAction = self.createAction(_(u"&défaut"), checkable=True,
slot=lambda a, b='':self.videoOutput(a, b),
tip=_(u"Sortie vidéo définie dans les fichiers de configuration de mplayer"),
signal="toggled(bool)")
groupVideoOutput.addAction(defautvoAction)
quartzAction = self.createAction("quartz", checkable=True,
slot=lambda a, b='quartz':self.videoOutput(a, b),
tip=_(u"Mac OS X Quartz video output driver"),
signal="toggled(bool)")
groupVideoOutput.addAction(quartzAction)
macosxAction = self.createAction("macosx", checkable=True,
slot=lambda a, b='macosx':self.videoOutput(a, b),
tip=_(u"Mac OS X CoreVideo video output driver"),
signal="toggled(bool)")
groupVideoOutput.addAction(macosxAction)
vesaAction = self.createAction("vesa", checkable=True,
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"),
signal="toggled(bool)")
groupVideoOutput.addAction(vesaAction)
svgaAction = self.createAction("svga", checkable=True,
slot=lambda a, b='svga':self.videoOutput(a, b), tip=_(u"Play video using the SVGA library"),
signal="toggled(bool)")
groupVideoOutput.addAction(svgaAction)
glAction = self.createAction("&gl", checkable=True,
slot=lambda a, b='gl':self.videoOutput(a, b), tip=_(u"OpenGL 1"),
signal="toggled(bool)")
groupVideoOutput.addAction(glAction)
gl2Action = self.createAction("gl&2", checkable=True,
slot=lambda a, b='gl2':self.videoOutput(a, b),
tip=_(u"OpenGl 2 - multiple textures version"), signal="toggled(bool)")
groupVideoOutput.addAction(gl2Action)
# Uniquement pour Windows
if os.name == 'nt':
# Sortie vidéo de mplayer
groupVideoOutput = QActionGroup(self)
defautvoAction = self.createAction(_(u"&défaut"), checkable=True,
slot=lambda a, b='':self.videoOutput(a, b),
tip=_(u"Sortie vidéo définie dans les fichiers de configuration de mplayer"),
signal="toggled(bool)")
groupVideoOutput.addAction(defautvoAction)
directxAction = self.createAction("&directx", checkable=True,
slot=lambda a, b='directx':self.videoOutput(a, b),
tip=_(u"DirectX"),
signal="toggled(bool)")
groupVideoOutput.addAction(directxAction)
glAction = self.createAction("&gl", checkable=True,
slot=lambda a, b='gl':self.videoOutput(a, b), tip=_(u"OpenGL 1"),
signal="toggled(bool)")
groupVideoOutput.addAction(glAction)
gl2Action = self.createAction("gl&2", checkable=True,
slot=lambda a, b='gl2':self.videoOutput(a, b),
tip=_(u"OpenGl 2 - multiple textures version"), signal="toggled(bool)")
groupVideoOutput.addAction(gl2Action)
winvidixAction = self.createAction("winvidix", checkable=True,
slot=lambda a, b='winvidix':self.videoOutput(a, b),
tip=_(u"Windows frontend for VIDIX"), signal="toggled(bool)")
groupVideoOutput.addAction(winvidixAction)
direct3dAction = self.createAction("direct3d", checkable=True,
slot=lambda a, b='direct3d':self.videoOutput(a, b),
tip=_(u"Video output driver that uses the Direct3D interface (useful for Vista)"), signal="toggled(bool)")
groupVideoOutput.addAction(direct3dAction)
dfbmgaAction = self.createAction("dfbmga", checkable=True,
slot=lambda a, b='dfbmga':self.videoOutput(a, b), tip=_(u"Matrox G400/:G450/:G550 specific video output driver that uses the DirectFB library"),
signal="toggled(bool)")
groupVideoOutput.addAction(dfbmgaAction)
vesaAction = self.createAction("vesa", checkable=True,
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"),
signal="toggled(bool)")
groupVideoOutput.addAction(vesaAction)
svgaAction = self.createAction("svga", checkable=True,
slot=lambda a, b='svga':self.videoOutput(a, b), tip=_(u"Play video using the SVGA library"),
signal="toggled(bool)")
groupVideoOutput.addAction(svgaAction)
settings = QSettings()
# Uniquement pour Linux et MacOSX
if os.name == 'posix':
vo = settings.value("vo", QVariant('')).toString()
if vo == '':
defautvoAction.setChecked(True)
elif vo == 'xmga':
xmgaAction.setChecked(True)
elif vo == 'xv':
xvAction.setChecked(True)
elif vo == 'x11':
x11Action.setChecked(True)
elif vo == 'gl':
glAction.setChecked(True)
elif vo == 'gl2':
gl2Action.setChecked(True)
elif vo == 'dxr3':
gl2Action.setChecked(True)
elif vo == 'xvidix':
gl2Action.setChecked(True)
elif vo == 'vidix':
vidixAction.setChecked(True)
elif vo == 'cvidix':
cvidixAction.setChecked(True)
elif vo == 'vesa':
vesaAction.setChecked(True)
elif vo == 'svga':
svgaAction.setChecked(True)
elif vo == 'fbdev':
fbdevAction.setChecked(True)
elif vo == 'dfbmga':
dfbmgaAction.setChecked(True)
elif vo == 's3fb':
s3fbAction.setChecked(True)
elif vo == 'wii':
wiiAction.setChecked(True)
elif vo == '3dfx':
a3dfxAction.setChecked(True)
elif vo == 'xvmc':
xvmcAction.setChecked(True)
# Uniquement pour MacOSX
if os.name == 'mac':
vo = settings.value("vo", QVariant('')).toString()
if vo == '':
defautvoAction.setChecked(True)
elif vo == 'quartz':
quartzAction.setChecked(True)
elif vo == 'macosx':
macosxAction.setChecked(True)
elif vo == 'vesa':
vesaAction.setChecked(True)
elif vo == 'svga':
svgaAction.setChecked(True)
elif vo == 'gl':
glAction.setChecked(True)
elif vo == 'gl2':
gl2Action.setChecked(True)
# Uniquement pour Windows
if os.name == 'nt':
vo = settings.value("vo", QVariant('')).toString()
if vo == '':
defautvoAction.setChecked(True)
elif vo == 'directx':
directxAction.setChecked(True)
elif vo == 'gl':
glAction.setChecked(True)
elif vo == 'gl2':
gl2Action.setChecked(True)
elif vo == 'winvidix':
winvidixAction.setChecked(True)
elif vo == 'direct3d':
direct3dAction.setChecked(True)
elif vo == 'dfbmga':
dfbmgaAction.setChecked(True)
elif vo == 'vesa':
vesaAction.setChecked(True)
elif vo == 'svga':
svgaAction.setChecked(True)
#=== Menus ===#
# Menu Fichier ==========================================
menuFichier=self.menuBar().addMenu(_(u'&Fichier'))
self.addActions(menuFichier, (chargerProjetAction, sauverProjetAction, None, quitterAction,))
# Menu Outils =================================
menuOutils=self.menuBar().addMenu(_(u'O&utils'))
self.addActions(menuOutils, (mplayerAction, tamponEKDAction,))
# Menu Configuration ==========================================
self.menuConfig=self.menuBar().addMenu(_(u'&Configuration'))
self.addActions(self.menuConfig, (self.ConfigAction, self.barreOutilsAction
))
### N'est plus nécessaire, géré dans la configuration Générale
#self.connect(self.menuConfig,SIGNAL("aboutToShow()"),self.fctMenuConfig)
# Uniquement pour Linux
if os.name == 'posix':
menuMplayer = self.menuConfig.addMenu(_(u"&Sortie vidéo de mplayer"))
self.addActions(menuMplayer, (defautvoAction, xmgaAction, xvAction, x11Action, glAction, gl2Action, dxr3Action, xvidixAction, vidixAction, cvidixAction, vesaAction, svgaAction, fbdevAction, dfbmgaAction, s3fbAction, s3fbAction, wiiAction, a3dfxAction, xvmcAction))
# Uniquement MacOSX
if os.name == 'mac':
menuMplayer = self.menuConfig.addMenu(_(u"&Sortie vidéo de mplayer"))
self.addActions(menuMplayer, (defautvoAction, quartzAction, macosxAction, vesaAction, svgaAction, glAction, gl2Action))
# Uniquement pour Windows
if os.name == 'nt':
menuMplayer = self.menuConfig.addMenu(_(u"&Sortie vidéo de mplayer"))
self.addActions(menuMplayer, (defautvoAction, directxAction, glAction, gl2Action, winvidixAction, direct3dAction, dfbmgaAction, vesaAction, svgaAction))
# Menu Documentation =================================
menu=self.menuBar().addMenu(_(u'&Documentation'))
self.addActions(menu, (docAction,))
# Menu Infos =========================================
menu=self.menuBar().addMenu(_(u'&Infos'))
self.addActions(menu, (aboutAction,))
#=== Barre d'outils ===#
self.toolBar = self.addToolBar(_(u"&Barre d'outils"))
self.toolBar.setObjectName("BarreOutils") # obligatoire pour le déplacement
self.toolBar.setIconSize(QSize(16,16))
self.toolBar.hide()
self.toolBar.addAction(quitterAction)
self.toolBar.addSeparator()
self.toolBar.addAction(tamponEKDAction)
self.toolBar.addSeparator()
self.toolBar.addAction(mplayerAction)
self.toolBar.addSeparator()
self.toolBar.addAction(aboutAction)
self.toolBar.addSeparator()
# Dictionnaire pour ne pas avoir à changer la fonction connectée à chaque
# modif du nom d'un item . Une valeur (et non pas une clé) de notre
# dictionnaire est unique. Elle est différente du texte de l'item pour
# éviter les pièges et pour pouvoir donner des noms identiques à certains
# items au besoin .
self.itemDict = {}
# ---------------------------------------------------------
# TamponEKD
# ---------------------------------------------------------
self.tamponEKD = EkdTamponIn(self)
# ---------------------------------------------------------
# Onglets
# ---------------------------------------------------------
self.tabWidget=QTabWidget()
largeurEcran = QDesktopWidget().screenGeometry().height()
# Sous Qt4.0 pas moyen de paramètrer la taille des icônes pour les en-têtes d'onglet.
# Elles sont beaucoup trop petite -> on préfère le texte seul (on préfère aussi le texte
# pour les petites écrans)
if largeurEcran < 800 or PYQT_VERSION_STR < "4.1.0": petitEcran = 1
else:
petitEcran = 0
self.tabWidget.setIconSize(QSize(36,36))
self.connect(self.tabWidget,SIGNAL('currentChanged(int)'),self.changeOnglet)
# Step GUI
self.progress.addText(_(u"Initialisation du menu de l'interface... OK"))
self.progress.upProgress()
# onglet Animation ============================
# DICO - clé: référence du split; valeur: paramètres de configuration
# Permet de faire le lien entre la stack de widget et l'arbre de menu
self.dicoSplit = {}
self.animSplitter = QSplitter(Qt.Horizontal)
self.dicoSplit[self.animSplitter] = "AnimSplitter"
# Liste de hbox
# Rq: les self de cette partie (sauf pour le dictionnaire) sont nécessaires
# à l'activation les liens hypertextes du cadre d'accueil "Montage Vidéo"
self.treeWidgetAnimation=QTreeWidget()
self.animSplitter.addWidget(self.treeWidgetAnimation)
self.treeWidgetAnimation.headerItem().setText(0, _(u"Vidéo"))
self.treeWidgetAnimation.setMinimumWidth(Gui_EKD.minMenuSize)
# Ajout de la liste et des widgets associés dans hbox
self.stacked_onglet_animation=QStackedWidget()
# widget principal de la page d'accueil contenant le logo ekd
widget_img_accueil = self.widgetOngletAccueil("Icones" + os.sep + "logo_ekd.png")
# Drapeau pour savoir éventuellement afficher l'image d'accueil propre à l'onglet
self.clicInitialAnim = 1
# Widget principal de la page d'accueil animation
imageAccueilAnim = self.widgetOngletAccueil("Icones" + os.sep + "icone_video_256.png")
# Page d'accueil de ekd
self.stacked_page_accueil=self.stacked_onglet_animation.addWidget(widget_img_accueil)
# Page d'accueil de animation
self.imageAccueilAnim=self.stacked_onglet_animation.addWidget(imageAccueilAnim)
# Animation >> Encodage
(self.itemTree_Encodage, self.stacked_animation_encodage)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
Animation_Encodage(self), _(u"Transcodage"),\
QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
# Animation >> Encodage >> Général
(self.itemTree_Encodage_General, self.stacked_animation_encodage_general)=self.createMenu(self.itemTree_Encodage, self.stacked_onglet_animation,\
Animation_Encodage_General(), _(u"Général"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> Encodage >> Pour le web
(self.itemTree_Encodage_Web, self.stacked_animation_encodage_web)=self.createMenu(self.itemTree_Encodage, self.stacked_onglet_animation,\
AnimationEncodageWeb(), _(u"Pour le web"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> Encodage >> Haute Définition
(self.itemTree_Encodage_HD, self.stacked_animation_encodage_hd)=self.createMenu(self.itemTree_Encodage, self.stacked_onglet_animation,\
AnimationEncodageHD(), _(u"Haute Définition"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> Encodage >> AVCHD
# Utilisation de la vérification de la version de ffmpeg
#if verif[8] : # Commenté car le menu Gestion AVCHD n'apparaît pas sous Ubuntu 12.04
(self.itemTree_Encodage_AVCHD, self.stacked_animation_encodage_avchd)=self.createMenu(self.itemTree_Encodage, self.stacked_onglet_animation,\
AnimationEncodageAVCHD(), _(u"Gestion AVCHD"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> filtres vidéos
self.af = Animation_FiltresVideos()
(trash, self.stacked_animation_filtesVideos)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
self.af, _(u"Filtres"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
self.connect(self.af,SIGNAL("ToFiltresImage"),self.toFiltresImage)
# Animation >> montage vidéo
(self.itemTree_MontagVideo, self.stacked_animation_MontagVideo)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
Animation_MontagVideo(self), _(u"Montage vidéo"),\
QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
# Animation >> montage vidéo >> video seulement
(self.itemTree_SVideo, self.stacked_animation_MontagVideoVidSeul)=self.createMenu(self.itemTree_MontagVideo, self.stacked_onglet_animation,\
Animation_MontagVideoVidSeul(self.statusBar()), _(u"Vidéo seulement"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> montage vidéo >> video + audio
(self.itemTree_SVideoAudio, self.stacked_animation_MontagVideoVidPlusAudio)=self.createMenu(self.itemTree_MontagVideo, self.stacked_onglet_animation,\
Animation_MontagVideoVidPlusAudio(self.statusBar(), self), _(u"Vidéo + audio"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> montage vidéo >> decouper une video
(self.itemTree_SDecouperVideo, self.stacked_animation_MontagVideoDecoupUneVideo)=self.createMenu(self.itemTree_MontagVideo, self.stacked_onglet_animation,\
Animation_MontagVideoDecoupUneVideo(self.statusBar()), _(u"Découpage d'une vidéo"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> separer video et audio
(trash, self.stacked_animation_SeparVideoEtAudio)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
Animation_SeparVideoEtAudio(), _(u"Séparation audio/vidéo"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> convertir des images en animation
(trash, self.stacked_animation_ConvertirImgEnAnim)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
Animation_ConvertirImgEnAnim(self.statusBar(), self.frameGeometry), _(u"Conversion d'images en vidéo"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> convertir une animation en images
(trash, self.stacked_animation_ConvertirUneAnimEnImg)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
Animation_ConvertirUneAnimEnImg(self.statusBar(), self.frameGeometry), _(u"Conversion d'une vidéo en images"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> reglages divers
(trash, self.stacked_animation_ReglagesDivers)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
Animation_ReglagesDivers(), _(u"Nombre d'images par seconde"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> conversion une vidéo en 16/9 ou 4/3
(trash, self.stacked_animation_ConvertirAnimEn_16_9_Ou_4_3)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
Animation_ConvertirAnimEn_16_9_Ou_4_3(self.statusBar()), _(u"Convertir une vidéo en 16/9 ou 4/3"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> Diaporama d'images en vidéo (Videoporama)
(trash, self.stacked_animation_Videoporama)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
Videoporama_Main(verif,self), _(u"Diaporama d'images en vidéo"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Animation >> Tags vidéo
(trash, self.stacked_animation_TagsVideo)=self.createMenu(self.treeWidgetAnimation, self.stacked_onglet_animation,\
Animation_TagsVideo(), _(u"Tags vidéo"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# connecteur de la liste
self.connect(self.treeWidgetAnimation,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_animation)
self.animSplitter.addWidget(self.stacked_onglet_animation)
# ajout du widget contenant la boite dans l'onglet Animation
i = self.tabWidget.addTab(self.animSplitter, '')
txt = _(u"Vidéo")
self.tabWidget.setTabToolTip(i, txt)
if not petitEcran:
self.tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_video_128.png"))
else: self.tabWidget.setTabText(i, txt)
# onglet Image ================================
# Step GUI
self.progress.addText(_(u"Initialisation de l'interface de animation.... OK"))
self.progress.upProgress()
self.imageSplitter = QSplitter(Qt.Horizontal)
self.dicoSplit[self.imageSplitter] = "ImageSplitter"
# liste de hbox
self.treeWidgetDiversImage=QTreeWidget()
self.imageSplitter.addWidget(self.treeWidgetDiversImage)
self.treeWidgetDiversImage.headerItem().setText(0,_(u"Image"))
self.treeWidgetDiversImage.setMinimumWidth(Gui_EKD.minMenuSize)
# widget principal de la page d'accueil
widget_img_accueil = self.widgetOngletAccueil("Icones" + os.sep + "icone_images_256.png")
# ajout de la liste et des widgets associés dans hbox
self.stacked_onglet_image=QStackedWidget(self)
# page d'accueil
self.stacked_onglet_image.addWidget(widget_img_accueil)
# Image >> Divers
(self.treeWidgetImagesDivers, self.stacked_image_divers)=self.createMenu(self.treeWidgetDiversImage, self.stacked_onglet_image,\
Image_Divers(self), _(u"Divers"),\
QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
# Image >> Divers >> Planche-contact
(self.itemTree_PlContact, self.stacked_image_divers_PlContact)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
Image_Divers_PlContact(self.statusBar(), self.frameGeometry), _(u"Planche-contact"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Image >> Divers >> Information
(self.itemTree_Information, self.stacked_image_divers_Information)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
Image_Divers_Info(self.frameGeometry), _(u"Information"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Image >> Divers >> Changer format
(self.itemTree_ChangFormat, self.stacked_image_divers_ChangFormat)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
Image_Divers_ChangFormat(self.statusBar(), self.frameGeometry), _(u"Changement de format"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Image >> Divers >> Redimensionner
(self.itemTree_Redimens, self.stacked_image_divers_Redimens)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
Image_Divers_Redimensionner(self.statusBar(), self.frameGeometry), _(u"Redimension"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Image >> Divers >> Texte sur images
if PYQT_VERSION_STR >= "4.1.0":
(self.itemTree_TxtSurImg, self.stacked_image_divers_TxtSurImg)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
Image_Divers_TxtSurImg(self.statusBar(), self.frameGeometry), _(u"Ajout d'éléments"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Image >> Divers >> Compositing
(self.itemTree_ImgComposit, self.stacked_image_divers_Compositing)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
Image_Divers_Compositing(self.statusBar(), self.frameGeometry), _(u"Image composite"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Image >> Divers >> Renommer images
(self.itemTree_RenomImg, self.stacked_image_divers_RenomImg)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
Image_Divers_RenomImg(self.frameGeometry), _(u"Renommage d'images"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Image >> Divers >> Pour le web
(self.itemTree_PourLeWeb, self.stacked_image_divers_PourLeWeb)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
Image_Divers_PourLeWeb(self.statusBar(), self.frameGeometry), _(u"Pour le web"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Image >> Divers >> Multiplication d'images
(self.itemTree_MultiplicImg, self.stacked_image_divers_MultiplicImg)=self.createMenu(self.treeWidgetImagesDivers, self.stacked_onglet_image,\
Image_Divers_MultiplicImg(self.statusBar(), self.frameGeometry), _(u"Multiplication d'images"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Image >> Transitions
(self.itemTree_Transition, self.stacked_image_transitions)=self.createMenu(self.treeWidgetDiversImage, self.stacked_onglet_image,\
Image_Transitions(self.statusBar(), self.frameGeometry), _(u"Transitions"),\
QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
# Image >> Masque alpha/3D
(self.itemTree_ImageMasqueAlpha3D, self.stacked_image_masque_alpha_3d)=self.createMenu(self.treeWidgetDiversImage, self.stacked_onglet_image,\
Image_MasqueAlpha3D(self.statusBar(), self.frameGeometry), _(u"Masque alpha/3D"),\
QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
# Image >> Filtres image
(self.itemTree_FiltresImage, self.stacked_image_filtres_image)=self.createMenu(self.treeWidgetDiversImage, self.stacked_onglet_image,\
Image_FiltresImage(self.statusBar(), self.frameGeometry), _(u"Filtres"),\
QIcon("Icones" + os.sep + "db_update.png"), self.itemDict)
# connecteur de la liste
self.connect(self.treeWidgetDiversImage,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_image)
self.imageSplitter.addWidget(self.stacked_onglet_image)
# ajout du widget contenant la boite dans l'onglet Image
i = self.tabWidget.addTab(self.imageSplitter, '')
txt = _(u"Image")
self.tabWidget.setTabToolTip(i, txt)
if not petitEcran:
self.tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_images_128.png"))
else: self.tabWidget.setTabText(i, txt)
# Step GUI
self.progress.addText(_(u"Initialisation de l'interface de image.... OK"))
self.progress.upProgress()
self.sonSplitter = QSplitter(Qt.Horizontal)
self.dicoSplit[self.sonSplitter] = "SonSplitter"
# liste de hbox
self.treeWidgetSon=QTreeWidget()
self.sonSplitter.addWidget(self.treeWidgetSon)
self.treeWidgetSon.headerItem().setText(0, _(u"Musique-Son"))
self.treeWidgetSon.setMinimumWidth(Gui_EKD.minMenuSize)
# ajout de la liste et des widgets associés dans hbox
self.stacked_onglet_musique_son=QStackedWidget()
# page d'accueil
# widget principal de la page d'accueil
widget_img_accueil = self.widgetOngletAccueil("Icones" + os.sep + "icone_sons_256.png")
self.stacked_onglet_musique_son.addWidget(widget_img_accueil)
# Musique-Son >> Encodage
(self.itemTree_MusiqueSonEcodage, self.stacked_musique_son_encodage)=self.createMenu(self.treeWidgetSon, self.stacked_onglet_musique_son,\
MusiqueSon_Encodage(self), _(u"Transcodage audio"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Musique-Son >> Join multiple file
(self.itemTree_MusiqueSonEcodage, self.stacked_musique_son_join_sound)=self.createMenu(self.treeWidgetSon, self.stacked_onglet_musique_son,\
MusiqueSon_Join(self), _(u"Joindre plusieurs fichiers audio"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Musique-Son >> Découpe fichier son
(self.itemTree_MusiqueSonEcodage, self.stacked_musique_son_decoupe)=self.createMenu(self.treeWidgetSon, self.stacked_onglet_musique_son,\
MusiqueSon_decoupe(self), _(u"Découpe dans un fichier audio"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
# Musique-Son >> Normalize fichier audio
(self.itemTree_MusiqueSonEcodage, self.stacked_musique_son_decoupe)=self.createMenu(self.treeWidgetSon, self.stacked_onglet_musique_son,\
MusiqueSon_normalize(self), _(u"Normaliser et convertir un fichier audio"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
self.connect(self.treeWidgetSon,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_musique_son)
self.sonSplitter.addWidget(self.stacked_onglet_musique_son)
# ajout du widget contenant la boite dans l'onglet Musique_Son
i = self.tabWidget.addTab(self.sonSplitter, '')
txt = _(u"Musique-Son")
self.tabWidget.setTabToolTip(i, txt)
if not petitEcran:
self.tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_sons_128.png"))
else: self.tabWidget.setTabText(i, txt)
# onglet Lecture ==============================
# Step GUI
self.progress.addText(_(u"Initialisation de l'interface pour le son.... OK"))
self.progress.upProgress()
self.lectureSplitter = QSplitter(Qt.Horizontal)
self.dicoSplit[self.lectureSplitter] = "LectureSplitter"
splitLect=QSplitter(Qt.Vertical)
# liste des entrées de menu de splitLect
self.treeWidgetLecture=QTreeWidget()
self.treeWidgetLecture.headerItem().setText(0, _(u"Lecture"))
## Ajouté le 3/07/2009 : On s'assure que la taille du treeWidget est suffisante
self.treeWidgetLecture.setMinimumWidth(Gui_EKD.minMenuSize)
splitLect.addWidget(self.treeWidgetLecture)
self.stackedVisio = QStackedWidget()
splitLect.addWidget(self.stackedVisio)
self.lectureSplitter.addWidget(splitLect)
# connecteur de la liste
self.connect(self.treeWidgetLecture,SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.liste_lecture)
# ajout de la liste et des widgets associés dans hbox
self.stacked_onglet_lecture=QStackedWidget()
# Page d'accueil
# Widget principal de la page d'accueil
widget_img_accueil = self.widgetOngletAccueil("Icones" + os.sep + "icone_visionner_256.png")
self.stacked_onglet_lecture.addWidget(widget_img_accueil)
# Lecture >> Visionner des images
self.lecture_VisionImage = Lecture_VisionImage(self.statusBar(), True, False)
(self.itemTree_LectureVisionImage, self.stacked_lecture_vision_image)=self.createMenu(self.treeWidgetLecture, self.stacked_onglet_lecture,\
self.lecture_VisionImage, _(u"Lecture d'images"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
self.indexStacked_visioImg = self.stackedVisio.addWidget(self.lecture_VisionImage.getFolder())
# Lecture >> Visionner des vidéos
self.lecture_VisionVideo = Lecture_VisionVideo(self.statusBar())
(self.itemTree_LectureVisionVideo, self.stacked_lecture_vision_video)=self.createMenu(self.treeWidgetLecture, self.stacked_onglet_lecture,\
self.lecture_VisionVideo, _(u"Lecture de vidéos"),\
QIcon("Icones" + os.sep + "database.png"), self.itemDict)
self.indexStacked_visioVideo = self.stackedVisio.addWidget(self.lecture_VisionVideo.getFolder())
self.lectureSplitter.addWidget(self.stacked_onglet_lecture)
# Ajout du widget contenant la boite dans l'onglet Lecture
i = self.tabWidget.addTab(self.lectureSplitter, '')
txt = _(u"Lecture")
self.tabWidget.setTabToolTip(i, txt)
if not petitEcran:
self.tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_visionner_128.png"))
else: self.tabWidget.setTabText(i, txt)
# onglet Mode Séquentiel ===========================
# En construction
if len(sys.argv)==2 and sys.argv[1]=="sequentiel":
# widget de base du dernier onglet
sequentiel = Sequentiel(self)
# ajout du widget contenant la boite dans l'onglet Séquentiel
i = self.tabWidget.addTab(sequentiel, '')
self.tabWidget.setTabToolTip(i, _(u"Conversions séquentielles"))
if not petitEcran:
self.tabWidget.setTabIcon(i, QIcon("Icones" + os.sep + "icone_sequenciel_128.png"))
else: self.tabWidget.setTabText(i, _(u"Sequentiel"))
# -----------------
# Barre des tâches
# -----------------
self.statusBar().showMessage(u'Prêt', 5000)
# Affichage des onglets au centre de la fenêtre
self.setCentralWidget(self.tabWidget)
# A pour effet d'assurer une taille minimale
# aux QTreeWidget lors de la 1ère ouverture de ekd
self.animSplitter.setStretchFactor(0, 4)
self.animSplitter.setStretchFactor(1, 4)
self.imageSplitter.setStretchFactor(0, 3)
self.imageSplitter.setStretchFactor(1, 4)
self.sonSplitter.setStretchFactor(0, 1)
self.sonSplitter.setStretchFactor(1, 3)
self.lectureSplitter.setStretchFactor(0, 1)
self.lectureSplitter.setStretchFactor(1, 1)
#--------------------------------------------------
# Paramètres généraux de la fenêtre (suite et fin)
#--------------------------------------------------
# Paramètres contenus dans ~/.config/ekd/ekd.conf sous linux
display_mode = EkdConfig.get("general", 'display_mode')
## display_mode peut-être : auto ou une résolution type WxH
if ( display_mode == "auto"):
size = settings.value("MainWindow/Size", QVariant(QSize(800, 484))).toSize()
else:
width, height = display_mode.split("x")
size = QSize(int(width), int(height))
settings.setValue("MainWindow/Size", QVariant(size))
self.resize(size)
position = settings.value("MainWindow/Position",QVariant(QPoint(0, 0))).toPoint()
self.move(position)
self.restoreState(settings.value("MainWindow/State").toByteArray())
splitList = [self.animSplitter, self.imageSplitter, self.sonSplitter,self.lectureSplitter ]
if int(EkdConfig.get("general", 'charger_split')):
for split, optionConfig in self.dicoSplit.items():
splitSetting = settings.value(optionConfig).toByteArray()
split.restoreState(splitSetting)
# Step GUI
self.progress.addText(_(u"Initialisation de l'interface générale.... OK"))
self.progress.upProgress()
self.show()
def info(self):
""" Chargement de la classe de la boîte de dialogue pour afficher
les infos de développement et la licence """
info = Info(self)
info.show()
def documentation(self):
""" Chargement de la classe de la boîte de dialogue pour afficher
l'aide en ligne (affichée dans le browser web par défaut du système) """
doc = Documentation(self)
doc.show()
def fctMenuConfig(self):
"L'état des cases à cocher du menu configuration sont générés lors du clic sur le menu"
self.barreOutilsAction.setChecked(self.toolBar.isVisible())
actif = int(EkdConfig.get("general", 'boite_de_dialogue_de_fermeture'))
#
self.dialogSauvAction.setChecked(actif)
actif = int(EkdConfig.get("general", 'charger_split'))
#
self.splitAction.setChecked(actif)
def barreOutils(self):
"Affichage/masquage de la barre d'outils"
self.toolBar.setVisible(not self.toolBar.isVisible())
def mplayerAction(self):
"Widget mplayer"
try:
repEntree = EkdConfig.get('general','video_input_path').decode("UTF8")
except IndexError, e: #ConfigParser.NoOptionError, e:
repEntree = None
mplayer = Mplayer([], (600, 600*3/4),
(Mplayer.REVENIR,Mplayer.PRECEDENT_SUIVANT,Mplayer.CURSEUR_A_PART,Mplayer.PARCOURIR),
cheminParcourir=repEntree, parent=self)
mplayer.show()
def tamponEKDAction(self) :
"Affiche le tamponEKD"
self.tamponEKD.show()
def changerComboQA(self):
""" Affichage de l'index du combo """
EkdPrint(u"{0}".format(self.comboConfigQA.currentIndex()))
def quoiAfficher(self):
""" L'utilisateur fait le choix de ce qui doit être visible
entre le menu, la barre des taches et les deux en même temps """
if self.comboConfigQA.currentIndex()==0:
# Uniquement la barre des taches sera visible
self.menuBar().hide()
self.toolBar.show()
elif self.comboConfigQA.currentIndex()==1:
# Uniquement le menu sera visible
self.menuBar().show()
self.toolBar.hide()
elif self.comboConfigQA.currentIndex()==2:
# Les deux seront affichés
self.menuBar().show()
self.toolBar.show()
# --------------------------------------------------------------------------
def dialogSauv(self):
"Faire apparaître/disparaître la boite de dialogue de sauvegarde en sortie"
if self.dialogSauvAction.isChecked():
EkdConfig.set("general", 'boite_de_dialogue_de_fermeture', '1')
else:
EkdConfig.set("general", 'boite_de_dialogue_de_fermeture', '0')
def splitPosition(self):
"Charger les paramètres de position relatives des menus/cadres (QSplitter)"
if self.splitAction.isChecked():
if QMessageBox.critical(self, _(u"Alerte"), _(u"