Coverage for Deck.py: 81%

57 statements  

« prev     ^ index     » next       coverage.py v7.6.3, created at 2024-10-15 19:33 +0000

1# Deck.py 

2# -*- coding: utf-8 

3# PokerStats, an online poker statistics tracking software for Linux 

4# Copyright (C) 2007-2011 Mika Boström <bostik@iki.fi> 

5# 

6# This program is free software: you can redistribute it and/or modify 

7# it under the terms of the GNU General Public License as published by 

8# the Free Software Foundation, version 3 of the License. 

9# 

10"""Deck.py 

11 

12Helper class for mucked card display. Loads specified deck from SVG 

13images and returns it as a dict of pixbufs. 

14""" 

15 

16import os 

17 

18from PyQt5.QtCore import QRectF 

19from PyQt5.QtGui import QPixmap, QPainter 

20from PyQt5.QtSvg import QSvgRenderer 

21 

22 

23class Deck(object): 

24 def __init__(self, config, deck_type="simple", card_back="back04", width=30, height=42): 

25 self.__width = width 

26 self.__height = height 

27 self.__cardspath = os.path.join(config.graphics_path, "cards", deck_type).replace("\\", "/") 

28 self.__backfile = os.path.join(config.graphics_path, "cards", "backs", f"{card_back}.svg").replace("\\", "/") 

29 self.__cards = dict({"s": None, "h": None, "d": None, "c": None}) 

30 self.__card_back = None 

31 self.__rank_vals = {} 

32 

33 for sk in self.__cards: 

34 self.__load_suit(sk) 

35 

36 self.__card_back = self.__load_svg(self.__backfile) 

37 

38 self.__create_rank_lookups() 

39 

40 def __create_rank_lookups(self): 

41 self.__rank_vals = { 

42 "2": 2, 

43 "3": 3, 

44 "4": 4, 

45 "5": 5, 

46 "6": 6, 

47 "7": 7, 

48 "8": 8, 

49 "9": 9, 

50 "T": 10, 

51 "J": 11, 

52 "Q": 12, 

53 "K": 13, 

54 "A": 14, 

55 } 

56 

57 def __load_svg(self, path): 

58 renderer = QSvgRenderer(path) 

59 pm = QPixmap(self.__width, self.__height) 

60 painter = QPainter(pm) 

61 renderer.render(painter, QRectF(pm.rect())) 

62 return pm 

63 

64 def __load_suit(self, suit_key): 

65 sd = {} 

66 _p = self.__cardspath 

67 sd[2] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "2" + ".svg")).replace("\\", "/")) 

68 sd[3] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "3" + ".svg")).replace("\\", "/")) 

69 sd[4] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "4" + ".svg")).replace("\\", "/")) 

70 sd[5] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "5" + ".svg")).replace("\\", "/")) 

71 sd[6] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "6" + ".svg")).replace("\\", "/")) 

72 sd[7] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "7" + ".svg")).replace("\\", "/")) 

73 sd[8] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "8" + ".svg")).replace("\\", "/")) 

74 sd[9] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "9" + ".svg")).replace("\\", "/")) 

75 sd[10] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "10" + ".svg")).replace("\\", "/")) 

76 sd[11] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "j" + ".svg")).replace("\\", "/")) 

77 sd[12] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "q" + ".svg")).replace("\\", "/")) 

78 sd[13] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "k" + ".svg")).replace("\\", "/")) 

79 sd[14] = self.__load_svg(os.path.join(_p, (suit_key + "_" + "a" + ".svg")).replace("\\", "/")) 

80 self.__cards[suit_key] = sd 

81 

82 def card(self, suit=None, rank=0): 

83 return self.__cards[suit][rank] 

84 

85 def back(self): 

86 return self.__card_back 

87 

88 def rank(self, token=None): 

89 key = token.upper() 

90 return self.__rank_vals[key] 

91 

92 def get_all_card_images(self): 

93 # returns a 4x13-element dictionary of every card image + 

94 # index-0 = card back each element is a QPixmap 

95 card_images = {} 

96 

97 for suit in ("s", "h", "d", "c"): 

98 card_images[suit] = {} 

99 for rank in (14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2): 

100 card_images[suit][rank] = self.card(suit, rank) 

101 

102 # This is a nice trick. We put the card back image behind key 0, 

103 # which allows the old code to work. A dict[0] looks like first 

104 # index of an array. 

105 card_images[0] = self.back() 

106 return card_images