dm.py 18 KB

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