403f3bc9f91551395bf09fada0fbb997d8da052a
1 # -*- coding: utf-8 -*-
3 Écran de sélection de l'instrument
10 from minwii
.eventutils
import event_handler
, EventDispatcher
, EventHandlerMixin
11 from minwii
.config
import FRAMERATE
12 from minwii
.config
import INSTRUMENTS
13 from minwii
.globals import BACKGROUND_LAYER
14 from minwii
.globals import FOREGROUND_LAYER
15 from minwii
.globals import CURSOR_LAYER
16 from minwii
.globals import hls_to_rgba_8bits
17 from cursors
import WarpingCursor
20 class InstrumentSelector(pygame
.sprite
.LayeredDirty
, EventHandlerMixin
) :
24 instruments
= INSTRUMENTS
27 super(InstrumentSelector
, self
).__init
__()
31 self
._inflatedTile
= None
32 self
.selectedInstrument
= None
34 def _initTiles(self
) :
35 screen
= pygame
.display
.get_surface()
36 tileWidth
= int(round(float(screen
.get_width()) / self
.cols
))
37 tileHeight
= int(round(float(screen
.get_height()) / self
.rows
))
40 instrus
= list(self
.instruments
[:])
41 for y
in range(self
.cols
) :
42 for x
in range(self
.rows
) :
43 upperLeftCorner
= (x
* tileWidth
, y
* tileHeight
)
44 rect
= pygame
.Rect(upperLeftCorner
, (tileWidth
, tileHeight
))
45 # !!! s'il y avait plus de 3x3 tuiles !!!, il faudrait alors
46 # changer le tuple (x,y) qui concerne le point d'application de l'homotétie.
47 # Cf. InstrumentTile.inflate
48 tile
= InstrumentTile(instrus
.pop(0), self
, rect
, (x
,y
))
49 self
.add(tile
, layer
=BACKGROUND_LAYER
)
50 self
.tiles
.append(tile
)
52 def _initCursor(self
) :
53 self
.cursor
= WarpingCursor(blinkMode
=True)
54 self
.add(self
.cursor
, layer
=CURSOR_LAYER
)
59 clock
= pygame
.time
.Clock()
61 pygame
.mouse
.set_visible(False)
63 EventDispatcher
.dispatchEvents()
64 dirty
= self
.draw(pygame
.display
.get_surface())
65 pygame
.display
.update(dirty
)
70 pygame
.mouse
.set_visible(True)
71 self
.cursor
._stopBlink
()
73 @event_handler(pygame
.KEYDOWN
)
74 def handleKeyDown(self
, event
) :
75 if event
.key
== pygame
.K_q
or \
76 event
.unicode == u
'q' or \
80 @event_handler(pygame
.MOUSEMOTION
)
81 def onMouseMove(self
, event
) :
82 for tile
in reversed(self
.sprites()[:-1]) :
83 if tile
.rect
.collidepoint(*event
.pos
) :
84 self
.raiseTileOver(tile
)
87 def raiseTileOver(self
, tile
) :
88 if not tile
.inflated
:
89 self
.change_layer(tile
, FOREGROUND_LAYER
)
90 tile
.inflate(tile
.coords
)
92 if self
._inflatedTile
:
93 self
._inflatedTile
.deflate()
94 self
.change_layer(self
._inflatedTile
, BACKGROUND_LAYER
)
96 self
._inflatedTile
= tile
98 @event_handler(pygame
.MOUSEBUTTONDOWN
)
99 def selectInstrument(self
, event
) :
100 for tile
in reversed(self
.sprites()[:-1]) :
101 if tile
.rect
.collidepoint(*event
.pos
) :
102 self
.selectedInstrument
= tile
.instrumentDescription
108 class InstrumentTile(pygame
.sprite
.DirtySprite
) :
111 def _get_instrument_image(name
) :
112 imagePath
= os
.path
.abspath(__file__
).split(os
.path
.sep
)[:-1]
113 imagePath
.extend(['data', 'instruments'])
114 name
, ext
= os
.path
.splitext(name
)
115 imagePath
.append('%s%s' % (name
, ext
or '.jpg'))
116 return os
.path
.sep
.join(imagePath
)
121 def __init__(self
, instrumentDescription
, group
, rect
, coords
) :
122 pygame
.sprite
.DirtySprite
.__init
__(self
, group
)
123 self
.inflated
= False
124 self
.instrumentDescription
= instrumentDescription
126 self
._baseRect
= rect
.copy()
128 imagePath
= InstrumentTile
._get
_instrument
_image
(instrumentDescription
['name'])
129 self
._img
= pygame
.image
.load(imagePath
)
134 innerWidth
, innerHeight
= [l
-self
.BORDER
*2 for l
in self
.rect
.size
]
135 innerSize
= innerWidth
, innerHeight
137 border
= pygame
.Surface(self
.rect
.size
)
138 border
.fill((0xdd,0xdd,0xdd,255))
140 bg
= pygame
.Surface(innerSize
)
141 bg
.fill((255,255,255,255))
142 bgRect
= pygame
.Rect((self
.BORDER
, self
.BORDER
), innerSize
)
145 iWidth
, iHeight
= img
.get_size()
146 imgRatio
= float(iWidth
) / iHeight
150 ih
= int(round(innerWidth
/ imgRatio
))
154 iw
= int(round(innerHeight
* imgRatio
))
156 imgPosition
= ((innerWidth
- iw
) / 2, (innerHeight
- ih
) / 2)
157 imgRect
= pygame
.Rect(imgPosition
, (iw
, ih
))
158 img
= pygame
.transform
.smoothscale(img
, (iw
, ih
))
160 bg
.blit(img
, imgRect
)
161 border
.blit(bg
, bgRect
)
165 def inflate(self
, refPoint
) :
168 for name
in REF_POINTS
[refPoint
] :
169 keep
[name
] = getattr(self
.rect
, name
)
171 self
.rect
.inflate_ip(*[l
*self
.INFLATE_ZOOM
for l
in self
.rect
.size
])
173 for k
, v
in keep
.items() :
174 setattr(self
.rect
, k
, v
)
181 self
.inflated
= False
182 self
.rect
= self
._baseRect
.copy()
189 (0, 0) : ['top', 'left'],
191 (2, 0) : ['top', 'right'],
197 (0, 2) : ['bottom', 'left'],
199 (2, 2) : ['bottom', 'right']