dm.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  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. try:
  7. from lib.outilsSvg import *
  8. except:
  9. try:
  10. from outilsSvg import *
  11. except:
  12. print "dm: impossible de charger outilsSvg"
  13. try:
  14. import lib.regles as regles
  15. except:
  16. try:
  17. import regles as regles
  18. except:
  19. print "dm: impossible de charger regles"
  20. try:
  21. from lib.Actions import *
  22. except:
  23. try:
  24. from Actions import *
  25. except:
  26. print "dm: impossible de charger Actions"
  27. class Biblio():
  28. """cette classe fournit une liste spreciale"""
  29. def __init__(self):
  30. self.dico = {}
  31. self.ordre = []
  32. def trierPar(self, param):
  33. """trie en fonction du parametre des objets"""
  34. ordre = []
  35. return ordre
  36. def elt(self, index):
  37. return self.dict[index]
  38. class DmLabel(QLabel):
  39. """surcharge de QLabel"""
  40. def __init__(self, parent = None):
  41. super(DmLabel, self).__init__(parent)
  42. self._image = None
  43. def majTexte(self, txt):
  44. self.clear()
  45. self.setText(QString.fromUtf8(txt))
  46. def chargerImage(self, img = None):
  47. """prend une RImage en parametre"""
  48. self.clear()
  49. if img:
  50. self._image = img
  51. pix = img.pix(self.width(), self.height())
  52. else:
  53. pix = QPixmap()
  54. self.setPixmap(pix)
  55. def texte(self):
  56. return str(self.text().toUtf8())
  57. def image(self):
  58. return self._image
  59. def mousePressEvent(self, event):
  60. if event.button() == 1:
  61. self.emit(SIGNAL("clicked()"))
  62. def mouseDoubleClickEvent(self, event):
  63. if event.button() == 1:
  64. self.emit(SIGNAL("doubleClicked()"))
  65. class DmTextEdit(QTextEdit):
  66. def __init__(self, parent = None):
  67. super(DmTextEdit, self).__init__(parent)
  68. def majTexte(self, txt):
  69. self.clear()
  70. self.setText(QString.fromUtf8(str(txt)))
  71. def texte(self):
  72. return str(self.toPlainText().toUtf8())
  73. class DmLineEdit(QLineEdit):
  74. def __init__(self, parent = None):
  75. super(DmLineEdit, self).__init__(parent)
  76. def majTexte(self, txt):
  77. self.clear()
  78. self.setText(QString.fromUtf8(str(txt)))
  79. def texte(self):
  80. return str(self.text().toUtf8())
  81. class DmGraphicsView(QGraphicsView):
  82. """surcharge de QGraphicsView"""
  83. def __init__(self, parent = None):
  84. super(DmGraphicsView, self).__init__(parent)
  85. self.nbZoomActuel = 0
  86. def resizeEvent(self, event):
  87. super(DmGraphicsView, self).resizeEvent(event)
  88. self.emit(SIGNAL("resizeEvent()"))
  89. def wheelEvent(self, event):
  90. """zoom/dezoom avec la molette de la souris"""
  91. #on zoom/dezoom et on recentre sur la position du curseur
  92. zoom = 1.00
  93. if event.delta() > 0:
  94. if self.nbZoomActuel <= 10:
  95. self.nbZoomActuel += 1
  96. zoom = 1.25
  97. elif event.delta() < 0:
  98. if self.nbZoomActuel >= -10:
  99. zoom = 0.8
  100. self.nbZoomActuel -= 1
  101. if zoom != 0.00:
  102. self.scale(zoom, zoom)
  103. self.centerOn(self.mapToScene(event.pos()))
  104. self.emit(SIGNAL("zoomChange(int)"), self.nbZoomActuel)
  105. event.accept() #pour considerer l'evenement comme resolu, sans ca les barres de defilement reagissent aussi
  106. class DmComboBox(QComboBox):
  107. """surcharge de QComboBox"""
  108. def __init__(self, parent = None):
  109. super(DmComboBox, self).__init__(parent)
  110. def allerA(self, donnee):
  111. """cherche la donnee demandee et affiche la ligne"""
  112. index = self.findData(QVariant(donnee))
  113. self.setCurrentIndex(index)
  114. def valeurActuelle(self):
  115. """renvoie sous forme de QVariant la valeur en cours"""
  116. return self.itemData(self.currentIndex())
  117. class DmSpinBox(QSpinBox):
  118. """surcharge de QSpinBox"""
  119. def __init__(self, parent = None):
  120. super(DmSpinBox, self).__init__(parent)
  121. def focusInEvent(self, event):
  122. super(DmSpinBox, self).focusInEvent(event)
  123. self.selectAll()
  124. class DmTabInventaire(QTabWidget):
  125. """surcharge de QTabWidget stylisee et
  126. utilisee pour filtrer les types d'objets affiches"""
  127. def __init__(self, parent = None):
  128. super(DmTabInventaire, self).__init__(parent)
  129. ## self.setStyleSheet(QString.fromUtf8("""QTabWidget::tab-bar { alignment: right;
  130. ## background: rgba(0,248,248,200) }"""))
  131. self.setStyleSheet(QString.fromUtf8("""
  132. QTabWidget::pane { border-top: 2px solid #C2C7CB; }
  133. QTabWidget::tab-bar { alignment: right; }
  134. QTabBar::tab {
  135. background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
  136. stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
  137. stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
  138. border: 2px solid #C4C4C3;
  139. border-bottom-color: #C2C7CB; border-top-left-radius: 4px;
  140. border-top-right-radius: 8px;
  141. border-top-left-radius: 8px;
  142. padding-left: 15px; }
  143. QTabBar::tab:selected, QTabBar::tab:hover {
  144. background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
  145. stop: 0 #fafafa, stop: 0.4 #f4f4f4,
  146. stop: 0.5 #e7e7e7, stop: 1.0 #fafafa); }
  147. QTabBar::tab:selected { border-color: #9B9B9B;
  148. border-bottom-color: #C2C7CB; }
  149. """))
  150. class DmTableWidget(QTableWidget):
  151. """surcharge de QTableWidget"""
  152. def __init__(self, parent = None):
  153. super(DmTableWidget, self).__init__(parent)
  154. self.majEnCours = False
  155. def vider(self):
  156. """supprime toutes les lignes"""
  157. self.majEnCours = True
  158. while self.rowCount() > 0:
  159. self.removeRow(0)
  160. self.majEnCours = False
  161. def nouvelleLigneFin(self):
  162. """ajoute une ligne en derniere position"""
  163. pos = self.rowCount()
  164. self.insertRow(pos)
  165. return pos
  166. def lignes(self):
  167. """retourne la liste des index de lignes de la table"""
  168. return range(0, self.rowCount())
  169. def colonnes(self):
  170. """retourne la liste des index de lignes de la table"""
  171. return range(0, self.columnCount())
  172. def masquerColonneId(self):
  173. """masque la colonne en position 0 qui contient les identifiants"""
  174. self.setColumnWidth(0, 0)
  175. def majData(self, ligne, colonne, var):
  176. """met a jour la cellule avec une donnee de type QVariant"""
  177. var = QVariant(var)
  178. if not self.item(ligne, colonne):
  179. item = QTableWidgetItem()
  180. item.setData(0, var)
  181. self.setItem(ligne, colonne, item)
  182. else:
  183. self.item(ligne, colonne).setData(0, var)
  184. return True
  185. def majTexte(self, ligne, colonne, texte):
  186. """met a jour la cellule avec du texte"""
  187. if not self.item(ligne, colonne):
  188. self.setItem(ligne, colonne, QTableWidgetItem(QString.fromUtf8(str(texte))))
  189. else:
  190. self.item(ligne, colonne).setText(QString.fromUtf8(str(texte)))
  191. return True
  192. def majEnt(self, ligne, colonne, valeur):
  193. """met a jour la cellule avec une valeur numerique entiere
  194. si valeur ne peut etre converti en numerique, on retourne Faux"""
  195. retour = False
  196. try:
  197. entier = QVariant(long(valeur))
  198. self.item(ligne, colonne).setData(0, entier)
  199. retour = True
  200. except:
  201. pass
  202. return retour
  203. def chercherLigne(self, colonne, valeur):
  204. """cherche la valeur dans la colonne demandee
  205. renvoie la ligne correspondante """
  206. ligne = None
  207. for i in range(0, self.rowCount()):
  208. if str(self.item(i, colonne).text().toUtf8()) == str(valeur):
  209. ligne = i
  210. break
  211. return ligne
  212. def majLigne(self, ligne, dico, flags = []):
  213. """rempli la ligne avec les donnees trouvees dans le dictionnaire"""
  214. for colonne in range(0, self.columnCount()):
  215. nomChamp = ""
  216. item = self.horizontalHeaderItem(colonne)
  217. if item:
  218. nomChamp = str(item.text())
  219. if nomChamp in dico:
  220. item = QTableWidgetItem()
  221. for f in flags:
  222. item.setFlag(f)
  223. var = QVariant(dico[nomChamp])
  224. item.setData(0, var)
  225. self.setItem(ligne, colonne, item)
  226. def texte(self, ligne, colonne):
  227. return str(self.item(ligne, colonne).text().toUtf8())
  228. def data(self, ligne, colonne):
  229. retour = None
  230. item = self.item(ligne, colonne)
  231. if item:
  232. retour = item.data(0)
  233. return retour
  234. def ligneSelectionnee(self):
  235. """renvoie la ligne selectionnee (la premiere si plusieurs le sont)"""
  236. return self.currentRow()
  237. def selectionner(self, ligne, colonne):
  238. self.setCurrentCell(ligne, colonne, QItemSelectionModel.Select)
  239. class DmTableBiblio(DmTableWidget):
  240. """table utilisee pour afficher les bibliotheques d'objets:
  241. terrains, decors, creatures"""
  242. def __init__(self, parent = None):
  243. super(DmTableBiblio, self).__init__(parent)
  244. self.fichier = ""
  245. self.masquerColonneId()
  246. def defFichier(self, fichier):
  247. """definit le fichier de sauvegarde qui la source des donnees de la table"""
  248. self.fichier = fichier
  249. def initAffichage(self):
  250. """fait les differents reglages relatifs a l'apparence"""
  251. self.setColumnWidth(0, 0)
  252. self.setIconSize(QSize(30,20))
  253. self.horizontalHeader().setStretchLastSection(True)
  254. def remplir(self):
  255. """remplit la table avec les donnees contenues dans le dictionnaire de la savuvegarde"""
  256. dico = afficheSvg(self.fichier)
  257. self.majEnCours = True
  258. self.setSortingEnabled(False)
  259. index = 0
  260. for elt in dico:
  261. objet = dico[elt]
  262. self.insertRow(int(index))
  263. #code de l'objet
  264. self.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(elt)))
  265. #icone et nom
  266. icon = QIcon(objet.icone().chemin())
  267. item = QTableWidgetItem(icon, QString.fromUtf8(objet.nom))
  268. self.setItem(int(index),1,item)
  269. index += 1
  270. self.sizeHintForColumn(1)
  271. self.setSortingEnabled(True)
  272. self.sortItems(1)
  273. self.majEnCours = False
  274. def maj(self):
  275. self.vider()
  276. self.remplir()
  277. def actuel(self):
  278. """renvoie l'objet actuellement selectionne"""
  279. objet = None
  280. index = self.item(self.currentRow(), 0)
  281. if index > 0:
  282. objet = charger(self.fichier, str(index.text().toUtf8()))
  283. return objet
  284. class DmTableAttributsPi(DmTableWidget):
  285. """table utilisee pour afficher les attributs d'un pion dans le panneau Pi"""
  286. def __init__(self, parent = None):
  287. super(DmTableBiblio, self).__init__(parent)
  288. self.fichier = ""
  289. self.masquerColonneId()
  290. def defFichier(self, fichier):
  291. """definit le fichier de sauvegarde qui la source des donnees de la table"""
  292. self.fichier = fichier
  293. def initAffichage(self):
  294. """fait les differents reglages relatifs a l'apparence"""
  295. self.setColumnWidth(0, 0)
  296. self.setIconSize(QSize(30,20))
  297. self.horizontalHeader().setStretchLastSection(True)
  298. def remplir(self):
  299. """remplit la table avec les donnees contenues dans le dictionnaire de la savuvegarde"""
  300. dico = afficheSvg(self.fichier)
  301. self.majEnCours = True
  302. self.setSortingEnabled(False)
  303. index = 0
  304. for elt in dico:
  305. objet = dico[elt]
  306. self.insertRow(int(index))
  307. #code de l'objet
  308. self.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(elt)))
  309. #icone et nom
  310. icon = QIcon("img\\"+objet.icone())
  311. item = QTableWidgetItem(icon,QString.fromUtf8(objet.nom))
  312. self.setItem(int(index),1,item)
  313. index += 1
  314. self.sizeHintForColumn(1)
  315. self.setSortingEnabled(True)
  316. self.sortItems(1)
  317. self.majEnCours = False
  318. def maj(self):
  319. self.vider()
  320. self.remplir()
  321. def actuel(self):
  322. """renvoie l'objet actuellement selectionne"""
  323. objet = None
  324. index = self.item(self.currentRow(), 0)
  325. if index > 0:
  326. objet = charger(self.fichier, str(index.text().toUtf8()))
  327. return objet
  328. class DmTableInventaire(DmTableWidget):
  329. """table utilisee pour afficher l'inventaire d'un combattant"""
  330. itemExited = pyqtSignal(QTableWidgetItem)
  331. def __init__(self, parent = None):
  332. super(DmTableInventaire, self).__init__(parent)
  333. self._inventaire = []
  334. #pour la gestion des survols
  335. self.setMouseTracking(True)
  336. self._last_index = QPersistentModelIndex()
  337. self.viewport().installEventFilter(self)
  338. self.connect(self, SIGNAL("itemEntered(QTableWidgetItem*)"), self.itemSurvole)
  339. self.connect(self, SIGNAL("itemExited(QTableWidgetItem*)"), self.itemSurvoleFin)
  340. self.connect(self, SIGNAL("itemClicked(QTableWidgetItem*)"), self.itemClique)
  341. def construire(self):
  342. self.setColumnWidth(0, 20);self.setColumnWidth(1, 70)
  343. self.setColumnWidth(2, 241);self.setColumnWidth(4, 60)
  344. self.setColumnWidth(6, 20)
  345. def ajouterObjet(self, objet):
  346. ligne = self.rowCount() - 1 #avant la ligne 'ajouter'
  347. self.insertRow(ligne)
  348. self.remplirLigne(ligne, objet)
  349. self._inventaire.append(objet)
  350. def charger(self, inventaire):
  351. """charge l'inventaire en parametre"""
  352. for objet in inventaire:
  353. self.ajouterObjet(objet)
  354. def majObjet(self, ancien, nouveau):
  355. """maj la ligne correspondant a l'objet"""
  356. index = self._inventaire.index(ancien)
  357. self._inventaire[index] = nouveau
  358. self.remplirLigne(index, nouveau)
  359. def supprimerObjet(self, objet):
  360. """ajoute la ligne correspondant a l'objet"""
  361. index = self._inventaire.index(objet)
  362. self._inventaire.remove(objet)
  363. self.removeRow(index)
  364. def remplirLigne(self, ligne, objet):
  365. """remplit les cellules de la ligne avec les donnees de l'objet"""
  366. imgType = ["pieces.png", "btn_ModeCombat.png", "chimie.png", "diamant.png", "boite_outils.png"]
  367. self.creerItem(ligne, 0, "", imgType[objet.typeObjet])
  368. self.creerItem(ligne, 1, objet.quantite)
  369. self.creerItem(ligne, 2, objet.nom)
  370. self.creerItem(ligne, 3, objet.poidsTotal())
  371. self.creerItem(ligne, 4, "")
  372. def inventaire(self):
  373. """cree un inventaire a partir des donnees de la table"""
  374. return self._inventaire
  375. def itemSurvole(self, item):
  376. ligne = item.row()
  377. self.majCouleurLigne(ligne, QColor(150, 50, 50, 150))
  378. def itemSurvoleFin(self, item):
  379. ligne = item.row()
  380. self.majCouleurLigne(ligne, QColor(248, 248, 248, 150))
  381. def itemClique(self, item):
  382. ligne = item.row()
  383. self.emit(SIGNAL("objetClique(int)"), ligne)
  384. def majCouleurLigne(self, ligne, couleur):
  385. """modifie la couleur de fond des items de la lignes"""
  386. for col in self.colonnes():
  387. item = self.item(ligne, col)
  388. if item:
  389. item.setBackground(QBrush(couleur))
  390. def creerItem(self, ligne, colonne, txt, img = None):
  391. item = QTableWidgetItem()
  392. item.setFlags(Qt.NoItemFlags)
  393. item.setText(QString().fromUtf8(" {}".format(txt)))
  394. if img:
  395. pix = QPixmap("img\\{}".format(img))
  396. item.setIcon(QIcon(pix))
  397. self.setItem(ligne, colonne, item)
  398. def filtrer(self, typeObjet):
  399. """filtre l'affichage des lignes par type d'objet"""
  400. for ligne in range(0, self.rowCount() - 1):
  401. self.setRowHidden(ligne, typeObjet >= 0 and typeObjet != self._inventaire[ligne].typeObjet )
  402. def eventFilter(self, widget, event):
  403. if widget is self.viewport():
  404. index = self._last_index
  405. if event.type() == QEvent.MouseMove:
  406. index = self.indexAt(event.pos())
  407. elif event.type() == QEvent.Leave:
  408. index = QModelIndex()
  409. if index != self._last_index:
  410. row = self._last_index.row()
  411. column = self._last_index.column()
  412. item = self.item(row, column)
  413. if item is not None:
  414. self.itemExited.emit(item)
  415. self._last_index = QPersistentModelIndex(index)
  416. return QTableWidget.eventFilter(self, widget, event)
  417. class DmTableInventaireCombat(DmTableInventaire):
  418. """inventaire affiche dans le panneau de combat"""
  419. def __init__(self, parent = None):
  420. super(DmTableInventaireCombat, self).__init__(parent)
  421. class DmTableMenu(QTableWidget):
  422. """table utilisee comme barre d'onglets verticale"""
  423. def __init__(self, parent = None):
  424. super(DmTableMenu, self).__init__(parent)
  425. def setItem(self, ligne, colonne, item):
  426. super(DmTableMenu, self).setItem(ligne, colonne, item)
  427. if ligne == 0:
  428. self.setItemSelected(item, True)
  429. class DmFrameInf_Combattant(QGroupBox):
  430. """frame d'information (combattant)"""
  431. def __init__(self, parent = None):
  432. super(DmFrameInf_Combattant, self).__init__(parent)
  433. def maj(self, combattant):
  434. self.setVisible((combattant != None))
  435. if combattant:
  436. self.findChild(DmLabel, "inf_pionNom").majTexte(combattant.nom)
  437. self.findChild(DmLabel, "inf_pionImage").chargerImage(combattant.img.rimage)
  438. self.findChild(DmLabel, "inf_pionEffet").setVisible(False)
  439. class DmFrameInf_Decor(QGroupBox):
  440. """frame d'information (decor)"""
  441. def __init__(self, parent = None):
  442. super(DmFrameInf_Decor, self).__init__(parent)
  443. def maj(self, decor):
  444. self.setVisible((decor != None))
  445. if decor:
  446. self.findChild(DmLabel, "inf_decorNom").majTexte(decor.nom)
  447. self.findChild(DmLabel, "inf_decorImage").chargerImage(decor.img.rimage)
  448. class DmFrameInf_Case(QGroupBox):
  449. """frame d'information (case)"""
  450. def __init__(self, parent = None):
  451. super(DmFrameInf_Case, self).__init__(parent)
  452. def maj(self, case):
  453. self.setVisible((case != None))
  454. if len(case.terrain.nom) > 0:
  455. self.findChild(DmLabel, "inf_caseTerrain").majTexte(case.terrain.nom)
  456. else:
  457. self.findChild(DmLabel, "inf_caseTerrain").majTexte("Case")
  458. self.findChild(DmLabel, "inf_caseCoord").majTexte("X: {} Y: {}".format(case.x, case.y))
  459. self.findChild(DmLabel, "inf_caseAltitude").majTexte("Alt.: {}".format(case.altitude))
  460. if case.effetActif != "":
  461. self.findChild(DmLabel, "inf_caseEffet").chargerImage("img\\"+case.imgEffet[case.effetActif])
  462. else:
  463. self.findChild(DmLabel, "inf_caseEffet").clear()
  464. class DmFrame(QFrame):
  465. """surcharge de QFrame"""
  466. def __init__(self, parent = None):
  467. super(DmFrame, self).__init__(parent)