ScolaSync  4.0
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Pages
copyToDialog1.py
Aller à la documentation de ce fichier.
1 # -*- coding: utf-8 -*-
2 # $Id: copyToDialog1.py 47 2011-06-13 10:20:14Z georgesk $
3 
4 licenceEn="""
5  file copyToDialog1.py
6  this file is part of the project scolasync
7 
8  Copyright (C) 2010 Georges Khaznadar <georgesk@ofset.org>
9 
10  This program is free software: you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation, either version3 of the License, or
13  (at your option) any later version.
14 
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with this program. If not, see <http://www.gnu.org/licenses/>.
22 """
23 
24 python3safe=True
25 
26 from PyQt4.QtCore import *
27 from PyQt4.QtGui import *
28 import os.path, subprocess
29 
30 import Ui_copyToDialog1
31 
32 ##
33 #
34 # Un dialogue pour choisir un ensemble de fichiers à transférer vers
35 # une collection de clés USB.
36 # @param parent un widget
37 # @param workdir un répertoire cible sur les baladeurs
38 #
40  ##
41  #
42  # Le constructeur
43  # @param parent un QWidget
44  #
45  def __init__(self,parent = None, workdir=""):
46  QDialog.__init__(self,parent)
47  self.mainWindow=parent
48  self._ui=Ui_copyToDialog1.Ui_Dialog()
49  self._ui.setupUi(self)
50  self._ui.travailEdit.setText(workdir)
51  self.setupFromListe()
52  self._fromDir=QDir.home()
53  self.setFromListeDir(self._fromDir)
54  self.setupToListe()
55  ##
56  # \var ok vrai si on a cliqué sur Continuer ...
57  self.ok="False"
58  QObject.connect(self._ui.selectButton, SIGNAL("clicked()"), self.select)
59  QObject.connect(self._ui.removeButton, SIGNAL("clicked()"), self.remove)
60  QObject.connect(self._ui.cancelButton, SIGNAL("clicked()"), self.cancel)
61  QObject.connect(self._ui.continueButton, SIGNAL("clicked()"), self.cont)
62  QObject.connect(self._ui.travailEdit, SIGNAL("editingFinished()"), self.changeWd)
63 
64  ##
65  #
66  # changement du répertoire de travail
67  #
68  def changeWd(self):
69  newDir=self._ui.travailEdit.text()
70  self.mainWindow.changeWd(newDir)
71 
72  ##
73  #
74  # L'action provoquée par le bouton d'échappement : fermeture du dialogue
75  #
76  def cancel(self):
77  self.close()
78 
79  ##
80  #
81  # L'action provoquée par le bouton de continuation : fermeture du dialogue
82  # et self.ok devient vrai.
83  #
84  def cont(self):
85  self.ok=True
86  self.close()
87 
88  ##
89  #
90  # Met en place un visionneur de fichiers dans la liste source
91  #
92  def setupFromListe(self):
93  self._model1 = QDirModel()
94  self._model1.setFilter(QDir.AllEntries)
95  self._ui.listViewFrom.setModel(self._model1)
96  QObject.connect(self._ui.listViewFrom, SIGNAL("doubleClicked(QModelIndex)"), self.cd)
97 
98  ##
99  #
100  # Choisit un répertoire pour la liste source
101  # @param directory une instance de QDir
102  #
103  def setFromListeDir(self,directory):
104  path=directory.path()
105  cwdIndex = self._model1.index(path)
106  self._ui.listViewFrom.setRootIndex(cwdIndex)
107  self._ui.lineEdit.setText(path)
108 
109  ##
110  #
111  # Change le répertoire courant si possible
112  # @param ev un évènement
113  #
114  def cd(self,index):
115  d= "%s" %index.data().toString()
116  p= "%s" %self._fromDir.path()
117  j=os.path.abspath(os.path.join(p,d))
118  if os.path.isdir(j):
119  self._fromDir=QDir(j)
120  self.setFromListeDir(self._fromDir)
121 
122  ##
123  #
124  # Met en place un visionneur de fichierspour les fichiers reçus
125  #
126  def setupToListe(self):
127  self._model2 = QStandardItemModel()
128  ### on connecte la liste d'items standard via un
129  ### proxy qui autorise le tri alphabétique
130  self._proxyModel = QSortFilterProxyModel()
131  self._proxyModel.setSourceModel(self._model2)
132  self._ui.listViewTo.setModel(self._proxyModel)
133  self._proxyModel.setDynamicSortFilter(True)
134  ###### apparemment les drops venus de la liste voisine
135  ###### ne fonctionnent pas et c'est bien dommage !!!
136  ## self._ui.listViewTo.setDragEnabled(True)
137  ## self._ui.listViewTo.setAcceptDrops(True)
138  ## self._ui.listViewTo.setDropIndicatorShown(True);
139 
140  ##
141  #
142  # Ajoute le répertoire ou le fichier sélectionné dans le
143  # navigateur de fichiers à la liste de sélections.
144  #
145  def select(self):
146  sel=self._ui.listViewFrom.selectedIndexes()
147  if len(sel)>0:
148  index=sel[0]
149  d= "%s" %index.data().toString()
150  p= "%s" %self._fromDir.path()
151  j=os.path.abspath(os.path.join(p,d))
152  f=self._model2.findItems(j)
153  if len(f)==0:
154  self._model2.appendRow(QStandardItem(j))
155  self._proxyModel.sort(0)
156  # on lance un calcul à nouveau pour la taille totale occupée
157  self.displaySize()
158  else:
159  print ("%s est déjà sélectionné" %j)
160 
161  ##
162  #
163  # Affiche la taille de la sélection courante
164  #
165  def displaySize(self):
166  total=0
167  for path in self.selectedList():
168  p=subprocess.Popen("du -s '%s' | awk '{print $1}'" %path,
169  shell=True, stdout=subprocess.PIPE)
170  size=p.communicate()[0]
171  try:
172  total+= int(size)
173  except:
174  pass
175  unit="%s" %QApplication.translate("Dialog","%s kilo-octets",None, QApplication.UnicodeUTF8)
176  if total>1024:
177  total= 0.1*int(10*total/1024)
178  unit="%s" %QApplication.translate("Dialog","%s méga-octets",None, QApplication.UnicodeUTF8)
179  if total>1024:
180  total= 0.1*int(10*total/1024)
181  unit="%s" %QApplication.translate("Dialog","%s giga-octets",None, QApplication.UnicodeUTF8)
182  self._ui.lineEdit_size.setText(unit %total)
183 
184  ##
185  #
186  # Supprime le répertoire ou le fichier sélectionné dans la
187  # liste de sélections.
188  #
189  def remove(self):
190  sel=self._ui.listViewTo.selectedIndexes()
191  if len(sel)>0:
192  index=sel[0]
193  sourceIndex=self._proxyModel.mapToSource(index)
194  self._model2.removeRow(sourceIndex.row())
195  self._proxyModel.sort(0)
196  # on lance un calcul à nouveau pour la taille totale occupée
197  self.displaySize()
198 
199  ##
200  #
201  # Renvoie une liste de répertoires et de fichiers qui ont été
202  # sélectionnés pour la copie sur clé USB.
203  # @return une liste de QStrings
204  #
205  def selectedList(self):
206  sl=self._model2.findItems("*",Qt.MatchWildcard)
207  return map(lambda x: ("%s" %x.text()), sl)
208 
209 if __name__=="__main__":
210  import sys
211  app = QApplication(sys.argv)
212  windows = copyToDialog1()
213  windows.show()
214  sys.exit(app.exec_())
def cd
Change le répertoire courant si possible.
def selectedList
Renvoie une liste de répertoires et de fichiers qui ont été sélectionnés pour la copie sur clé USB...
def setFromListeDir
Choisit un répertoire pour la liste source.
Un dialogue pour choisir un ensemble de fichiers à transférer vers une collection de clés USB...
def setupToListe
Met en place un visionneur de fichierspour les fichiers reçus.
def changeWd
changement du répertoire de travail
def displaySize
Affiche la taille de la sélection courante.
def select
Ajoute le répertoire ou le fichier sélectionné dans le navigateur de fichiers à la liste de sélection...
def cancel
L'action provoquée par le bouton d'échappement : fermeture du dialogue.
def cont
L'action provoquée par le bouton de continuation : fermeture du dialogue et self.ok devient vrai...
_proxyModel
on connecte la liste d'items standard via un proxy qui autorise le tri alphabétique ...
def setupFromListe
Met en place un visionneur de fichiers dans la liste source.
def remove
Supprime le répertoire ou le fichier sélectionné dans la liste de sélections.