ScolaSync  5.1
copyToDialog1.py
Aller à la documentation de ce fichier.
1 # $Id: copyToDialog1.py 47 2011-06-13 10:20:14Z georgesk $
2 
3 licenceEn="""
4  file copyToDialog1.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, subprocess
27 
28 import Ui_copyToDialog1
29 
30 ##
31 #
32 # Un dialogue pour choisir un ensemble de fichiers à transférer vers
33 # une collection de clés USB.
34 # @param parent un widget
35 # @param workdir un répertoire cible sur les baladeurs
36 #
38  ##
39  #
40  # Le constructeur
41  # @param parent un QWidget
42  #
43  def __init__(self,parent = None, workdir=""):
44  QDialog.__init__(self,parent)
45  self.mainWindow=parent
46  self._ui=Ui_copyToDialog1.Ui_Dialog()
47  self._ui.setupUi(self)
48  self._ui.travailEdit.setText(workdir)
49  self.setupFromListe()
50  self._fromDir=QDir.home()
51  self.setFromListeDir(self._fromDir)
52  self.setupToListe()
53  ##
54  # \var ok vrai si on a cliqué sur Continuer ...
55  self.ok="False"
56  self._ui.selectButton.clicked.connect(self.select)
57  self._ui.removeButton.clicked.connect(self.remove)
58  self._ui.cancelButton.clicked.connect(self.cancel)
59  self._ui.continueButton.clicked.connect(self.cont)
60  self._ui.travailEdit.editingFinished.connect(self.changeWd)
61 
62  ##
63  #
64  # changement du répertoire de travail
65  #
66  def changeWd(self):
67  newDir=self._ui.travailEdit.text()
68  self.mainWindow.changeWd(newDir)
69 
70  ##
71  #
72  # L'action provoquée par le bouton d'échappement : fermeture du dialogue
73  #
74  def cancel(self):
75  self.close()
76 
77  ##
78  #
79  # L'action provoquée par le bouton de continuation : fermeture du dialogue
80  # et self.ok devient vrai.
81  #
82  def cont(self):
83  self.ok=True
84  self.close()
85 
86  ##
87  #
88  # Met en place un visionneur de fichiers dans la liste source
89  #
90  def setupFromListe(self):
91  self._model1 = QDirModel()
92  self._model1.setFilter(QDir.AllEntries)
93  self._ui.listViewFrom.setModel(self._model1)
94  self._ui.listViewFrom.doubleClicked.connect(self.cd)
95 
96  ##
97  #
98  # Choisit un répertoire pour la liste source
99  # @param directory une instance de QDir
100  #
101  def setFromListeDir(self,directory):
102  path=directory.path()
103  cwdIndex = self._model1.index(path)
104  self._ui.listViewFrom.setRootIndex(cwdIndex)
105  self._ui.lineEdit.setText(path)
106 
107  ##
108  #
109  # Change le répertoire courant si possible
110  # @param ev un évènement
111  #
112  def cd(self,index):
113  d= "%s" %index.data()
114  p= "%s" %self._fromDir.path()
115  j=os.path.abspath(os.path.join(p,d))
116  if os.path.isdir(j):
117  self._fromDir=QDir(j)
118  self.setFromListeDir(self._fromDir)
119 
120  ##
121  #
122  # Met en place un visionneur de fichierspour les fichiers reçus
123  #
124  def setupToListe(self):
125  self._model2 = QStandardItemModel()
126  ### on connecte la liste d'items standard via un
127  ### proxy qui autorise le tri alphabétique
128  self._proxyModel = QSortFilterProxyModel()
129  self._proxyModel.setSourceModel(self._model2)
130  self._ui.listViewTo.setModel(self._proxyModel)
131  self._proxyModel.setDynamicSortFilter(True)
132  ###### apparemment les drops venus de la liste voisine
133  ###### ne fonctionnent pas et c'est bien dommage !!!
134  ## self._ui.listViewTo.setDragEnabled(True)
135  ## self._ui.listViewTo.setAcceptDrops(True)
136  ## self._ui.listViewTo.setDropIndicatorShown(True);
137 
138  ##
139  #
140  # Ajoute le répertoire ou le fichier sélectionné dans le
141  # navigateur de fichiers à la liste de sélections.
142  #
143  def select(self):
144  sel=self._ui.listViewFrom.selectedIndexes()
145  if len(sel)>0:
146  index=sel[0]
147  d= "%s" %index.data()
148  p= "%s" %self._fromDir.path()
149  j=os.path.abspath(os.path.join(p,d))
150  f=self._model2.findItems(j)
151  if len(f)==0:
152  self._model2.appendRow(QStandardItem(j))
153  self._proxyModel.sort(0)
154  # on lance un calcul à nouveau pour la taille totale occupée
155  self.displaySize()
156  else:
157  print ("%s est déjà sélectionné" %j)
158 
159  ##
160  #
161  # Affiche la taille de la sélection courante
162  #
163  def displaySize(self):
164  total=0
165  for path in self.selectedList():
166  p=subprocess.Popen("du -s '%s' | awk '{print $1}'" %path,
167  shell=True, stdout=subprocess.PIPE)
168  size=p.communicate()[0]
169  try:
170  total+= int(size)
171  except:
172  pass
173  unit="%s" %QApplication.translate("Dialog","%s kilo-octets",None)
174  if total>1024:
175  total= 0.1*int(10*total/1024)
176  unit="%s" %QApplication.translate("Dialog","%s méga-octets",None)
177  if total>1024:
178  total= 0.1*int(10*total/1024)
179  unit="%s" %QApplication.translate("Dialog","%s giga-octets",None)
180  self._ui.lineEdit_size.setText(unit %total)
181 
182  ##
183  #
184  # Supprime le répertoire ou le fichier sélectionné dans la
185  # liste de sélections.
186  #
187  def remove(self):
188  sel=self._ui.listViewTo.selectedIndexes()
189  if len(sel)>0:
190  index=sel[0]
191  sourceIndex=self._proxyModel.mapToSource(index)
192  self._model2.removeRow(sourceIndex.row())
193  self._proxyModel.sort(0)
194  # on lance un calcul à nouveau pour la taille totale occupée
195  self.displaySize()
196 
197  ##
198  #
199  # Renvoie une liste de répertoires et de fichiers qui ont été
200  # sélectionnés pour la copie sur clé USB.
201  # @return une liste de QStrings
202  #
203  def selectedList(self):
204  sl=self._model2.findItems("*",Qt.MatchWildcard)
205  return map(lambda x: ("%s" %x.text()), sl)
206 
207 if __name__=="__main__":
208  import sys
209  app = QApplication(sys.argv)
210  windows = copyToDialog1()
211  windows.show()
212  sys.exit(app.exec_())
def selectedList(self)
Renvoie une liste de répertoires et de fichiers qui ont été sélectionnés pour la copie sur clé USB...
def setFromListeDir(self, directory)
Choisit un répertoire pour la liste source.
def cd(self, index)
Change le répertoire courant si possible.
def setupFromListe(self)
Met en place un visionneur de fichiers dans la liste source.
def cancel(self)
L'action provoquée par le bouton d'échappement : fermeture du dialogue.
Un dialogue pour choisir un ensemble de fichiers à transférer vers une collection de clés USB...
def setupToListe(self)
Met en place un visionneur de fichierspour les fichiers reçus.
def changeWd(self)
changement du répertoire de travail
def cont(self)
L'action provoquée par le bouton de continuation : fermeture du dialogue et self.ok devient vrai...
def displaySize(self)
Affiche la taille de la sélection courante.
def select(self)
Ajoute le répertoire ou le fichier sélectionné dans le navigateur de fichiers à la liste de sélection...
_proxyModel
on connecte la liste d'items standard via un proxy qui autorise le tri alphabétique ...
def remove(self)
Supprime le répertoire ou le fichier sélectionné dans la liste de sélections.