chooseInSticks.py
Aller à la documentation de ce fichier.
# $Id: chooseInSticks.py 47 2011-06-13 10:20:14Z georgesk $
licenceEn="""
file chooseInSticks.py
this file is part of the project scolasync
Copyright (C) 2010 Georges Khaznadar <georgesk@ofset.org>
This program 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 version3 of the License, or
(at your option) any later version.
This program 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/>.
"""
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import os.path
import Ui_chooseInSticks
class chooseDialog(QDialog):
def __init__(self,parent = None, title1="", title2="", okPrompt="OK"):
QDialog.__init__(self,parent)
self.mainWindow=parent
self._ui=Ui_chooseInSticks.Ui_Dialog()
self._ui.setupUi(self)
self.setWindowTitle(title1)
self._ui.groupBox.setTitle(title2)
okButton=self._ui.buttonBox.button(QDialogButtonBox.Ok)
self._ui.buttonBox.removeButton(okButton)
self.okButton=QPushButton(okPrompt)
self._ui.buttonBox.addButton(self.okButton,
QDialogButtonBox.AcceptRole)
self._fileListModel=QStandardItemModel()
self._fileListProxyModel = QSortFilterProxyModel()
self._fileListProxyModel.setSourceModel(self._fileListModel)
self._ui.listView.setModel(self._fileListProxyModel)
self._fileListProxyModel.setDynamicSortFilter(True)
self._storListModel=QStandardItemModel()
self._storListProxyModel = QSortFilterProxyModel()
self._storListProxyModel.setSourceModel(self._storListModel)
self._ui.listChoixCle.setModel(self._storListProxyModel)
self._storListProxyModel.setDynamicSortFilter(True)
self.ownedUsbDictionary={}
self.listStorages()
self._ui.minusButton.setEnabled(False)
self._ui.travailEdit.setText(self.mainWindow.workdir)
self._ui.plusButton.clicked.connect(self.plus)
self._ui.chooseButton.clicked.connect(self.choose)
self._ui.chooseButton_dir.clicked.connect(self.choose_dir)
self.okButton.clicked.connect(self.checkValues)
self._ui.minusButton.clicked.connect(self.minus)
self._ui.listView.clicked.connect(self.activate)
self._ui.travailEdit.editingFinished.connect(self.changeWd)
self.ok=False
# fonction de rappel liée au bouton de validation, vérifie s'il y a bien
# au moins un fichier ou un répertoire sélectionné
#
def checkValues(self):
self.ok=self._ui.listView.model().rowCount()>0
# Met en place la liste des noms de baladeurs connectés en tenant compte
# du nom de répertoire de travail et d'un baladeur éventuellement
# sélectionné dans la fenêtre principale
#
def listStorages(self):
sel=self.mainWindow.ui.tableView.selectedIndexes()
for d in qApp.available:
o=d.ownerByDb()
mountPath=d.ensureMounted()
item=QStandardItem(o)
# on cherche à voir si la clé est déjà sélectionnée
for modelIndex in sel:
if o == "%s" %modelIndex.data(Qt.DisplayRole):
break
self._storListModel.appendRow(item)
self.ownedUsbDictionary[o]=mountPath
self._storListProxyModel.sort(0)
self.checkWorkDirs()
# met à jour la possibilité de sélectionner les baladeurs dans la liste
# selon qu'ils ont ou pas un répertoire de travail, puis sélectionne
# si possible un baladeur, si aucun ne l'était avant.
#
def checkWorkDirs(self):
firstSelectable=None
okSelected=None
# on récupère la sélection courante à travers le proxy
selection=self._ui.listChoixCle.selectionModel().selection()
selection = self._storListProxyModel.mapSelectionToSource(selection)
selectedRows=map(lambda x: x.row(), self._ui.listChoixCle.selectedIndexes())
itemList=self._storListModel.findItems ("*",Qt.MatchWildcard)
itemList.sort(key=lambda i: i.data(Qt.DisplayRole))
# parcours des items de la liste par ordre alphabétique
# pour élire celui qui sera sélectionné initialement
for item in itemList:
index=self._storListModel.indexFromItem(item)
o="%s" %item.data(Qt.DisplayRole)
testDir=os.path.join(self.ownedUsbDictionary[o],self.mainWindow.workdir)
if os.path.isdir(testDir):
# si l'item concerne un disque qui contient le répertoire de
# travail, on le rend sélectionnable
item.setSelectable(True)
item.setEnabled(True)
# et si c'est le tout premier, on s'en souvient.
if firstSelectable == None:
firstSelectable=index
# on vérifie s'il était déjà dans la sélection
if index.row() in selectedRows:
okSelected=index
else:
item.setSelectable(False)
item.setEnabled(False)
if okSelected == None and firstSelectable != None:
selection=QItemSelection(firstSelectable,firstSelectable)
selection=self._storListProxyModel.mapSelectionFromSource(selection)
self._ui.listChoixCle.selectionModel().select(selection, QItemSelectionModel.Select);
# @return le répertoire à partir duquel on peut commencer à faire
# un choix de fichier ou de sous-répertoire. Il dépend du baladeur
# sélectionné s'il y en a un et du nom du répertoire de travail.
# Si on n'arrive pas à déterminer ce répertoire, renvoie None
#
def baseDir(self):
mp=self.selectedDiskMountPoint()
if mp:
return os.path.join(mp,self.mainWindow.workdir)
else:
return None
def selectedDiskMountPoint(self):
o=self.selectedDiskOwner()
if o==None:
return None
else:
return self.ownedUsbDictionary[o]
# @return le nom du propriétaire du disque sélectionné s'il y en a un,
# sinon None.
#
def selectedDiskOwner(self):
selection=self._ui.listChoixCle.selectionModel().selection()
if len(selection)==0:
return None
selection = self._storListProxyModel.mapSelectionToSource(selection)
return "%s" %selection.indexes()[0].data(Qt.DisplayRole)
def changeWd(self):
newDir=self._ui.travailEdit.text()
self.mainWindow.changeWd(newDir)
self.checkWorkDirs()
# Facilite le choix de motifs de fichiers en recherchant dans
# les clés USB, modifie l'éditeur de ligne de texte et place le
# fichier choisi dans la liste
# @param kind type d'élément à choisir : "file" pour un fichier,
# "dir" pour un répertoire
#
def choose(self, kind="file"):
if kind == "file":
func=QFileDialog.getOpenFileNames
msg=QApplication.translate("Dialog",
"Choissez un fichier (ou plus)")
else:
func=QFileDialog.getExistingDirectory
msg=QApplication.translate("Dialog",
"Choissez un répertoire")
cd=self.baseDir()
if cd!=None:
f = func (None, msg, cd)
if f and len(f)>0:
if isinstance(f, str):
theList=[f]
else:
theList=f
for f in theList:
path=f.replace(self.selectedDiskMountPoint()+"/", "")
self._ui.lineEdit.setText(path)
self.plus()
else:
titre=QApplication.translate("Dialog",
"Aucune clé modèle sélectionnée")
msg=QApplication.translate("Dialog",
"Veuillez choisir une clé modèle<br>parmi les clés connectées en cliquant<br>sur une ligne du tableau, pour<br>bénéficier de l'aide au choix de fichiers.<br><br>Cette clé doit contenir au moins<br>un répertoire « {workdir} ».".format(workdir=self.mainWindow.workdir))
msgBox=QMessageBox.warning(None, titre, msg)
# Facilite le choix de motifs de répertoires en recherchant dans
# les clés USB, modifie l'éditeur de ligne de texte et place le
# répertoire choisi dans la liste
#
def choose_dir(self):
self.choose(kind="dir")
def activate(self, item):
self._ui.minusButton.setEnabled(True)
# Permet de choisir et d'ajouter un nouveau fichier ou répertoire à
# supprimer
#
def plus(self):
text=self._ui.lineEdit.text()
if len(text)>0 :
self.append(text)
# Permet de retirer de la liste des fichiers à supprimer ceux qu'on
# a sélectionnés
#
def minus(self):
sel=self._ui.listView.selectedIndexes()
sel1=map(self._fileListProxyModel.mapToSource,sel)
rows=map(lambda x: x.row(), sel1)
rows.sort("descending")
for r in rows:
self._fileListModel.removeRow(r)
sel=self._ui.listView.selectedIndexes()
if len(sel)==0:
self._ui.minusButton.setEnabled(False)
def append(self, path):
f=self._fileListModel.findItems(path)
if len(f)==0:
item=QStandardItem(path)
self._fileListModel.appendRow(item)
self._fileListProxyModel.sort(0)
else:
print ("%s est déjà sélectionné" %path)
# renvoie la liste des chemins sélectionnés; dans le cas de chemins
# sans jokers (caractères * ou ?), les chemins sont protégés par des
# guillemets, afin qu'ils soient adaptés à un shell POSIX.
# @return une liste de chemins, sous forme de QStrings
#
def pathList(self):
itemList=self._fileListModel.findItems("*",Qt.MatchWildcard)
result=[x.text() for x in itemList]
otherText=self._ui.lineEdit.text()
if len(otherText) > 0 and otherText not in result :
result.append(otherText)
return result
src.chooseInSticks.chooseDialog.plus
def plus(self)
Definition: chooseInSticks.py:245
src.chooseInSticks.chooseDialog.selectedDiskOwner
def selectedDiskOwner(self)
Definition: chooseInSticks.py:176
src.chooseInSticks.chooseDialog.ownedUsbDictionary
ownedUsbDictionary
peuplement de la zone des noms de baladeurs
Definition: chooseInSticks.py:69
src.chooseInSticks.chooseDialog.selectedDiskMountPoint
def selectedDiskMountPoint(self)
Definition: chooseInSticks.py:165
src.chooseInSticks.chooseDialog._fileListProxyModel
_fileListProxyModel
Definition: chooseInSticks.py:58
QDialog
src.chooseInSticks.chooseDialog.choose
def choose(self, kind="file")
Definition: chooseInSticks.py:198
src.chooseInSticks.chooseDialog
Un dialogue pour choisir un ensemble de fichiers à copier depuis une clé USB.
Definition: chooseInSticks.py:33
src.chooseInSticks.chooseDialog.checkValues
def checkValues(self)
Definition: chooseInSticks.py:87
src.chooseInSticks.chooseDialog._storListModel
_storListModel
création de la structure de liste pour les noms de baladeurs
Definition: chooseInSticks.py:63
src.chooseInSticks.chooseDialog._ui
_ui
Definition: chooseInSticks.py:45
src.chooseInSticks.chooseDialog.listStorages
def listStorages(self)
Definition: chooseInSticks.py:95
src.chooseInSticks.chooseDialog.choose_dir
def choose_dir(self)
Definition: chooseInSticks.py:231
src.chooseInSticks.chooseDialog.changeWd
def changeWd(self)
changement du répertoire de travail
Definition: chooseInSticks.py:186
src.chooseInSticks.chooseDialog.ok
ok
Definition: chooseInSticks.py:80
src.chooseInSticks.chooseDialog.pathList
def pathList(self)
Definition: chooseInSticks.py:284
src.chooseInSticks.chooseDialog._fileListModel
_fileListModel
création de la structure de liste pour les fichiers
Definition: chooseInSticks.py:57
QtCore
src.chooseInSticks.chooseDialog.okButton
okButton
mise en place des titres personnalisés
Definition: chooseInSticks.py:53
src.chooseInSticks.chooseDialog.__init__
def __init__(self, parent=None, title1="", title2="", okPrompt="OK")
Le constructeur.
Definition: chooseInSticks.py:42
src.chooseInSticks.chooseDialog.baseDir
def baseDir(self)
Definition: chooseInSticks.py:155
src.chooseInSticks.chooseDialog.activate
def activate(self, item)
Fonction de rappel quand un item de la liste est activé
Definition: chooseInSticks.py:238
src.chooseInSticks.chooseDialog.minus
def minus(self)
Definition: chooseInSticks.py:254
QtGui
QtWidgets
src.chooseInSticks.chooseDialog.mainWindow
mainWindow
Definition: chooseInSticks.py:44
src.chooseInSticks.chooseDialog.checkWorkDirs
def checkWorkDirs(self)
Definition: chooseInSticks.py:115
src.chooseInSticks.chooseDialog.append
def append(self, path)
Ajoute un chemin avec ou sans jokers à la liste des chemins à supprimer.
Definition: chooseInSticks.py:269
src.chooseInSticks.chooseDialog._storListProxyModel
_storListProxyModel
Definition: chooseInSticks.py:64