X-Git-Url: https://scm.cri.ensmp.fr/git/minwii.git/blobdiff_plain/eb54dac20092c54228bdd9f227c7ad163bca382d..21d52be27b76c9db94e784393f1748e403dd0c47:/src/minwii/widgets/songfilebrowser.py diff --git a/src/minwii/widgets/songfilebrowser.py b/src/minwii/widgets/songfilebrowser.py index 6117218..fcb1c21 100755 --- a/src/minwii/widgets/songfilebrowser.py +++ b/src/minwii/widgets/songfilebrowser.py @@ -7,6 +7,7 @@ $URL$ """ import pygame +from pygame.locals import K_RETURN from pgu.gui import FileDialog import pgu.gui.basic as basic import pgu.gui.input as input @@ -16,6 +17,8 @@ import pgu.gui.table as table import pgu.gui.area as area from pgu.gui.const import * from pgu.gui.dialog import Dialog +from pgu.gui.app import Desktop +import types import os import tempfile @@ -23,6 +26,28 @@ from xml.etree import ElementTree from minwii.musicxml import musicXml2Song INDEX_TXT = 'index.txt' +PICTURE_ITEM_SIZE = 64 + +def appEventFactory(app, dlg) : + # monkey patch de la méthode gestionnaire d'événements : + # l'ensemble du Desktop écoute les événements de la roulette de la souris + # et les redirige sur la liste déroulante. + def _appEvent(self, e) : + + if dlg.list.vscrollbar: + if not hasattr(dlg.list.vscrollbar,'value'): + return False + + if e.type == pygame.locals.MOUSEBUTTONDOWN: + if e.button == 4: #wheel up + dlg.list.vscrollbar._click(-1) + return True + elif e.button == 5: #wheel down + dlg.list.vscrollbar._click(1) + return True + return Desktop.event(self, e) + + return types.MethodType(_appEvent, app) class FileOpenDialog(FileDialog): @@ -34,6 +59,8 @@ class FileOpenDialog(FileDialog): else: self.curdir = path self.dir_img = basic.Image( pguglobals.app.theme.get(cls1+'.folder', '', 'image')) + self.soundfile_img = basic.Image( + pguglobals.app.theme.get(cls1+'.soundfile', '', 'image')) td_style = {'padding_left': 4, 'padding_right': 4, 'padding_top': 2, @@ -58,7 +85,7 @@ class FileOpenDialog(FileDialog): self.body.tr() self.body.td(self.list, colspan=4, style=td_style) self.list.connect(CHANGE, self._item_select_changed_, None) - self.list.connect(CLICK, self._check_dbl_click_, None) + #self.list.connect(CLICK, self._check_dbl_click_, None) self._last_time_click = pygame.time.get_ticks() self.button_ok.connect(CLICK, self._button_okay_clicked_, None) self.body.tr() @@ -68,14 +95,18 @@ class FileOpenDialog(FileDialog): self.value = None Dialog.__init__(self, self.title, self.body) -# FileDialog.__init__(self, -# title_txt="Ouvrir une chanson", -# button_txt="Ouvrir", -# path=path, -# ) -# self.list.style.width = 700 -# self.list.style.height = 250 + # monkey patch + app = pguglobals.app + self.__regularEventMethod = app.event + app.event = appEventFactory(app, self) + def close(self, w=None) : + FileDialog.close(self, w) + # retrait du monkey patch + app = pguglobals.app + app.event = self.__regularEventMethod + + def _list_dir_(self): self.input_dir.value = self.curdir self.input_dir.pos = len(self.curdir) @@ -103,12 +134,26 @@ class FileOpenDialog(FileDialog): continue filepath = os.path.join(self.curdir, i) xmlFiles.append(filepath) - # self.list.add(FileOpenDialog.getSongTitle(filepath), value=i) if xmlFiles : printableLines = self.getPrintableLines(xmlFiles) for l in printableLines : - self.list.add(l[0], value = l[1]) + imgpath = os.path.splitext(os.path.join(self.curdir, l[1]))[0] + '.jpg' + if os.path.exists(imgpath) : + img = pygame.image.load(imgpath) + iw, ih = img.get_width(), img.get_height() + style = {} + if iw > ih : + style['width'] = PICTURE_ITEM_SIZE + style['height'] = int(round(PICTURE_ITEM_SIZE * float(ih) / iw)) + else : + style['heigth'] = PICTURE_ITEM_SIZE + style['width'] = int(round(PICTURE_ITEM_SIZE * float(iw) / ih)) + + img = basic.Image(img, style=style) + else : + img = self.soundfile_img + self.list.add(l[0], value = l[1], image = img) self.list.set_vertical_scroll(0) @@ -265,6 +310,17 @@ class FileOpenDialog(FileDialog): self._button_okay_clicked_(None) else : self._last_time_click = pygame.time.get_ticks() + + def event(self, e) : + FileDialog.event(self, e) + + if e.type == CLICK and \ + e.button == 1 and \ + self.list.rect.collidepoint(e.pos) : + self._check_dbl_click_(e) + + if e.type == KEYDOWN and e.key == K_RETURN : + self._button_okay_clicked_(None) # utils @@ -294,8 +350,8 @@ def _recurseDecomposition(uc): fullDeco = u''.join(filter(lambda c : isPrintable(c), fullDeco)) return fullDeco -def desacc(s) : - us = s.decode('utf-8', 'ignore') +def desacc(s, encoding='iso-8859-1') : + us = s.decode(encoding, 'ignore') ret = [] for uc in us : ret.append(_recurseDecomposition(uc))