Ajout des images d'illustration des chansons.
[minwii.git] / src / minwii / widgets / songfilebrowser.py
index f976ce6..ba8c836 100755 (executable)
@@ -6,6 +6,8 @@ $Id$
 $URL$
 """
 
 $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
 from pgu.gui import FileDialog
 import pgu.gui.basic as basic
 import pgu.gui.input as input
@@ -22,6 +24,7 @@ from xml.etree import ElementTree
 from minwii.musicxml import musicXml2Song
 
 INDEX_TXT = 'index.txt'
 from minwii.musicxml import musicXml2Song
 
 INDEX_TXT = 'index.txt'
+PICTURE_ITEM_SIZE = 64
 
 class FileOpenDialog(FileDialog):
     
 
 class FileOpenDialog(FileDialog):
     
@@ -33,6 +36,8 @@ class FileOpenDialog(FileDialog):
         else: self.curdir = path
         self.dir_img = basic.Image(
             pguglobals.app.theme.get(cls1+'.folder', '', 'image'))
         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,
         td_style = {'padding_left': 4,
                     'padding_right': 4,
                     'padding_top': 2,
@@ -57,6 +62,8 @@ 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.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._last_time_click = pygame.time.get_ticks()
         self.button_ok.connect(CLICK, self._button_okay_clicked_, None)
         self.body.tr()
         self.body.td(basic.Label("Fichier"), style=td_style, align=-1)
         self.button_ok.connect(CLICK, self._button_okay_clicked_, None)
         self.body.tr()
         self.body.td(basic.Label("Fichier"), style=td_style, align=-1)
@@ -65,14 +72,7 @@ class FileOpenDialog(FileDialog):
         self.value = None
         Dialog.__init__(self, self.title, self.body)
         
         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
-    
+            
     def _list_dir_(self):
         self.input_dir.value = self.curdir
         self.input_dir.pos = len(self.curdir)
     def _list_dir_(self):
         self.input_dir.value = self.curdir
         self.input_dir.pos = len(self.curdir)
@@ -100,12 +100,26 @@ class FileOpenDialog(FileDialog):
                 continue
             filepath = os.path.join(self.curdir, i)
             xmlFiles.append(filepath)
                 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 :
         
         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'] = PICTURE_ITEM_SIZE * float(ih) / iw
+                    else :
+                        style['heigth'] = PICTURE_ITEM_SIZE
+                        style['width'] = 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)
     
  
         self.list.set_vertical_scroll(0)
     
@@ -256,6 +270,24 @@ class FileOpenDialog(FileDialog):
         self._current_sort = arg
         self.list.clear()
         self._list_dir_()
         self._current_sort = arg
         self.list.clear()
         self._list_dir_()
+    
+    def _check_dbl_click_(self, arg) :
+        if pygame.time.get_ticks() - self._last_time_click < 300 :
+            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
 from unicodedata import decomposition
 
 # utils
 from unicodedata import decomposition
@@ -284,8 +316,8 @@ def _recurseDecomposition(uc):
     fullDeco = u''.join(filter(lambda c : isPrintable(c), fullDeco))
     return fullDeco
 
     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))
     ret = []
     for uc in us :
         ret.append(_recurseDecomposition(uc))