Пример #1
0
    def __init__(self, statusBar, boutParcourir=False, filer=False):
        QWidget.__init__(self)

        self.sortie = []
        # Boite d'alignement verticale
        vbox = QVBoxLayout(self)

        # On ne passe pas tout le parent, mais juste ce dont on a besoin (ici la bar de status)
        # Barre des tâches
        self.statusBar = statusBar

        # -------------------
        # Navigateur de répertoires
        # -------------------

        # arborescence des fichiers et dossiers permettant l'affichage
        self.listViewVisioImg = QListView()

        filtres_option = QDir.Dirs | QDir.Readable | QDir.Executable
        filtres = QStringList()
        filtres << "*"
        sorting = QDir.DirsFirst
        if int(EkdConfig.get("general", "ignore_case")):
            sorting |= QDir.IgnoreCase
        self.model = QDirModel(filtres, filtres_option, sorting)

        try:
            index = self.model.index(EkdConfig.get("general", "image_input_path"))
        except:
            index = self.model.index(QDir.homePath())
        self.listViewVisioImg.setModel(self.model)
        self.listViewVisioImg.setRootIndex(index)
        self.connect(self.listViewVisioImg, SIGNAL("doubleClicked(const QModelIndex &)"), self.naviguer)
        self.connect(self.listViewVisioImg, SIGNAL("clicked(QModelIndex)"), self.updateDir)
        # Ajout du navigateur à la VBox
        if filer:
            vbox.addWidget(self.listViewVisioImg)
            self.listViewVisioImg.setMaximumHeight(100)

            # -------------------
            # Boite de commandes
            # -------------------

            # Création du visionneur
        self.afficheurImg = VisionneurImagePourEKD()

        # -Boite horizontale des boutons de commandes
        hbox2 = QHBoxLayout()

        iconTaille = 32
        flat = 1

        # --Bouton début
        boutDebut = QPushButton()
        boutDebut.setIcon(QIcon("Icones" + os.sep + "player_start.png"))
        boutDebut.setIconSize(QSize(iconTaille, iconTaille))
        boutDebut.setToolTip(_(u"Première image"))
        boutDebut.setFlat(flat)
        hbox2.addWidget(boutDebut)
        self.connect(boutDebut, SIGNAL("clicked()"), self.debut)

        # --Bouton precedent
        boutPrecedent = QPushButton()
        boutPrecedent.setIcon(QIcon("Icones" + os.sep + "player_rew.png"))
        boutPrecedent.setIconSize(QSize(iconTaille, iconTaille))
        boutPrecedent.setToolTip(_(u"Image précédente"))
        boutPrecedent.setFlat(flat)
        hbox2.addWidget(boutPrecedent)
        self.connect(boutPrecedent, SIGNAL("clicked()"), self.precedent)

        # --Bouton de lecture
        boutLecture = QPushButton()
        boutLecture.setIcon(QIcon("Icones" + os.sep + "player_play.png"))
        boutLecture.setIconSize(QSize(iconTaille, iconTaille))
        boutLecture.setToolTip(_(u"Lancer le diaporama"))
        boutLecture.setFlat(flat)
        hbox2.addWidget(boutLecture)
        self.connect(boutLecture, SIGNAL("clicked()"), self.diaporama)

        # --Bouton pause
        boutArret = QPushButton()
        boutArret.setIcon(QIcon("Icones" + os.sep + "player_pause.png"))
        boutArret.setIconSize(QSize(iconTaille, iconTaille))
        boutArret.setToolTip(_(u"Mettre en pause le diaporama"))
        boutArret.setFlat(flat)
        hbox2.addWidget(boutArret)
        self.connect(boutArret, SIGNAL("clicked()"), self.pause)
        ############################################################

        # --Bouton suivant
        boutSuivant = QPushButton()
        boutSuivant.setIcon(QIcon("Icones" + os.sep + "player_fwd.png"))
        boutSuivant.setIconSize(QSize(iconTaille, iconTaille))
        boutSuivant.setToolTip(_(u"Image suivante"))
        boutSuivant.setFlat(flat)
        hbox2.addWidget(boutSuivant)
        self.connect(boutSuivant, SIGNAL("clicked()"), self.suivant)

        # --Bouton fin
        boutFin = QPushButton()
        boutFin.setIcon(QIcon("Icones" + os.sep + "player_end.png"))
        boutFin.setIconSize(QSize(iconTaille, iconTaille))
        boutFin.setToolTip(_(u"Dernière image"))
        boutFin.setFlat(flat)
        hbox2.addWidget(boutFin)
        self.connect(boutFin, SIGNAL("clicked()"), self.fin)

        hbox2.addStretch()

        # --Bouton taille fenetre
        boutTailleFenetre = QPushButton()
        boutTailleFenetre.setIcon(QIcon("Icones" + os.sep + "fenetre.png"))
        boutTailleFenetre.setIconSize(QSize(iconTaille, iconTaille))
        boutTailleFenetre.setToolTip(_(u"Ajuster à la fenêtre"))
        boutTailleFenetre.setFlat(flat)
        hbox2.addWidget(boutTailleFenetre)
        self.connect(boutTailleFenetre, SIGNAL("clicked()"), self.afficheurImg.setTailleFenetre)

        # --Bouton taille reel
        boutTailleReelle = QPushButton()
        boutTailleReelle.setIcon(QIcon("Icones" + os.sep + "taillereelle.png"))
        boutTailleReelle.setIconSize(QSize(iconTaille, iconTaille))
        boutTailleReelle.setToolTip(_(u"Taille réelle"))
        boutTailleReelle.setFlat(flat)
        hbox2.addWidget(boutTailleReelle)
        self.connect(boutTailleReelle, SIGNAL("clicked()"), self.afficheurImg.setTailleReelle)

        # --Bouton zoom avant
        boutZoomAvant = QPushButton()
        boutZoomAvant.setIcon(QIcon("Icones" + os.sep + "zoomplus.png"))
        boutZoomAvant.setIconSize(QSize(iconTaille, iconTaille))
        boutZoomAvant.setToolTip(_(u"Zoom avant"))
        boutZoomAvant.setFlat(flat)
        hbox2.addWidget(boutZoomAvant)
        self.connect(boutZoomAvant, SIGNAL("clicked()"), self.afficheurImg.zoomAvant)

        # --Bouton zoom arrière
        boutZoomArriere = QPushButton()
        boutZoomArriere.setIcon(QIcon("Icones" + os.sep + "zoommoins.png"))
        boutZoomArriere.setIconSize(QSize(iconTaille, iconTaille))
        boutZoomArriere.setToolTip(_(u"Zoom arrière"))
        boutZoomArriere.setFlat(flat)
        hbox2.addWidget(boutZoomArriere)
        self.connect(boutZoomArriere, SIGNAL("clicked()"), self.afficheurImg.zoomArriere)

        # --Bouton zoom arrière
        prop = "interval_speed"
        allprops = EkdConfig.getAllProperties(EkdConfig.getConfigSection("general"))
        self.boutTimer = EkdTimePropertie(prop, EkdConfig.PROPERTIES[prop], allprops[prop], section="general")
        self.boutTimer.widget.setToolTip(_(u"Vitesse de défilement"))
        hbox2.addWidget(self.boutTimer.widget)

        if boutParcourir:
            # --Bouton Configuration du diaporama
            # La variable suivante fait le lien entre le chemin sélectionné de l'arbre
            # et celui qui sera ouvert avec la boite de dialogue du bouton parcourir
            self.cheminImage = None
            boutSelectFich = QPushButton("...")
            boutSelectFich.setToolTip(_(u"Parcourir"))
            hbox2.addWidget(boutSelectFich)
            self.connect(boutSelectFich, SIGNAL("clicked()"), self.ouvrirImages)

            # Apercus
        self.listeApercus = QListWidget()
        self.listeApercus.setGridSize(QSize(85, 64))
        self.listeApercus.setIconSize(QSize(64, 64))
        self.listeApercus.setFlow(QListView.LeftToRight)

        if PYQT_VERSION_STR >= "4.1.0":
            self.listeApercus.setHorizontalScrollMode(QAbstractItemView.ScrollPerItem)
        self.connect(self.listeApercus, SIGNAL("currentRowChanged(int)"), self.changerImage)

        # Ajout du viewer à la VBox
        vbox.addWidget(self.afficheurImg)

        # Ajout de l'apercu à la VBox
        vbox.addWidget(self.listeApercus)

        # Fonction de test et de lecture de l'image gif
        self.isGif = self.afficheurImg.isGif
        self.startPauseGif = self.afficheurImg.startPauseGif

        # Création du QTimer
        self.timer = QTimer()
        self.updateTimer()
        self.connect(self.timer, SIGNAL("timeout()"), self.diapo)

        # Ajout des commandes
        self.listeApercus.setMaximumSize(QSize(2000, 100))
        vbox.addLayout(hbox2)
