mode facile.
authorpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 9 Mar 2010 00:21:43 +0000 (00:21 +0000)
committerpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 9 Mar 2010 00:21:43 +0000 (00:21 +0000)
git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@85 fe552daf-6dbe-4428-90eb-1537e0879342

src/app/events.py
src/app/widgets/column.py
src/app/widgets/playingscreen.py

index ae99ad5..02444b0 100755 (executable)
@@ -2,5 +2,7 @@ from pygame.locals import USEREVENT
 TIMEOUT = USEREVENT + 1
 NOTEON = USEREVENT + 2
 NOTEOFF = USEREVENT + 3
-COLDOWN = USEREVENT + 4
-COLUP = USEREVENT + 5
+NOTEEND = USEREVENT + 4
+COLDOWN = USEREVENT + 5
+COLUP = USEREVENT + 6
+COLOVER = USEREVENT + 7
\ No newline at end of file
index 667903c..771b1e4 100755 (executable)
@@ -59,8 +59,6 @@ class Column(pygame.sprite.DirtySprite) :
         
         self.image = self.surOff
         self.rect = rect
-        #EventDispatcher.addEventListener(pygame.MOUSEBUTTONDOWN, self.onMouseDown)
-        #EventDispatcher.addEventListener(pygame.MOUSEBUTTONUP, self.onMouseUp)
     
     def update(self, state, syllabus='') :
         group = self.groups()[0]
index 571a3d9..3e1a6d7 100755 (executable)
@@ -110,23 +110,34 @@ class _PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) :
         # parce qu'il s'agit du curseur
         for col in reversed(self.sprites()[:-1]) :
             if col.rect.collidepoint(*event.pos):
-                self.raiseKeyDown(col)
+                self.raiseColDown(col)
                 break
 
     @event_handler(pygame.MOUSEBUTTONUP)
     def onMouseUp(self, event) :
         for col in reversed(self.sprites()[:-1]) :
             if col.rect.collidepoint(*event.pos) :
-                self.raiseKeyUp(col)
+                self.raiseColUp(col)
                 break
 
-    def raiseKeyDown(self, col) :
+    @event_handler(pygame.MOUSEMOTION)
+    def onMouseMove(self, event) :
+        for col in reversed(self.sprites()[:-1]) :
+            if col.rect.collidepoint(*event.pos) :
+                self.raiseColOver(col)
+                break
+
+    def raiseColDown(self, col) :
         evt = pygame.event.Event(events.COLDOWN, column=col)
         pygame.event.post(evt)
 
-    def raiseKeyUp(self, col) :
+    def raiseColUp(self, col) :
         evt = pygame.event.Event(events.COLUP, column=col)
         pygame.event.post(evt)
+    
+    def raiseColOver(self, col) :
+        evt = pygame.event.Event(events.COLOVER, column=col)
+        pygame.event.post(evt)
 
         
 class PlayingScreen(_PlayingScreenBase) :
@@ -155,14 +166,20 @@ class PlayingScreen(_PlayingScreenBase) :
 
 class SongPlayingScreen(_PlayingScreenBase) :
     
-    def __init__(self, synth, song, mode=PLAYING_MODES['NORMAL']) :
+    def __init__(self, synth, song, mode=PLAYING_MODES['EASY']) :
         super(SongPlayingScreen, self).__init__(synth, song.distinctNotes)
         self.song = song
         self.currentColumn = None
         self.noteIterator = self.song.iterNotes()
         self.displayNext()
+        if mode == PLAYING_MODES['NORMAL'] :
+            EventDispatcher.addEventListener(events.COLDOWN, self.handleColumnDown)
+            EventDispatcher.addEventListener(events.COLUP, self.handleColumnUp)
+        elif mode == PLAYING_MODES['EASY'] :
+            EventDispatcher.addEventListener(events.COLOVER, self.handleColumnOver)
+            
     
-    def displayNext(self) :
+    def displayNext(self, event=None) :
         if self.currentColumn:
             self.currentColumn.update(False)
         note, verseIndex = self.noteIterator.next()
@@ -170,17 +187,34 @@ class SongPlayingScreen(_PlayingScreenBase) :
         column = self.columns[note.midi]
         column.update(True, syllabus)
         self.currentColumn = column
+        self.currentNote = note
         self.currentNotePlayed = False
     
-    @event_handler(events.COLDOWN)
     def handleColumnDown(self, event) :
         col = event.column
         if col.state:
             self.synth.noteon(0, col.tone.midi, DEFAULT_MIDI_VELOCITY)
             self.currentNotePlayed = True
     
-    @event_handler(events.COLUP)
     def handleColumnUp(self, event) :
         if self.currentNotePlayed :
             self.synth.noteoff(0, self.currentColumn.tone.midi)
             self.displayNext()
+    
+    def handleColumnOver(self, event) :
+        col = event.column
+        if col.state and not self.currentNotePlayed :
+            self.synth.noteon(0, col.tone.midi, DEFAULT_MIDI_VELOCITY)
+            SongPlayingScreen.setNoteTimeout(int(self.currentNote.duration * 600))
+            self.currentNotePlayed = True
+    
+    @event_handler(events.NOTEEND)
+    def clearTimeOutAndDisplayNext(self, evt) : 
+        pygame.time.set_timer(evt.type, 0)
+        self.displayNext()
+    
+    @staticmethod
+    def setNoteTimeout(delay) :
+        print 'duration', delay
+        pygame.time.set_timer(events.NOTEEND, delay)
+