Ajout description midi des instruments et sélection au niveau de fluidsynth.
[minwii.git] / src / app / widgets / instrumentselector.py
index 9bafbc3..fc0f966 100755 (executable)
@@ -10,6 +10,7 @@ import pygame
 from eventutils import event_handler, EventDispatcher, EventHandlerMixin
 from cursors import WarpingCursor
 from config import FRAMERATE
 from eventutils import event_handler, EventDispatcher, EventHandlerMixin
 from cursors import WarpingCursor
 from config import FRAMERATE
+from config import  INSTRUMENTS
 from globals import BACKGROUND_LAYER
 from globals import FOREGROUND_LAYER
 from globals import CURSOR_LAYER
 from globals import BACKGROUND_LAYER
 from globals import FOREGROUND_LAYER
 from globals import CURSOR_LAYER
@@ -20,7 +21,7 @@ class InstrumentSelector(pygame.sprite.LayeredDirty, EventHandlerMixin) :
     
     rows = 3
     cols = 3
     
     rows = 3
     cols = 3
-    instruments = ['accordeon', 'celesta', 'flute', 'guitare', 'orgue', 'piano', 'tuba', 'violon', 'violoncelle']
+    instruments = INSTRUMENTS
 
     def __init__(self) :
         super(InstrumentSelector, self).__init__()
 
     def __init__(self) :
         super(InstrumentSelector, self).__init__()
@@ -35,11 +36,14 @@ class InstrumentSelector(pygame.sprite.LayeredDirty, EventHandlerMixin) :
         tileHeight = int(round(float(screen.get_height()) / self.rows))
 
         self.tiles = []
         tileHeight = int(round(float(screen.get_height()) / self.rows))
 
         self.tiles = []
-        instrus = self.instruments[:]
+        instrus = list(self.instruments[:])
         for y in range(self.cols) :
             for x in range(self.rows) :
                 upperLeftCorner = (x * tileWidth, y * tileHeight)
                 rect = pygame.Rect(upperLeftCorner, (tileWidth, tileHeight))
         for y in range(self.cols) :
             for x in range(self.rows) :
                 upperLeftCorner = (x * tileWidth, y * tileHeight)
                 rect = pygame.Rect(upperLeftCorner, (tileWidth, tileHeight))
+                # !!! s'il y avait plus de 3x3 tuiles !!!, il faudrait alors
+                # changer le tuple (x,y) qui concerne le point d'application de l'homotétie.
+                # Cf. InstrumentTile.inflate
                 tile = InstrumentTile(instrus.pop(0), self, rect, (x,y))
                 self.add(tile, layer=BACKGROUND_LAYER)
                 self.tiles.append(tile)
                 tile = InstrumentTile(instrus.pop(0), self, rect, (x,y))
                 self.add(tile, layer=BACKGROUND_LAYER)
                 self.tiles.append(tile)
@@ -71,7 +75,6 @@ class InstrumentSelector(pygame.sprite.LayeredDirty, EventHandlerMixin) :
             self.stop()
 
     @event_handler(pygame.MOUSEMOTION)
             self.stop()
 
     @event_handler(pygame.MOUSEMOTION)
-    #@event_handler(pygame.MOUSEBUTTONDOWN)
     def onMouseMove(self, event) :
         for tile in reversed(self.sprites()[:-1]) :
             if tile.rect.collidepoint(*event.pos) :
     def onMouseMove(self, event) :
         for tile in reversed(self.sprites()[:-1]) :
             if tile.rect.collidepoint(*event.pos) :
@@ -93,7 +96,7 @@ class InstrumentSelector(pygame.sprite.LayeredDirty, EventHandlerMixin) :
     def selectInstrument(self, event) :
         for tile in reversed(self.sprites()[:-1]) :
             if tile.rect.collidepoint(*event.pos) :
     def selectInstrument(self, event) :
         for tile in reversed(self.sprites()[:-1]) :
             if tile.rect.collidepoint(*event.pos) :
-                self.selectedInstrument = tile
+                self.selectedInstrument = tile.instrumentDescription
                 self.stop()
                 break
 
                 self.stop()
                 break
 
@@ -112,14 +115,14 @@ class InstrumentTile(pygame.sprite.DirtySprite) :
     BORDER = 10
     INFLATE_ZOOM = 0.4
 
     BORDER = 10
     INFLATE_ZOOM = 0.4
 
-    def __init__(self, name, group, rect, coords) :
+    def __init__(self, instrumentDescription, group, rect, coords) :
         pygame.sprite.DirtySprite.__init__(self, group)
         self.inflated = False
         pygame.sprite.DirtySprite.__init__(self, group)
         self.inflated = False
-        self.name = name
+        self.instrumentDescription = instrumentDescription
         self.rect = rect
         self._baseRect = rect.copy()
         self.coords = coords
         self.rect = rect
         self._baseRect = rect.copy()
         self.coords = coords
-        imagePath = InstrumentTile._get_instrument_image(name)
+        imagePath = InstrumentTile._get_instrument_image(instrumentDescription['name'])
         self._img = pygame.image.load(imagePath)
         self.update()
     
         self._img = pygame.image.load(imagePath)
         self.update()