Пример #2
0
class Lecture_VisionImage(QWidget):
    # -----------------------------------
    # Cadre accueillant les widgets de :
    # Lecture >> Visionner des images
    # -----------------------------------

    # On ne passe pas tout le parent, mais juste ce dont on a besoin (ici la bar de status)
    def __init__(self, statusBar, boutParcourir=False, filer=False):
        QWidget.__init__(self)

        self.sortie = []
        # Boite d'alignement verticale
        vbox = QVBoxLayout(self)

        # On ne passe pas tout le parent, mais juste ce dont on a besoin (ici la bar de status)
        # Barre des tâches
        self.statusBar = statusBar

        # -------------------
        # Navigateur de répertoires
        # -------------------

        # arborescence des fichiers et dossiers permettant l'affichage
        self.listViewVisioImg = QListView()

        filtres_option = QDir.Dirs | QDir.Readable | QDir.Executable
        filtres = QStringList()
        filtres << "*"
        sorting = QDir.DirsFirst
        if int(EkdConfig.get("general", "ignore_case")):
            sorting |= QDir.IgnoreCase
        self.model = QDirModel(filtres, filtres_option, sorting)

        try:
            index = self.model.index(EkdConfig.get("general", "image_input_path"))
        except:
            index = self.model.index(QDir.homePath())
        self.listViewVisioImg.setModel(self.model)
        self.listViewVisioImg.setRootIndex(index)
        self.connect(self.listViewVisioImg, SIGNAL("doubleClicked(const QModelIndex &)"), self.naviguer)
        self.connect(self.listViewVisioImg, SIGNAL("clicked(QModelIndex)"), self.updateDir)
        # Ajout du navigateur à la VBox
        if filer:
            vbox.addWidget(self.listViewVisioImg)
            self.listViewVisioImg.setMaximumHeight(100)

            # -------------------
            # Boite de commandes
            # -------------------

            # Création du visionneur
        self.afficheurImg = VisionneurImagePourEKD()

        # -Boite horizontale des boutons de commandes
        hbox2 = QHBoxLayout()

        iconTaille = 32
        flat = 1

        # --Bouton début
        boutDebut = QPushButton()
        boutDebut.setIcon(QIcon("Icones" + os.sep + "player_start.png"))
        boutDebut.setIconSize(QSize(iconTaille, iconTaille))
        boutDebut.setToolTip(_(u"Première image"))
        boutDebut.setFlat(flat)
        hbox2.addWidget(boutDebut)
        self.connect(boutDebut, SIGNAL("clicked()"), self.debut)

        # --Bouton precedent
        boutPrecedent = QPushButton()
        boutPrecedent.setIcon(QIcon("Icones" + os.sep + "player_rew.png"))
        boutPrecedent.setIconSize(QSize(iconTaille, iconTaille))
        boutPrecedent.setToolTip(_(u"Image précédente"))
        boutPrecedent.setFlat(flat)
        hbox2.addWidget(boutPrecedent)
        self.connect(boutPrecedent, SIGNAL("clicked()"), self.precedent)

        # --Bouton de lecture
        boutLecture = QPushButton()
        boutLecture.setIcon(QIcon("Icones" + os.sep + "player_play.png"))
        boutLecture.setIconSize(QSize(iconTaille, iconTaille))
        boutLecture.setToolTip(_(u"Lancer le diaporama"))
        boutLecture.setFlat(flat)
        hbox2.addWidget(boutLecture)
        self.connect(boutLecture, SIGNAL("clicked()"), self.diaporama)

        # --Bouton pause
        boutArret = QPushButton()
        boutArret.setIcon(QIcon("Icones" + os.sep + "player_pause.png"))
        boutArret.setIconSize(QSize(iconTaille, iconTaille))
        boutArret.setToolTip(_(u"Mettre en pause le diaporama"))
        boutArret.setFlat(flat)
        hbox2.addWidget(boutArret)
        self.connect(boutArret, SIGNAL("clicked()"), self.pause)
        ############################################################

        # --Bouton suivant
        boutSuivant = QPushButton()
        boutSuivant.setIcon(QIcon("Icones" + os.sep + "player_fwd.png"))
        boutSuivant.setIconSize(QSize(iconTaille, iconTaille))
        boutSuivant.setToolTip(_(u"Image suivante"))
        boutSuivant.setFlat(flat)
        hbox2.addWidget(boutSuivant)
        self.connect(boutSuivant, SIGNAL("clicked()"), self.suivant)

        # --Bouton fin
        boutFin = QPushButton()
        boutFin.setIcon(QIcon("Icones" + os.sep + "player_end.png"))
        boutFin.setIconSize(QSize(iconTaille, iconTaille))
        boutFin.setToolTip(_(u"Dernière image"))
        boutFin.setFlat(flat)
        hbox2.addWidget(boutFin)
        self.connect(boutFin, SIGNAL("clicked()"), self.fin)

        hbox2.addStretch()

        # --Bouton taille fenetre
        boutTailleFenetre = QPushButton()
        boutTailleFenetre.setIcon(QIcon("Icones" + os.sep + "fenetre.png"))
        boutTailleFenetre.setIconSize(QSize(iconTaille, iconTaille))
        boutTailleFenetre.setToolTip(_(u"Ajuster à la fenêtre"))
        boutTailleFenetre.setFlat(flat)
        hbox2.addWidget(boutTailleFenetre)
        self.connect(boutTailleFenetre, SIGNAL("clicked()"), self.afficheurImg.setTailleFenetre)

        # --Bouton taille reel
        boutTailleReelle = QPushButton()
        boutTailleReelle.setIcon(QIcon("Icones" + os.sep + "taillereelle.png"))
        boutTailleReelle.setIconSize(QSize(iconTaille, iconTaille))
        boutTailleReelle.setToolTip(_(u"Taille réelle"))
        boutTailleReelle.setFlat(flat)
        hbox2.addWidget(boutTailleReelle)
        self.connect(boutTailleReelle, SIGNAL("clicked()"), self.afficheurImg.setTailleReelle)

        # --Bouton zoom avant
        boutZoomAvant = QPushButton()
        boutZoomAvant.setIcon(QIcon("Icones" + os.sep + "zoomplus.png"))
        boutZoomAvant.setIconSize(QSize(iconTaille, iconTaille))
        boutZoomAvant.setToolTip(_(u"Zoom avant"))
        boutZoomAvant.setFlat(flat)
        hbox2.addWidget(boutZoomAvant)
        self.connect(boutZoomAvant, SIGNAL("clicked()"), self.afficheurImg.zoomAvant)

        # --Bouton zoom arrière
        boutZoomArriere = QPushButton()
        boutZoomArriere.setIcon(QIcon("Icones" + os.sep + "zoommoins.png"))
        boutZoomArriere.setIconSize(QSize(iconTaille, iconTaille))
        boutZoomArriere.setToolTip(_(u"Zoom arrière"))
        boutZoomArriere.setFlat(flat)
        hbox2.addWidget(boutZoomArriere)
        self.connect(boutZoomArriere, SIGNAL("clicked()"), self.afficheurImg.zoomArriere)

        # --Bouton zoom arrière
        prop = "interval_speed"
        allprops = EkdConfig.getAllProperties(EkdConfig.getConfigSection("general"))
        self.boutTimer = EkdTimePropertie(prop, EkdConfig.PROPERTIES[prop], allprops[prop], section="general")
        self.boutTimer.widget.setToolTip(_(u"Vitesse de défilement"))
        hbox2.addWidget(self.boutTimer.widget)

        if boutParcourir:
            # --Bouton Configuration du diaporama
            # La variable suivante fait le lien entre le chemin sélectionné de l'arbre
            # et celui qui sera ouvert avec la boite de dialogue du bouton parcourir
            self.cheminImage = None
            boutSelectFich = QPushButton("...")
            boutSelectFich.setToolTip(_(u"Parcourir"))
            hbox2.addWidget(boutSelectFich)
            self.connect(boutSelectFich, SIGNAL("clicked()"), self.ouvrirImages)

            # Apercus
        self.listeApercus = QListWidget()
        self.listeApercus.setGridSize(QSize(85, 64))
        self.listeApercus.setIconSize(QSize(64, 64))
        self.listeApercus.setFlow(QListView.LeftToRight)

        if PYQT_VERSION_STR >= "4.1.0":
            self.listeApercus.setHorizontalScrollMode(QAbstractItemView.ScrollPerItem)
        self.connect(self.listeApercus, SIGNAL("currentRowChanged(int)"), self.changerImage)

        # Ajout du viewer à la VBox
        vbox.addWidget(self.afficheurImg)

        # Ajout de l'apercu à la VBox
        vbox.addWidget(self.listeApercus)

        # Fonction de test et de lecture de l'image gif
        self.isGif = self.afficheurImg.isGif
        self.startPauseGif = self.afficheurImg.startPauseGif

        # Création du QTimer
        self.timer = QTimer()
        self.updateTimer()
        self.connect(self.timer, SIGNAL("timeout()"), self.diapo)

        # Ajout des commandes
        self.listeApercus.setMaximumSize(QSize(2000, 100))
        vbox.addLayout(hbox2)

    def updateTimer(self):
        interval = float(EkdConfig.get("general", "interval_speed")) * 1000
        if interval > 100:
            self.timer.setInterval(interval)
        else:
            self.timer.setInterval(100)

    def ouvrirImages(self):
        "Récupération du chemin des images sélectionnées"

        # Ouvrir images
        formats = ["*.%s" % unicode(format).lower() for format in QImageReader.supportedImageFormats()]
        if not self.cheminImage:
            self.cheminImage = os.path.expanduser("~")
        chemins = QFileDialog.getOpenFileNames(
            None,
            _(u"Ouvrir images"),
            self.cheminImage,
            (
                "(%s);;JPEG (*.jpg *.JPG *.jpeg *.JPEG);;PNG (*.png *.PNG);;GIF (*.gif *.GIF);;BMP (*.bmp *.BMP);;SGI (*.sgi *.SGI);;TIF (*.tif *.TIF);;TARGA (*.tga *.TGA);;PNM (*.pnm *.PNM);;PPM (*.ppm *.PPM)"
                % " ".join(formats)
            ),
        )

        # Si pas de fichier sélectionné -> sortir de la fonction
        if not chemins:
            return

        self.cheminImage = QFileInfo(chemins[0]).absolutePath()
        liste = [unicode(QFileInfo(chem).fileName()) for chem in chemins]

        # Pour l'affichage il n'y a que la 1ère image qui est sélectionnée,
        # les autres sont présentes en aperçu
        self.updateImages(liste)

    def diaporama(self):
        "Fonction de diaporama"
        # On récupère d'abord la valeur du timer
        self.updateTimer()
        # On active le timer
        self.timer.start()

    def diapo(self):
        "Routine du Timer du diaporama"
        # Si on est à la dernière image
        if self.listeApercus.currentRow() == len(self.sortie) - 1:
            self.timer.stop()
        else:
            self.suivant()

    def pause(self):
        "Fonction pour mettre en pause le diaporama"
        # On récupère d'abord la valeur du timer
        self.updateTimer()
        # On active le timer
        self.timer.stop()

    def debut(self):
        "Fonction pour selectionner la première image"
        self.listeApercus.setCurrentRow(0)

    def fin(self):
        "Fonction pour selectionner la dernière image"
        self.listeApercus.setCurrentRow(len(self.sortie) - 1)

    def suivant(self):
        "Fonction pour sélectionner l'image suivante"

        # Si ce n'est pas la dernière image
        if self.listeApercus.currentRow() != len(self.sortie) - 1:
            self.listeApercus.setCurrentRow(self.listeApercus.currentRow() + 1)

    def precedent(self):
        "Fonction pour sélectionner l'image precedente"

        # Si ce n'est pas la première image
        if self.listeApercus.currentRow() != 0:
            self.listeApercus.setCurrentRow(self.listeApercus.currentRow() - 1)

    def changerImage(self, item):
        "Fonction pour charger l'image selectionnée dans le listview"

        # Si il y a une image selectionnée
        if item != -1:
            self.afficheurImg.setImage(self.sortie[item])

    def updateDir(self, item):
        "Fonction appelée par le treeview lors d'un changement de repertoire"

        # On récupère le QModel parent du QModelItem
        modele = item.model()

        # On crée le QDir
        rep = QDir(modele.filePath(item))
        rep.setFilter(QDir.Files)
        self.cheminImage = rep.absolutePath()
        self.statusBar.showMessage(self.cheminImage)

        # Récuperation des fichiers du dossier
        liste = rep.entryList()
        self.updateImages(liste)

    def updateImages(self, liste, cheminImage=None):
        "Cette fonction a été coupée en 2 pour bien implémenter la boite de dialogue associée au bouton parcourir"

        # Filtre des extensions (pas sensible à la casse)
        dicoExtension = ["png", "jpg", "jpeg", "bmp", "gif", "sgi", "tga", "tif", "tiff", "pnm", "ppm"]
        self.sortie = []

        # On vide le ListWidget
        self.listeApercus.clear()

        # Sélection des fichiers
        for entree in liste:
            # Création du QFileInfo
            if not cheminImage:
                fichier = QFileInfo(self.cheminImage + os.sep + entree)
            else:
                fichier = QFileInfo(cheminImage + os.sep + entree)

                # Recuperation de l'extension
            extension = fichier.suffix()

            # Application du filtre
            for validExtension in dicoExtension:
                # Si l'extension est valide
                if extension.toLower() == validExtension:
                    # On ajoute à la liste
                    self.sortie.append(fichier.absoluteFilePath())
                    ### Gain de performance en utilisant des miniature prégénérées
                    # On ajoute au LisView
                    minipix = EkdPreview(fichier.absoluteFilePath()).get_preview()
                    item = QListWidgetItem(QIcon(minipix), QString(""))
                    ##
                    item.setToolTip(fichier.fileName())
                    self.listeApercus.addItem(item)

                    # Affichage de la première image
        if len(self.sortie) != 0:
            self.debut()
            # Si pas d'image
        else:
            self.afficheurImg.setImage()

    def naviguer(self, item):
        """
		fonction permettant de naviguer dans la listes des répertoires
		"""

        modele = item.model()
        path = QDir(modele.filePath(item)).absolutePath()
        if os.listdir(path):
            # print unicode(path)
            EkdPrint(unicode(path))
            self.listViewVisioImg.setRootIndex(item)
            self.statusBar.showMessage(path)
        else:
            # print "Cannot access " , path
            EkdPrint(u"Cannot access %s" % str(path))

    def getFolder(self):
        """
		fonction permettant de récupérer le widget contenant les répertoires
		Permet de déplcer la liste des répertoires dans l'interface
		"""
        return self.listViewVisioImg