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
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):
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'
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)
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)
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
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)
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.
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 !