X-Git-Url: https://scm.cri.mines-paristech.fr/git/minwii.git/blobdiff_plain/778613ffd2c0d8e7cf9088923b4aad9d734f5064..19cf0aa5e307f5fbbc411a2014c5fa869197a51f:/src/minwii/widgets/songfilebrowser.py diff --git a/src/minwii/widgets/songfilebrowser.py b/src/minwii/widgets/songfilebrowser.py index cfa3022..4c5b55c 100755 --- a/src/minwii/widgets/songfilebrowser.py +++ b/src/minwii/widgets/songfilebrowser.py @@ -17,6 +17,9 @@ 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 +from datetime import timedelta import os import tempfile @@ -26,6 +29,27 @@ 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): @@ -36,13 +60,15 @@ 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, 'padding_bottom': 2} - self.title = basic.Label("Ouvrir un chanson", cls="dialog.title.label") + self.title = basic.Label("Ouvrir une chanson", cls="dialog.title.label") self.body = table.Table() - self.list = area.List(width=700, height=250) + self.list = area.List(width=880, height=375) self.input_dir = input.Input() self.input_file = input.Input() self._current_sort = 'alpha' @@ -70,6 +96,17 @@ class FileOpenDialog(FileDialog): self.value = None Dialog.__init__(self, self.title, self.body) + # 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 @@ -109,15 +146,15 @@ class FileOpenDialog(FileDialog): style = {} if iw > ih : style['width'] = PICTURE_ITEM_SIZE - style['height'] = PICTURE_ITEM_SIZE * float(ih) / iw + style['height'] = int(round(PICTURE_ITEM_SIZE * float(ih) / iw)) else : style['heigth'] = PICTURE_ITEM_SIZE - style['width'] = PICTURE_ITEM_SIZE * float(iw) / ih + style['width'] = int(round(PICTURE_ITEM_SIZE * float(iw) / ih)) img = basic.Image(img, style=style) - self.list.add(l[0], value = l[1], image = img) else : - self.list.add(l[0], value = l[1]) + img = self.soundfile_img + self.list.add(l[0], value = l[1], image = img) self.list.set_vertical_scroll(0) @@ -159,14 +196,29 @@ class FileOpenDialog(FileDialog): song = musicXml2Song(file) metadata['distinctNotes'] = len(song.distinctNotes) - histo = song.intervalsHistogram - coeffInter = reduce(lambda a, b : a + b, - [abs(k) * v for k, v in histo.items()]) + duration = song.duration / 1000. + duration = int(round(duration, 0)) + duration = timedelta(seconds=duration) + try : + duration = str(duration) # p.ex. 0:03:05 + duration = duration.split(':') + h, m, s = [int(n) for n in duration] + if h : raise ValueError(h) + duration = ':'.join([str(n).zfill(2) for n in (m, s)]) + except : + raise + duration = srt(duration) - totInter = reduce(lambda a, b: a+b, histo.values()) - totInter = totInter - histo.get(0, 0) - difficulty = int(round(float(coeffInter) / totInter, 0)) - metadata['difficulty'] = difficulty + metadata['duration'] = duration + + # histo = song.intervalsHistogram + # coeffInter = reduce(lambda a, b : a + b, + # [abs(k) * v for k, v in histo.items()]) + # + # totInter = reduce(lambda a, b: a+b, histo.values()) + # totInter = totInter - histo.get(0, 0) + # difficulty = int(round(float(coeffInter) / totInter, 0)) + # metadata['difficulty'] = difficulty return metadata @@ -186,7 +238,7 @@ class FileOpenDialog(FileDialog): if e.args and e.args[0] == 'not a musicxml file' : continue - line = '%(file)s\t%(mtime)s\t%(title)s\t%(distinctNotes)d\t%(difficulty)d\n' % metadata + line = '%(file)s\t%(mtime)s\t%(title)s\t%(distinctNotes)d\t%(duration)s\n' % metadata index.append(line) tmp.write(line) @@ -223,7 +275,7 @@ class FileOpenDialog(FileDialog): continue metadata = FileOpenDialog.getSongMetadata(filePath) - line = '%(file)s\t%(mtime)s\t%(title)s\t%(distinctNotes)d\t%(difficulty)d\n' % metadata + line = '%(file)s\t%(mtime)s\t%(title)s\t%(distinctNotes)d\t%(duration)s\n' % metadata indexedFiles[fileBaseName] = line # check for new files. @@ -239,7 +291,7 @@ class FileOpenDialog(FileDialog): continue metadata = FileOpenDialog.getSongMetadata(file) - line = '%(file)s\t%(mtime)s\t%(title)s\t%(distinctNotes)d\t%(difficulty)d\n' % metadata + line = '%(file)s\t%(mtime)s\t%(title)s\t%(distinctNotes)d\t%(duration)s\n' % metadata indexedFiles[fileBaseName] = line # ok, the index is up to date !