dm.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. """ensemble des widgets surchargés"""
  4. from PyQt4.QtCore import *
  5. from PyQt4.QtGui import *
  6. from lib.outilsSvg import *
  7. import lib.regles as regles
  8. from lib.Actions import *
  9. class DmLabel(QLabel):
  10. """surcharge de QLabel"""
  11. def __init__(self, parent = None):
  12. super(DmLabel, self).__init__(parent)
  13. def majTexte(self, txt):
  14. self.clear()
  15. self.setText(QString.fromUtf8(txt))
  16. def chargerImage(self, chemin):
  17. self.clear()
  18. if len(chemin) > 0:
  19. pix = QPixmap(QString.fromUtf8(chemin))
  20. pix = pix.scaled(self.width(), self.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
  21. else:
  22. pix = QPixmap()
  23. self.setPixmap(pix)
  24. def texte(self):
  25. return str(self.text().toUtf8())
  26. class DmLabelChoixImage(DmLabel):
  27. """surcharge de DmLabel,
  28. affiche une fenetre de selection de fichier, recupere une image,
  29. et l'affiche."""
  30. def __init__(self, parent = None):
  31. super(DmLabelChoixImage, self).__init__(parent)
  32. self.setStyleSheet("QLabel { padding: 3px; }")
  33. self._sourceImage = ""
  34. def mousePressEvent(self, event):
  35. if event.button() == 1:
  36. self.selectionImage()
  37. def selectionImage(self):
  38. fichier = QFileDialog.getOpenFileName(self,
  39. "Selectionnez une image",
  40. "\\img",
  41. "Images (*.png *.jpg)")
  42. if len(fichier) > 0:
  43. pix = QPixmap(fichier)
  44. if not pix.isNull():
  45. self._sourceImage = fichier
  46. self.clear()
  47. pix = pix.scaled(self.width(), self.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
  48. self.setPixmap(pix)
  49. self.emit(SIGNAL("imageModifiee()"))
  50. else:
  51. dial = QMessageBox(self)
  52. dial.setText("Format non reconnu")
  53. dial.setWindowTitle("Erreur")
  54. dial.setStandardButtons(QMessageBox.Ok)
  55. dial.exec_()
  56. def image(self):
  57. """retourne le chemin de l'image chargee"""
  58. return self._sourceImage
  59. def chargerImage(self, chemin):
  60. self._sourceImage = chemin
  61. super(DmLabelChoixImage, self).chargerImage(chemin)
  62. class DmTextEdit(QTextEdit):
  63. def __init__(self, parent = None):
  64. super(DmTextEdit, self).__init__(parent)
  65. def majTexte(self, txt):
  66. self.clear()
  67. self.setText(QString.fromUtf8(str(txt)))
  68. def texte(self):
  69. return str(self.toPlainText().toUtf8())
  70. class DmLineEdit(QLineEdit):
  71. def __init__(self, parent = None):
  72. super(DmLineEdit, self).__init__(parent)
  73. def majTexte(self, txt):
  74. self.clear()
  75. self.setText(QString.fromUtf8(str(txt)))
  76. def texte(self):
  77. return str(self.text().toUtf8())
  78. class DmGraphicsView(QGraphicsView):
  79. """surcharge de QGraphicsView"""
  80. def __init__(self, parent = None):
  81. super(DmGraphicsView, self).__init__(parent)
  82. self.nbZoomActuel = 0
  83. def resizeEvent(self, event):
  84. super(DmGraphicsView, self).resizeEvent(event)
  85. self.emit(SIGNAL("resizeEvent()"))
  86. def wheelEvent(self, event):
  87. """zoom/dezoom avec la molette de la souris"""
  88. #on zoom/dezoom et on recentre sur la position du curseur
  89. zoom = 1.00
  90. if event.delta() > 0:
  91. if self.nbZoomActuel <= 10:
  92. self.nbZoomActuel += 1
  93. zoom = 1.25
  94. elif event.delta() < 0:
  95. if self.nbZoomActuel >= -10:
  96. zoom = 0.8
  97. self.nbZoomActuel -= 1
  98. if zoom != 0.00:
  99. self.scale(zoom, zoom)
  100. self.centerOn(self.mapToScene(event.pos()))
  101. event.accept() #pour considerer l'evenement comme resolu, sans ca les barres de defilement reagissent aussi
  102. class DmComboBox(QComboBox):
  103. """surcharge de QComboBox"""
  104. def __init__(self, parent = None):
  105. super(DmComboBox, self).__init__(parent)
  106. def allerA(self, donnee):
  107. """cherche la donnee demandee et affiche la ligne"""
  108. index = self.findData(QVariant(donnee))
  109. self.setCurrentIndex(index)
  110. def valeurActuelle(self):
  111. """renvoie sous forme de QVariant la valeur en cours"""
  112. return self.itemData(self.currentIndex())
  113. class DmTableWidget(QTableWidget):
  114. """surcharge de QTableWidget"""
  115. def __init__(self, parent = None):
  116. super(DmTableWidget, self).__init__(parent)
  117. self.majEnCours = False
  118. def vider(self):
  119. """supprime toutes les lignes"""
  120. self.majEnCours = True
  121. while self.rowCount() > 0:
  122. self.removeRow(0)
  123. self.majEnCours = False
  124. def nouvelleLigneFin(self):
  125. """ajoute une ligne en derniere position"""
  126. pos = self.rowCount()
  127. self.insertRow(pos)
  128. return pos
  129. def lignes(self):
  130. """retourne la liste des index de lignes de la table"""
  131. return range(0, self.rowCount())
  132. def colonnes(self):
  133. """retourne la liste des index de lignes de la table"""
  134. return range(0, self.columnCount())
  135. def masquerColonneId(self):
  136. """masque la colonne en position 0 qui contient les identifiants"""
  137. self.setColumnWidth(0, 0)
  138. def majData(self, ligne, colonne, var):
  139. """met a jour la cellule avec une donnee de type QVariant"""
  140. var = QVariant(var)
  141. self.item(ligne, colonne).setData(0, var)
  142. return True
  143. def majTexte(self, ligne, colonne, texte):
  144. """met a jour la cellule avec du texte"""
  145. if not self.item(ligne, colonne):
  146. self.setItem(ligne, colonne, QTableWidgetItem(QString.fromUtf8(str(texte))))
  147. else:
  148. self.item(ligne, colonne).setText(QString.fromUtf8(str(texte)))
  149. return True
  150. def majEnt(self, ligne, colonne, valeur):
  151. """met a jour la cellule avec une valeur numerique entiere
  152. si valeur ne peut etre converti en numerique, on retourne Faux"""
  153. retour = False
  154. try:
  155. entier = QVariant(long(valeur))
  156. self.item(ligne, colonne).setData(0, entier)
  157. retour = True
  158. except:
  159. pass
  160. return retour
  161. def chercherLigne(self, colonne, valeur):
  162. """cherche la valeur dans la colonne demandee
  163. renvoie la ligne correspondante """
  164. ligne = None
  165. for i in range(0, self.rowCount()):
  166. if str(self.item(i, colonne).text().toUtf8()) == str(valeur):
  167. ligne = i
  168. break
  169. return ligne
  170. def majLigne(self, ligne, dico, flags = []):
  171. """rempli la ligne avec les donnees trouvees dans le dictionnaire"""
  172. for colonne in range(0, self.columnCount()):
  173. nomChamp = ""
  174. item = self.horizontalHeaderItem(colonne)
  175. if item:
  176. nomChamp = str(item.text())
  177. if nomChamp in dico:
  178. item = QTableWidgetItem()
  179. for f in flags:
  180. item.setFlag(f)
  181. var = QVariant(dico[nomChamp])
  182. item.setData(0, var)
  183. self.setItem(ligne, colonne, item)
  184. def texte(self, ligne, colonne):
  185. return str(self.item(ligne, colonne).text().toUtf8())
  186. def data(self, ligne, colonne):
  187. retour = None
  188. item = self.item(ligne, colonne)
  189. if item:
  190. retour = item.data(0)
  191. return retour
  192. def ligneSelectionnee(self):
  193. """renvoie la ligne selectionnee (la premiere si plusieurs le sont)"""
  194. return self.currentRow()
  195. def selectionner(self, ligne, colonne):
  196. self.setCurrentCell(ligne, colonne, QItemSelectionModel.Select)
  197. class DmTableBiblio(DmTableWidget):
  198. """table utilisee pour afficher les bibliotheques d'objets:
  199. terrains, decors, creatures"""
  200. def __init__(self, parent = None):
  201. super(DmTableBiblio, self).__init__(parent)
  202. self.fichier = ""
  203. self.masquerColonneId()
  204. def defFichier(self, fichier):
  205. """definit le fichier de sauvegarde qui la source des donnees de la table"""
  206. self.fichier = fichier
  207. def initAffichage(self):
  208. """fait les differents reglages relatifs a l'apparence"""
  209. self.setColumnWidth(0, 0)
  210. self.setIconSize(QSize(30,20))
  211. self.horizontalHeader().setStretchLastSection(True)
  212. def remplir(self):
  213. """remplit la table avec les donnees contenues dans le dictionnaire de la savuvegarde"""
  214. dico = afficheSvg(self.fichier)
  215. self.majEnCours = True
  216. self.setSortingEnabled(False)
  217. index = 0
  218. for elt in dico:
  219. objet = dico[elt]
  220. self.insertRow(int(index))
  221. #code de l'objet
  222. self.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(elt)))
  223. #icone et nom
  224. icon = QIcon(objet.icone())
  225. item = QTableWidgetItem(icon,QString.fromUtf8(objet.nom))
  226. self.setItem(int(index),1,item)
  227. index += 1
  228. self.sizeHintForColumn(1)
  229. self.setSortingEnabled(True)
  230. self.sortItems(1)
  231. self.majEnCours = False
  232. def maj(self):
  233. self.vider()
  234. self.remplir()
  235. def actuel(self):
  236. """renvoie l'objet actuellement selectionne"""
  237. objet = None
  238. index = self.item(self.currentRow(), 0)
  239. if index > 0:
  240. objet = charger(self.fichier, str(index.text().toUtf8()))
  241. return objet
  242. class DmTableAttributsPi(DmTableWidget):
  243. """table utilisee pour afficher les attributs d'un pion dans le panneau Pi"""
  244. def __init__(self, parent = None):
  245. super(DmTableBiblio, self).__init__(parent)
  246. self.fichier = ""
  247. self.masquerColonneId()
  248. def defFichier(self, fichier):
  249. """definit le fichier de sauvegarde qui la source des donnees de la table"""
  250. self.fichier = fichier
  251. def initAffichage(self):
  252. """fait les differents reglages relatifs a l'apparence"""
  253. self.setColumnWidth(0, 0)
  254. self.setIconSize(QSize(30,20))
  255. self.horizontalHeader().setStretchLastSection(True)
  256. def remplir(self):
  257. """remplit la table avec les donnees contenues dans le dictionnaire de la savuvegarde"""
  258. dico = afficheSvg(self.fichier)
  259. self.majEnCours = True
  260. self.setSortingEnabled(False)
  261. index = 0
  262. for elt in dico:
  263. objet = dico[elt]
  264. self.insertRow(int(index))
  265. #code de l'objet
  266. self.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(elt)))
  267. #icone et nom
  268. icon = QIcon("img\\"+objet.icone())
  269. item = QTableWidgetItem(icon,QString.fromUtf8(objet.nom))
  270. self.setItem(int(index),1,item)
  271. index += 1
  272. self.sizeHintForColumn(1)
  273. self.setSortingEnabled(True)
  274. self.sortItems(1)
  275. self.majEnCours = False
  276. def maj(self):
  277. self.vider()
  278. self.remplir()
  279. def actuel(self):
  280. """renvoie l'objet actuellement selectionne"""
  281. objet = None
  282. index = self.item(self.currentRow(), 0)
  283. if index > 0:
  284. objet = charger(self.fichier, str(index.text().toUtf8()))
  285. return objet
  286. class DmTableListeAttaques(DmTableWidget):
  287. """liste des attaques du combattant"""
  288. def __init__(self, parent = None):
  289. super(DmTableListeAttaques, self).__init__(parent)
  290. self.panneau = None
  291. self._listeAttaques = []
  292. self.connect(self, SIGNAL("currentCellChanged(int, int, int, int)"), self.selectionChangee)
  293. def listeAttaques(self):
  294. #on recupere les donnees de l'attaque en cours avant d'exporter la liste
  295. self.enregistrerPanneau(self.ligneSelectionnee())
  296. return self._listeAttaques
  297. def attaqueSelectionnee(self):
  298. """renvoie l'attaque selectionnee"""
  299. retour = None
  300. if len(self._listeAttaques) > 0 and self.ligneSelectionnee() != None:
  301. retour = self._listeAttaques[self.ligneSelectionnee()]
  302. return retour
  303. def majAttaque(self, index, nouvelle):
  304. """met a jour les donnees de l'attaque en position x"""
  305. self._listeAttaques[index] = nouvelle
  306. def charger(self, fenetre, listeAttaques):
  307. self.panneau = fenetre.ui.edc_attaque_panneau
  308. self._listeAttaques = listeAttaques
  309. self.peupler()
  310. self.selectionner(0, 0)
  311. self.majPanneau()
  312. def peupler(self):
  313. self.vider()
  314. for attaque in self._listeAttaques:
  315. ligne = self.nouvelleLigneFin()
  316. self.setItem(ligne, 0, QTableWidgetItem(attaque.icone(), QString.fromUtf8(attaque.nom())))
  317. def majPanneau(self):
  318. """met a jour les donnees du panneau"""
  319. self.panneau.chargerAttaque(self.attaqueSelectionnee())
  320. def enregistrerPanneau(self, ligne):
  321. """enregistre les donnees du panneau sur l'attaque de la ligne"""
  322. attaque = self.panneau.attaque()
  323. if attaque:
  324. self._listeAttaques[ligne] = attaque
  325. self.peupler()
  326. def nouvelle(self):
  327. attaque = Cac()
  328. self._listeAttaques.append(attaque)
  329. self.peupler()
  330. self.selectionner(self.rowCount(), 0)
  331. def supprimer(self):
  332. """supprime l'attaque actuellement selectionnee"""
  333. ## ligne = self.ligneSelectionnee()
  334. self._listeAttaques.remove(self.attaqueSelectionnee())
  335. self.peupler()
  336. ## self.selectionner(ligne, 0)
  337. ## self.removeRow(self.ligneSelectionnee())
  338. def selectionChangee(self, ancienneLigne, ancienneColonne, ligne, colonne):
  339. self.enregistrerPanneau(ancienneLigne)
  340. self.panneau.chargerAttaque(None)
  341. self.majPanneau()
  342. ## self.emit(SIGNAL("selectionChangee(int, int)"), ancienneLigne, ligne)
  343. class DmTableAttributsAttaque(DmTableWidget):
  344. """table contenant les attributs (selon regles) d'une attaque"""
  345. def __init__(self, parent = None):
  346. super(DmTableAttributsAttaque, self).__init__(parent)
  347. self._constr = False
  348. def attributs(self):
  349. """retourne un dictionnaire contenant les attributs"""
  350. dico = {}
  351. for ligne in self.lignes():
  352. nomAttr = regles.ordreAttributsAttaques()[ligne]
  353. dico[nomAttr] = regles.attributAttaque(nomAttr).controler(self.texte(ligne, 1))
  354. return dico
  355. def construire(self):
  356. """cree les lignes et remplit la colonne des noms d'attributs"""
  357. for nomAttribut in regles.ordreAttributsAttaques():
  358. attribut = regles.attributAttaque(nomAttribut)
  359. ligne = self.nouvelleLigneFin()
  360. self.majTexte(ligne, 0, attribut.nom)
  361. self.majTexte(ligne, 1, "")
  362. self._constr = True
  363. def charger(self, attributs):
  364. """charge les attributs d'une attaque"""
  365. self.decharger()
  366. for ligne in self.lignes():
  367. attr = regles.ordreAttributsAttaques()[ligne]
  368. valeur = attributs[attr]
  369. self.majTexte(ligne, 1, valeur)
  370. def decharger(self):
  371. """efface les valeurs de la colonne des valeurs,
  372. mais laisse intacte la colonne des noms d'attributs"""
  373. if not self._constr:
  374. self.contruire()
  375. else:
  376. for ligne in self.lignes():
  377. self.majTexte(ligne, 1, "")
  378. class DmTableMenu(QTableWidget):
  379. """table utilisee comme barre d'onglets verticale"""
  380. def __init__(self, parent = None):
  381. super(DmTableMenu, self).__init__(parent)
  382. def setItem(self, ligne, colonne, item):
  383. super(DmTableMenu, self).setItem(ligne, colonne, item)
  384. if ligne == 0:
  385. self.setItemSelected(item, True)
  386. class DmFrameInf_Combattant(QGroupBox):
  387. """frame d'information (combattant)"""
  388. def __init__(self, parent = None):
  389. super(DmFrameInf_Combattant, self).__init__(parent)
  390. def maj(self, combattant):
  391. self.setVisible((combattant != None))
  392. if combattant:
  393. self.findChild(DmLabel, "inf_pionNom").majTexte(combattant.nom)
  394. self.findChild(DmLabel, "inf_pionImage").chargerImage("img\\"+combattant.img.nomFichier)
  395. self.findChild(DmLabel, "inf_pionEffet").setVisible(False)
  396. class DmFrameInf_Decor(QGroupBox):
  397. """frame d'information (decor)"""
  398. def __init__(self, parent = None):
  399. super(DmFrameInf_Decor, self).__init__(parent)
  400. def maj(self, decor):
  401. self.setVisible((decor != None))
  402. if decor:
  403. self.findChild(DmLabel, "inf_decorNom").majTexte(decor.nom)
  404. self.findChild(DmLabel, "inf_decorImage").chargerImage("img\\"+decor.img.nomFichier)
  405. class DmFrameInf_Case(QGroupBox):
  406. """frame d'information (case)"""
  407. def __init__(self, parent = None):
  408. super(DmFrameInf_Case, self).__init__(parent)
  409. def maj(self, case):
  410. self.setVisible((case != None))
  411. if len(case.terrain.nom) > 0:
  412. self.findChild(DmLabel, "inf_caseTerrain").majTexte(case.terrain.nom)
  413. else:
  414. self.findChild(DmLabel, "inf_caseTerrain").majTexte("Case")
  415. self.findChild(DmLabel, "inf_caseCoord").majTexte("X: {} Y: {}".format(case.x, case.y))
  416. self.findChild(DmLabel, "inf_caseAltitude").majTexte("Alt.: {}".format(case.altitude))
  417. if case.effetActif != "":
  418. self.findChild(DmLabel, "inf_caseEffet").chargerImage("img\\"+case.imgEffet[case.effetActif])
  419. else:
  420. self.findChild(DmLabel, "inf_caseEffet").clear()
  421. class DmFrame(QFrame):
  422. """surcharge de QFrame"""
  423. def __init__(self, parent = None):
  424. super(DmFrame, self).__init__(parent)
  425. class DmEdcPanneauAttaque(DmFrame):
  426. """frame contenant les donnees de l'attaque actuellement
  427. affichee lors de la creation de combattant"""
  428. def __init__(self, parent = None):
  429. super(DmEdcPanneauAttaque, self).__init__(parent)
  430. self.fenetre = None
  431. def construire(self, fenetre):
  432. self.fenetre = fenetre
  433. self.fenetre.ui.edc_attaque_attributs.vider()
  434. self.fenetre.ui.edc_attaque_attributs.construire()
  435. self.chargerAttaque(None)
  436. ## self.connect(self.fenetre.ui.edc_attaque_liste, SIGNAL("selectionChangee(int, int)"), self.listeSelectionChangee)
  437. def chargerAttaque(self, attaque = None):
  438. """met a jour le contenu avec les donnees de l'attaque en param"""
  439. if attaque:
  440. self.setEnabled(True)
  441. if isinstance(attaque, Cac):
  442. self.fenetre.ui.edc_attaque_type.setCurrentIndex(0)
  443. elif isinstance(attaque, Distance):
  444. self.fenetre.ui.edc_attaque_type.setCurrentIndex(1)
  445. elif isinstance(attaque, Zone):
  446. self.fenetre.ui.edc_attaque_type.setCurrentIndex(2)
  447. self.fenetre.ui.edc_attaque_forme.setVisible(True)
  448. self.fenetre.ui.edc_attaque_forme_e.setVisible(True)
  449. if isinstance(attaque, Ligne):
  450. self.fenetre.ui.edc_attaque_forme.setCurrentIndex(0)
  451. elif isinstance(attaque, Disque):
  452. self.fenetre.ui.edc_attaque_forme.setCurrentIndex(1)
  453. self.fenetre.ui.edc_attaque_rayon.setValue(attaque.rayon())
  454. self.fenetre.ui.edc_attaque_rayon.setVisible(True)
  455. self.fenetre.ui.edc_attaque_rayon_e.setVisible(True)
  456. elif isinstance(attaque, Cone):
  457. self.fenetre.ui.edc_attaque_forme.setCurrentIndex(2)
  458. self.fenetre.ui.edc_attaque_nom.majTexte(attaque.nom())
  459. self.fenetre.ui.edc_attaque_portee.setValue(attaque.portee())
  460. self.fenetre.ui.edc_attaque_attributs.charger(attaque.attributs())
  461. self.fenetre.ui.edc_attaque_notes.majTexte(attaque.notes())
  462. else:
  463. self.fenetre.ui.edc_attaque_type.setCurrentIndex(0)
  464. self.fenetre.ui.edc_attaque_nom.majTexte("")
  465. self.fenetre.ui.edc_attaque_portee.setValue(1)
  466. self.fenetre.ui.edc_attaque_forme.setCurrentIndex(0)
  467. self.fenetre.ui.edc_attaque_forme.setVisible(False)
  468. self.fenetre.ui.edc_attaque_forme_e.setVisible(False)
  469. self.fenetre.ui.edc_attaque_rayon.setValue(1)
  470. self.fenetre.ui.edc_attaque_rayon.setVisible(False)
  471. self.fenetre.ui.edc_attaque_rayon_e.setVisible(False)
  472. self.fenetre.ui.edc_attaque_attributs.decharger()
  473. self.fenetre.ui.edc_attaque_notes.majTexte("")
  474. self.setEnabled(False)
  475. def attaque(self):
  476. """retourne l'attaque en cours"""
  477. attaque = None
  478. if self.isEnabled():
  479. if self.fenetre.ui.edc_attaque_type.currentIndex() == 0:
  480. attaque = Cac()
  481. elif self.fenetre.ui.edc_attaque_type.currentIndex() == 1:
  482. attaque = Distance()
  483. elif self.fenetre.ui.edc_attaque_type.currentIndex() == 2:
  484. if self.fenetre.ui.edc_attaque_forme.currentIndex() == 0:
  485. attaque = Ligne()
  486. elif self.fenetre.ui.edc_attaque_forme.currentIndex() == 1:
  487. attaque = Disque()
  488. attaque.majRayon(self.fenetre.ui.edc_attaque_rayon.value())
  489. elif self.fenetre.ui.edc_attaque_forme.currentIndex() == 2:
  490. attaque = Cone()
  491. nom = self.fenetre.ui.edc_attaque_nom.texte()
  492. if len(nom) == 0: nom = "Attaque"
  493. attaque.majNom(nom)
  494. attaque.majPortee(self.fenetre.ui.edc_attaque_portee.value())
  495. attaque.majAttributs(self.fenetre.ui.edc_attaque_attributs.attributs())
  496. attaque.majNotes(self.fenetre.ui.edc_attaque_notes.texte())
  497. return attaque