dm.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  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. class DmLabel(QLabel):
  8. """surcharge de QLabel"""
  9. def __init__(self, parent = None):
  10. super(DmLabel, self).__init__(parent)
  11. def majTexte(self, txt):
  12. self.clear()
  13. self.setText(QString.fromUtf8(txt))
  14. def chargerImage(self, chemin):
  15. self.clear()
  16. if len(chemin) > 0:
  17. pix = QPixmap(QString.fromUtf8(chemin))
  18. pix = pix.scaled(self.width(), self.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
  19. else:
  20. pix = QPixmap()
  21. self.setPixmap(pix)
  22. def texte(self):
  23. return str(self.text().toUtf8())
  24. class DmLabelChoixImage(DmLabel):
  25. """surcharge de DmLabel,
  26. affiche une fenetre de selection de fichier, recupere une image,
  27. et l'affiche."""
  28. def __init__(self, parent = None):
  29. super(DmLabelChoixImage, self).__init__(parent)
  30. self.setStyleSheet("QLabel { padding: 3px; }")
  31. self._sourceImage = ""
  32. def mousePressEvent(self, event):
  33. if event.button() == 1:
  34. self.selectionImage()
  35. def selectionImage(self):
  36. fichier = QFileDialog.getOpenFileName(self,
  37. "Selectionnez une image",
  38. "\\img",
  39. "Images (*.png *.jpg)")
  40. if len(fichier) > 0:
  41. pix = QPixmap(fichier)
  42. if not pix.isNull():
  43. self._sourceImage = fichier
  44. self.clear()
  45. pix = pix.scaled(self.width(), self.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
  46. self.setPixmap(pix)
  47. self.emit(SIGNAL("imageModifiee()"))
  48. else:
  49. dial = QMessageBox(self)
  50. dial.setText("Format non reconnu")
  51. dial.setWindowTitle("Erreur")
  52. dial.setStandardButtons(QMessageBox.Ok)
  53. dial.exec_()
  54. def image(self):
  55. """retourne le chemin de l'image chargee"""
  56. return self._sourceImage
  57. def chargerImage(self, chemin):
  58. self._sourceImage = chemin
  59. super(DmLabelChoixImage, self).chargerImage(chemin)
  60. class DmTextEdit(QTextEdit):
  61. def __init__(self, parent = None):
  62. super(DmTextEdit, self).__init__(parent)
  63. def majTexte(self, txt):
  64. self.clear()
  65. self.setText(QString.fromUtf8(str(txt)))
  66. def texte(self):
  67. return str(self.text().toUtf8())
  68. class DmLineEdit(QLineEdit):
  69. def __init__(self, parent = None):
  70. super(DmLineEdit, self).__init__(parent)
  71. def majTexte(self, txt):
  72. self.clear()
  73. self.setText(QString.fromUtf8(str(txt)))
  74. def texte(self):
  75. return str(self.text().toUtf8())
  76. class DmGraphicsView(QGraphicsView):
  77. """surcharge de QGraphicsView"""
  78. def __init__(self, parent = None):
  79. super(DmGraphicsView, self).__init__(parent)
  80. self.nbZoomActuel = 0
  81. def resizeEvent(self, event):
  82. super(DmGraphicsView, self).resizeEvent(event)
  83. self.emit(SIGNAL("resizeEvent()"))
  84. def wheelEvent(self, event):
  85. """zoom/dezoom avec la molette de la souris"""
  86. #on zoom/dezoom et on recentre sur la position du curseur
  87. zoom = 1.00
  88. if event.delta() > 0:
  89. if self.nbZoomActuel <= 10:
  90. self.nbZoomActuel += 1
  91. zoom = 1.25
  92. elif event.delta() < 0:
  93. if self.nbZoomActuel >= -10:
  94. zoom = 0.8
  95. self.nbZoomActuel -= 1
  96. if zoom != 0.00:
  97. self.scale(zoom, zoom)
  98. self.centerOn(self.mapToScene(event.pos()))
  99. event.accept() #pour considerer l'evenement comme resolu, sans ca les barres de defilement reagissent aussi
  100. class DmComboBox(QComboBox):
  101. """surcharge de QComboBox"""
  102. def __init__(self, parent = None):
  103. super(DmComboBox, self).__init__(parent)
  104. def allerA(self, donnee):
  105. """cherche la donnee demandee et affiche la ligne"""
  106. index = self.findData(QVariant(donnee))
  107. self.setCurrentIndex(index)
  108. def valeurActuelle(self):
  109. """renvoie sous forme de QVariant la valeur en cours"""
  110. return self.itemData(self.currentIndex())
  111. class DmTableWidget(QTableWidget):
  112. """surcharge de QTableWidget"""
  113. def __init__(self, parent = None):
  114. super(DmTableWidget, self).__init__(parent)
  115. self.majEnCours = False
  116. def vider(self):
  117. """supprime toutes les lignes"""
  118. self.majEnCours = True
  119. while self.rowCount() > 0:
  120. self.removeRow(0)
  121. self.majEnCours = False
  122. def nouvelleLigneFin(self):
  123. """ajoute une ligne en derniere position"""
  124. pos = self.rowCount()
  125. self.insertRow(pos)
  126. return pos
  127. def lignes(self):
  128. """retourne la liste des index de lignes de la table"""
  129. return range(0, self.rowCount())
  130. def colonnes(self):
  131. """retourne la liste des index de lignes de la table"""
  132. return range(0, self.columnCount())
  133. def masquerColonneId(self):
  134. """masque la colonne en position 0 qui contient les identifiants"""
  135. self.setColumnWidth(0, 0)
  136. def majData(self, ligne, colonne, var):
  137. """met a jour la cellule avec une donnee de type QVariant"""
  138. var = QVariant(var)
  139. self.item(ligne, colonne).setData(0, var)
  140. return True
  141. def majTexte(ligne, colonne, texte):
  142. """met a jour la cellule avec du texte"""
  143. self.item(ligne, colonne).setText(QString.fromUtf8(str(texte)))
  144. return True
  145. def majEnt(ligne, colonne, valeur):
  146. """met a jour la cellule avec une valeur numerique entiere
  147. si valeur ne peut etre converti en numerique, on retourne Faux"""
  148. retour = False
  149. try:
  150. entier = QVariant(long(valeur))
  151. self.item(ligne, colonne).setData(0, entier)
  152. retour = True
  153. except:
  154. pass
  155. return retour
  156. def chercherLigne(self, colonne, valeur):
  157. """cherche la valeur dans la colonne demandee
  158. renvoie la ligne correspondante """
  159. ligne = None
  160. for i in range(0, self.rowCount()):
  161. if str(self.item(i, colonne).text().toUtf8()) == str(valeur):
  162. ligne = i
  163. break
  164. return ligne
  165. def majLigne(self, ligne, dico, flags = []):
  166. """rempli la ligne avec les donnees trouvees dans le dictionnaire"""
  167. for colonne in range(0, self.columnCount()):
  168. nomChamp = ""
  169. item = self.horizontalHeaderItem(colonne)
  170. if item:
  171. nomChamp = str(item.text())
  172. if nomChamp in dico:
  173. item = QTableWidgetItem()
  174. for f in flags:
  175. item.setFlag(f)
  176. var = QVariant(dico[nomChamp])
  177. item.setData(0, var)
  178. self.setItem(ligne, colonne, item)
  179. def texte(self, ligne, colonne):
  180. return str(self.item(ligne, colonne).text().toUtf8())
  181. def data(self, ligne, colonne):
  182. retour = None
  183. item = self.item(ligne, colonne)
  184. if item:
  185. retour = item.data(0)
  186. return retour
  187. def ligneSelectionnee(self):
  188. """renvoie la ligne selectionnee (la premiere si plusieurs le sont)"""
  189. retour = None
  190. if self.columnCount() > 0:
  191. for i in range(0, self.rowCount()):
  192. if self.item(i,0).isSelected():
  193. retour = i
  194. break
  195. return retour
  196. class DmTableBiblio(DmTableWidget):
  197. """table utilisee pour afficher les bibliotheques d'objets:
  198. terrains, decors, creatures"""
  199. def __init__(self, parent = None):
  200. super(DmTableBiblio, self).__init__(parent)
  201. self.fichier = ""
  202. self.masquerColonneId()
  203. def defFichier(self, fichier):
  204. """definit le fichier de sauvegarde qui la source des donnees de la table"""
  205. self.fichier = fichier
  206. def initAffichage(self):
  207. """fait les differents reglages relatifs a l'apparence"""
  208. self.setColumnWidth(0, 0)
  209. self.setIconSize(QSize(30,20))
  210. self.horizontalHeader().setStretchLastSection(True)
  211. def remplir(self):
  212. """remplit la table avec les donnees contenues dans le dictionnaire de la savuvegarde"""
  213. dico = afficheSvg(self.fichier)
  214. self.majEnCours = True
  215. self.setSortingEnabled(False)
  216. index = 0
  217. for elt in dico:
  218. objet = dico[elt]
  219. self.insertRow(int(index))
  220. #code de l'objet
  221. self.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(elt)))
  222. #icone et nom
  223. icon = QIcon(objet.icone())
  224. item = QTableWidgetItem(icon,QString.fromUtf8(objet.nom))
  225. self.setItem(int(index),1,item)
  226. index += 1
  227. self.sizeHintForColumn(1)
  228. self.setSortingEnabled(True)
  229. self.sortItems(1)
  230. self.majEnCours = False
  231. def maj(self):
  232. self.vider()
  233. self.remplir()
  234. def actuel(self):
  235. """renvoie l'objet actuellement selectionne"""
  236. objet = None
  237. index = self.item(self.currentRow(), 0)
  238. if index > 0:
  239. objet = charger(self.fichier, str(index.text().toUtf8()))
  240. return objet
  241. class DmTableAttributsPi(DmTableWidget):
  242. """table utilisee pour afficher les attributs d'un pion dans le panneau Pi"""
  243. def __init__(self, parent = None):
  244. super(DmTableBiblio, self).__init__(parent)
  245. self.fichier = ""
  246. self.masquerColonneId()
  247. def defFichier(self, fichier):
  248. """definit le fichier de sauvegarde qui la source des donnees de la table"""
  249. self.fichier = fichier
  250. def initAffichage(self):
  251. """fait les differents reglages relatifs a l'apparence"""
  252. self.setColumnWidth(0, 0)
  253. self.setIconSize(QSize(30,20))
  254. self.horizontalHeader().setStretchLastSection(True)
  255. def remplir(self):
  256. """remplit la table avec les donnees contenues dans le dictionnaire de la savuvegarde"""
  257. dico = afficheSvg(self.fichier)
  258. self.majEnCours = True
  259. self.setSortingEnabled(False)
  260. index = 0
  261. for elt in dico:
  262. objet = dico[elt]
  263. self.insertRow(int(index))
  264. #code de l'objet
  265. self.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(elt)))
  266. #icone et nom
  267. icon = QIcon("img\\"+objet.icone())
  268. item = QTableWidgetItem(icon,QString.fromUtf8(objet.nom))
  269. self.setItem(int(index),1,item)
  270. index += 1
  271. self.sizeHintForColumn(1)
  272. self.setSortingEnabled(True)
  273. self.sortItems(1)
  274. self.majEnCours = False
  275. def maj(self):
  276. self.vider()
  277. self.remplir()
  278. def actuel(self):
  279. """renvoie l'objet actuellement selectionne"""
  280. objet = None
  281. index = self.item(self.currentRow(), 0)
  282. if index > 0:
  283. objet = charger(self.fichier, str(index.text().toUtf8()))
  284. return objet
  285. class DmTableMenu(QTableWidget):
  286. """table utilisee comme barre d'onglets verticale"""
  287. def __init__(self, parent = None):
  288. super(DmTableMenu, self).__init__(parent)
  289. def setItem(self, ligne, colonne, item):
  290. super(DmTableMenu, self).setItem(ligne, colonne, item)
  291. if ligne == 0:
  292. self.setItemSelected(item, True)
  293. class DmFrameInf_Combattant(QGroupBox):
  294. """frame d'information (combattant)"""
  295. def __init__(self, parent = None):
  296. super(DmFrameInf_Combattant, self).__init__(parent)
  297. def maj(self, combattant):
  298. self.setVisible((combattant != None))
  299. if combattant:
  300. self.findChild(DmLabel, "inf_pionNom").majTexte(combattant.nom)
  301. self.findChild(DmLabel, "inf_pionImage").chargerImage("img\\"+combattant.img.nomFichier)
  302. self.findChild(DmLabel, "inf_pionEffet").setVisible(False)
  303. class DmFrameInf_Decor(QGroupBox):
  304. """frame d'information (decor)"""
  305. def __init__(self, parent = None):
  306. super(DmFrameInf_Decor, self).__init__(parent)
  307. def maj(self, decor):
  308. self.setVisible((decor != None))
  309. if decor:
  310. self.findChild(DmLabel, "inf_decorNom").majTexte(decor.nom)
  311. self.findChild(DmLabel, "inf_decorImage").chargerImage("img\\"+decor.img.nomFichier)
  312. class DmFrameInf_Case(QGroupBox):
  313. """frame d'information (case)"""
  314. def __init__(self, parent = None):
  315. super(DmFrameInf_Case, self).__init__(parent)
  316. def maj(self, case):
  317. self.setVisible((case != None))
  318. if len(case.terrain.nom) > 0:
  319. self.findChild(DmLabel, "inf_caseTerrain").majTexte(case.terrain.nom)
  320. else:
  321. self.findChild(DmLabel, "inf_caseTerrain").majTexte("Case")
  322. self.findChild(DmLabel, "inf_caseCoord").majTexte("X: {} Y: {}".format(case.x, case.y))
  323. self.findChild(DmLabel, "inf_caseAltitude").majTexte("Alt.: {}".format(case.altitude))
  324. if case.effetActif != "":
  325. self.findChild(DmLabel, "inf_caseEffet").chargerImage("img\\"+case.imgEffet[case.effetActif])
  326. else:
  327. self.findChild(DmLabel, "inf_caseEffet").clear()
  328. class DmFrame(QFrame):
  329. """surcharge de QFrame"""
  330. def __init__(self, parent = None):
  331. super(DmFrame, self).__init__(parent)
  332. def widget(self, nom):
  333. """recupere la ref au widget enfant / attention, pas ideal en terme de perf"""
  334. widget = None
  335. for widget in self.children():
  336. if widget.objectName() == nom:
  337. print nom, widget.__class__.__name__
  338. retour = widget
  339. break
  340. return widget
  341. class DmEdcPanneauAttaque(DmFrame):
  342. """frame contenant les donnees de l'attaque actuellement
  343. affichee lors de la creation de combattant"""
  344. def __init__(self, fenetre, parent = None):
  345. super(DmEdcPanneauAttaque, self).__init__(parent)
  346. ## def widget(self, nom):
  347. ## """surcharge de la fonction de DmFrame"""
  348. ## return super(DmEdcPanneauAttaque, self).widget(nom)
  349. def maj(self, attaque = None):
  350. """met a jour le contenu avec les donnees de l'attaque en param"""
  351. if attaque:
  352. ## self.widget("edc_attaque_type").setCurrentIndex(0)
  353. self.widget("edc_attaque_nom").majTexte(attaque.nom())
  354. self.widget("edc_attaque_portee").setValue(attaque.portee())
  355. self.widget("edc_attaque_rayon").setValue(attaque.rayon())
  356. ## self.widget("edc_attaque_attributs").vider()
  357. self.widget("edc_attaque_notes").majTexte(attaque.notes())
  358. else:
  359. self.reinit()
  360. self.setEnabled(False)
  361. def reinit(self):
  362. ## self.widget("edc_attaque_type").setCurrentIndex(0)
  363. self.widget("edc_attaque_nom").majTexte("")
  364. self.widget("edc_attaque_portee").setValue(1)
  365. self.widget("edc_attaque_rayon").setValue(1)
  366. self.widget("edc_attaque_rayon").setVisible(False)
  367. ## self.widget("edc_attaque_attributs").vider()
  368. self.widget("edc_attaque_notes").majTexte("")