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 
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 
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 
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