X-Git-Url: https://scm.cri.minesparis.psl.eu/git/minwii.git/blobdiff_plain/e7854ed82aa375273bfbf772493739f875817061..46f3ffd7fdde386f41020171b5733e55a8e64a85:/src/minwii/widgets/column.py diff --git a/src/minwii/widgets/column.py b/src/minwii/widgets/column.py new file mode 100755 index 0000000..6577296 --- /dev/null +++ b/src/minwii/widgets/column.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +""" +bande qui compose le clavier minwii + +$Id$ +$URL$ +""" +import pygame +import gradients +from math import floor +from globals import BACKGROUND_LAYER +from globals import FOREGROUND_LAYER +from globals import hls_to_rgba_8bits +from config import OFF_LUMINANCE +from config import OFF_SATURATION +from config import ON_TOP_LUMINANCE +from config import ON_BOTTOM_LUMINANCE +from config import ON_SATURATION +from config import ON_COLUMN_OVERSIZING +from config import ON_COLUMN_ALPHA +from config import LYRICS_FONT, NOTES_FONT +from config import FONT_COLOR +import events + + +class Column(pygame.sprite.DirtySprite) : + ''' colonne utilisée pour l'affichage d'une touche du clavier de jeu. + ''' + + def __init__(self, group, index, hue, rect, tone) : + pygame.sprite.DirtySprite.__init__(self, group) + self.index = index + self.state = False + + # nom de l'intonation + self.tone = tone + toneName = NOTES_FONT.render(tone.nom, True, FONT_COLOR) + + # état off : surface unie et nom de l'intonation + sur = pygame.surface.Surface(rect.size) + rgba = hls_to_rgba_8bits(hue, OFF_LUMINANCE, OFF_SATURATION) + sur.fill(rgba) + w, h = rect.w, rect.h + tw, th, = toneName.get_size() + toneRect = pygame.Rect(((w - tw) / 2, h - th), (tw, th)) + sur.blit(toneName, toneRect) + self.surOff = sur + self.rectOff = rect + + + # état on : surface dégradée avec nom de la note avec largeur agrandie + topRgba = hls_to_rgba_8bits(hue, ON_TOP_LUMINANCE, ON_SATURATION, ON_COLUMN_ALPHA) + bottomRgba = hls_to_rgba_8bits(hue, ON_BOTTOM_LUMINANCE, ON_SATURATION, ON_COLUMN_ALPHA) + onWidth = rect.width * ON_COLUMN_OVERSIZING + onLeft = rect.centerx - onWidth / 2 + rectOn = pygame.Rect((onLeft, 0), + (onWidth, rect.height)) + self.surOn = gradients.vertical(rectOn.size, topRgba, bottomRgba) + w, h = rectOn.w, rectOn.h + toneRect = pygame.Rect(((w - tw) / 2, h - th), (tw, th)) + self.surOn.blit(toneName, toneRect) + self.rectOn = rectOn + + self.image = self.surOff + self.rect = rect + + def update(self, state, syllabus='') : + group = self.groups()[0] + if state == self.state : + # no changes + return + if state : + group.change_layer(self, FOREGROUND_LAYER) + sur = self.surOn + if syllabus : + sur = sur.copy() + rect = self.rectOn + renderedSyl = LYRICS_FONT.render(syllabus, True, FONT_COLOR) + sw, sh, = renderedSyl.get_size() + w, h = self.rectOn.w, self.rectOn.h + + if sw > self.rectOn.w : + sur = pygame.transform.scale(sur, (sw, h)) + rect = rect.inflate(sw - w, 0) + w = sw + + screenWidth = group.dispWidth + if rect.left < 0 : + rect.left = 0 + elif rect.right > screenWidth : + rect.right = screenWidth + + sylRect = pygame.Rect(((w - sw) / 2, (h - sh) / 2), (sw, sh)) + sur.blit(renderedSyl, sylRect) + + self.image = sur + self.rect = rect + else : + group.change_layer(self, BACKGROUND_LAYER) + self.image = self.surOff + self.rect = self.rectOff + + self.state = state + self.dirty = 1 + + evt = pygame.event.Event(events.COLSTATECHANGE, column=self, state=state, syllabus=syllabus) + pygame.event.post(evt)