ScolaSync: Fichier source de src/chooseInSticks.py

ScolaSync 5.1 |

chooseInSticks.py
Aller à la documentation de ce fichier.
1 # $Id: chooseInSticks.py 47 2011-06-13 10:20:14Z georgesk $
2
3 licenceEn="""
4 file chooseInSticks.py
5 this file is part of the project scolasync
6
7 Copyright (C) 2010 Georges Khaznadar <georgesk@ofset.org>
8
9 This program is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 """
22
23 from PyQt5.QtCore import *
24 from PyQt5.QtWidgets import *
25 from PyQt5.QtGui import *
26 import os.path
27
28 import Ui_chooseInSticks
29
30
32
33 class chooseDialog(QDialog):
34
41
42 def __init__(self,parent = None, title1="", title2="", okPrompt="OK"):
43 QDialog.__init__(self,parent)
44 self.mainWindow=parent
45 self._ui=Ui_chooseInSticks.Ui_Dialog()
46 self._ui.setupUi(self)
47
48 self.setWindowTitle(title1)
49 self._ui.groupBox.setTitle(title2)
50
51 okButton=self._ui.buttonBox.button(QDialogButtonBox.Ok)
52 self._ui.buttonBox.removeButton(okButton)
53 self.okButton=QPushButton(okPrompt)
54 self._ui.buttonBox.addButton(self.okButton,
55 QDialogButtonBox.AcceptRole)
56
57 self._fileListModel=QStandardItemModel()
58 self._fileListProxyModel = QSortFilterProxyModel()
59 self._fileListProxyModel.setSourceModel(self._fileListModel)
60 self._ui.listView.setModel(self._fileListProxyModel)
61 self._fileListProxyModel.setDynamicSortFilter(True)
62
63 self._storListModel=QStandardItemModel()
64 self._storListProxyModel = QSortFilterProxyModel()
65 self._storListProxyModel.setSourceModel(self._storListModel)
66 self._ui.listChoixCle.setModel(self._storListProxyModel)
67 self._storListProxyModel.setDynamicSortFilter(True)
68
69 self.ownedUsbDictionary={}
70 self.listStorages()
71
72 self._ui.minusButton.setEnabled(False)
73 self._ui.travailEdit.setText(self.mainWindow.workdir)
74 self._ui.plusButton.clicked.connect(self.plus)
75 self._ui.chooseButton.clicked.connect(self.choose)
76 self._ui.chooseButton_dir.clicked.connect(self.choose_dir)
77 self.okButton.clicked.connect(self.checkValues)
78 self._ui.minusButton.clicked.connect(self.minus)
79 self._ui.listView.clicked.connect(self.activate)
80 self._ui.travailEdit.editingFinished.connect(self.changeWd)
81 self.ok=False
82
83 # fonction de rappel liée au bouton de validation, vérifie s'il y a bien
84 # au moins un fichier ou un répertoire sélectionné
85 #
86
87 def checkValues(self):
88 self.ok=self._ui.listView.model().rowCount()>0
89
90 # Met en place la liste des noms de baladeurs connectés en tenant compte
91 # du nom de répertoire de travail et d'un baladeur éventuellement
92 # sélectionné dans la fenêtre principale
93 #
94
95 def listStorages(self):
96 sel=self.mainWindow.ui.tableView.selectedIndexes()
97 for d in qApp.available:
98 o=d.ownerByDb()
99 mountPath=d.ensureMounted()
100 item=QStandardItem(o)
101 # on cherche à voir si la clé est déjà sélectionnée
102 for modelIndex in sel:
103 if o == "%s" %modelIndex.data(Qt.DisplayRole):
104 break
105 self._storListModel.appendRow(item)
106 self.ownedUsbDictionary[o]=mountPath
107 self._storListProxyModel.sort(0)
108 self.checkWorkDirs()
109
110 # met à jour la possibilité de sélectionner les baladeurs dans la liste
111 # selon qu'ils ont ou pas un répertoire de travail, puis sélectionne
112 # si possible un baladeur, si aucun ne l'était avant.
113 #
114
115 def checkWorkDirs(self):
116 firstSelectable=None
117 okSelected=None
118 # on récupère la sélection courante à travers le proxy
119 selection=self._ui.listChoixCle.selectionModel().selection()
120 selection = self._storListProxyModel.mapSelectionToSource(selection)
121 selectedRows=map(lambda x: x.row(), self._ui.listChoixCle.selectedIndexes())
122 itemList=self._storListModel.findItems ("*",Qt.MatchWildcard)
123 itemList.sort(key=lambda i: i.data(Qt.DisplayRole))
124 # parcours des items de la liste par ordre alphabétique
125 # pour élire celui qui sera sélectionné initialement
126 for item in itemList:
127 index=self._storListModel.indexFromItem(item)
128 o="%s" %item.data(Qt.DisplayRole)
129 testDir=os.path.join(self.ownedUsbDictionary[o],self.mainWindow.workdir)
130 if os.path.isdir(testDir):
131 # si l'item concerne un disque qui contient le répertoire de
132 # travail, on le rend sélectionnable
133 item.setSelectable(True)
134 item.setEnabled(True)
135 # et si c'est le tout premier, on s'en souvient.
136 if firstSelectable == None:
137 firstSelectable=index
138 # on vérifie s'il était déjà dans la sélection
139 if index.row() in selectedRows:
140 okSelected=index
141 else:
142 item.setSelectable(False)
143 item.setEnabled(False)
144 if okSelected == None and firstSelectable != None:
145 selection=QItemSelection(firstSelectable,firstSelectable)
146 selection=self._storListProxyModel.mapSelectionFromSource(selection)
147 self._ui.listChoixCle.selectionModel().select(selection, QItemSelectionModel.Select);
148
149 # @return le répertoire à partir duquel on peut commencer à faire
150 # un choix de fichier ou de sous-répertoire. Il dépend du baladeur
151 # sélectionné s'il y en a un et du nom du répertoire de travail.
152 # Si on n'arrive pas à déterminer ce répertoire, renvoie None
153 #
154
155 def baseDir(self):
156 mp=self.selectedDiskMountPoint()
157 if mp:
158 return os.path.join(mp,self.mainWindow.workdir)
159 else:
160 return None
161
162
164
165 def selectedDiskMountPoint(self):
166 o=self.selectedDiskOwner()
167 if o==None:
168 return None
169 else:
170 return self.ownedUsbDictionary[o]
171
172 # @return le nom du propriétaire du disque sélectionné s'il y en a un,
173 # sinon None.
174 #
175
176 def selectedDiskOwner(self):
177 selection=self._ui.listChoixCle.selectionModel().selection()
178 if len(selection)==0:
179 return None
180 selection = self._storListProxyModel.mapSelectionToSource(selection)
181 return "%s" %selection.indexes()[0].data(Qt.DisplayRole)
182
183
185
186 def changeWd(self):
187 newDir=self._ui.travailEdit.text()
188 self.mainWindow.changeWd(newDir)
189 self.checkWorkDirs()
190
191 # Facilite le choix de motifs de fichiers en recherchant dans
192 # les clés USB, modifie l'éditeur de ligne de texte et place le
193 # fichier choisi dans la liste
194 # @param kind type d'élément à choisir : "file" pour un fichier,
195 # "dir" pour un répertoire
196 #
197
198 def choose(self, kind="file"):
199 if kind == "file":
200 func=QFileDialog.getOpenFileNames
201 msg=QApplication.translate("Dialog",
202 "Choissez un fichier (ou plus)")
203 else:
204 func=QFileDialog.getExistingDirectory
205 msg=QApplication.translate("Dialog",
206 "Choissez un répertoire")
207 cd=self.baseDir()
208 if cd!=None:
209 f = func (None, msg, cd)
210 if f and len(f)>0:
211 if isinstance(f, str):
212 theList=[f]
213 else:
214 theList=f
215 for f in theList:
216 path=f.replace(self.selectedDiskMountPoint()+"/", "")
217 self._ui.lineEdit.setText(path)
218 self.plus()
219 else:
220 titre=QApplication.translate("Dialog",
221 "Aucune clé modèle sélectionnée")
222 msg=QApplication.translate("Dialog",
223 "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))
224 msgBox=QMessageBox.warning(None, titre, msg)
225
226 # Facilite le choix de motifs de répertoires en recherchant dans
227 # les clés USB, modifie l'éditeur de ligne de texte et place le
228 # répertoire choisi dans la liste
229 #
230
231 def choose_dir(self):
232 self.choose(kind="dir")
233
234
237
238 def activate(self, item):
239 self._ui.minusButton.setEnabled(True)
240
241 # Permet de choisir et d'ajouter un nouveau fichier ou répertoire à
242 # supprimer
243 #
244
245 def plus(self):
246 text=self._ui.lineEdit.text()
247 if len(text)>0 :
248 self.append(text)
249
250 # Permet de retirer de la liste des fichiers à supprimer ceux qu'on
251 # a sélectionnés
252 #
253
254 def minus(self):
255 sel=self._ui.listView.selectedIndexes()
256 sel1=map(self._fileListProxyModel.mapToSource,sel)
257 rows=map(lambda x: x.row(), sel1)
258 rows.sort("descending")
259 for r in rows:
260 self._fileListModel.removeRow(r)
261 sel=self._ui.listView.selectedIndexes()
262 if len(sel)==0:
263 self._ui.minusButton.setEnabled(False)
264
265
268
269 def append(self, path):
270 f=self._fileListModel.findItems(path)
271 if len(f)==0:
272 item=QStandardItem(path)
273 self._fileListModel.appendRow(item)
274 self._fileListProxyModel.sort(0)
275 else:
276 print ("%s est déjà sélectionné" %path)
277
278 # renvoie la liste des chemins sélectionnés; dans le cas de chemins
279 # sans jokers (caractères * ou ?), les chemins sont protégés par des
280 # guillemets, afin qu'ils soient adaptés à un shell POSIX.
281 # @return une liste de chemins, sous forme de QStrings
282 #
283
284 def pathList(self):
285 itemList=self._fileListModel.findItems("*",Qt.MatchWildcard)
286 result=[x.text() for x in itemList]
287 otherText=self._ui.lineEdit.text()
288 if len(otherText) > 0 and otherText not in result :
289 result.append(otherText)
290 return result
291
292
293
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