Ajout d'une option pour afficher / masquer les noms de notes en bas du clavier.
[minwii.git] / src / minwii / widgets / songfilebrowser.py
index 119a2f1..2e5cc78 100755 (executable)
@@ -6,6 +6,8 @@ $Id$
 $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
@@ -42,10 +44,13 @@ class FileOpenDialog(FileDialog):
         self.list = area.List(width=700, height=250)
         self.input_dir = input.Input()
         self.input_file = input.Input()
+        self._current_sort = 'alpha'
         self._list_dir_()
         self.button_ok = button.Button("Ouvrir")
         self.button_sort_alpha = button.Button("A-Z")
+        self.button_sort_alpha.connect(CLICK, self._set_current_sort_, 'alpha')
         self.button_sort_num = button.Button("0-9")
+        self.button_sort_num.connect(CLICK, self._set_current_sort_, 'num')
         self.body.tr()
         self.body.td(basic.Label("Dossier"), style=td_style, align=-1)
         self.body.td(self.input_dir, style=td_style)
@@ -54,6 +59,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.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)
@@ -230,8 +237,78 @@ class FileOpenDialog(FileDialog):
             # ok, the index is up to date !
             
             index = indexedFiles.values()
-            index.sort()
             
+
+        if self._current_sort == 'alpha' :
+            def s(a, b) :
+                da = desacc(a.split('\t')[2]).lower()
+                db = desacc(b.split('\t')[2]).lower()
+                return cmp(da, db)
+                
+        elif self._current_sort == 'num' :
+            def s(a, b) :
+                da = int(a.split('\t')[3])
+                db = int(b.split('\t')[3])
+                return cmp(da, db)
+        else :
+            s = cmp
         
+        index.sort(s)
         return index
-        
\ No newline at end of file
+    
+    def _set_current_sort_(self, arg) :
+        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
+from string import printable
+_printable = dict([(c, True) for c in printable])
+isPrintable = _printable.has_key
+
+def _recurseDecomposition(uc):
+    deco = decomposition(uc).split()
+    fullDeco = []
+    if deco :
+        while (deco) :
+            code = deco.pop()
+            if code.startswith('<') :
+                continue
+            c = unichr(int(code, 16))
+            subDeco = decomposition(c).split()
+            if subDeco :
+                deco.extend(subDeco)
+            else :
+                fullDeco.append(c)
+        fullDeco.reverse()
+    else :
+        fullDeco.append(uc)
+    
+    fullDeco = u''.join(filter(lambda c : isPrintable(c), fullDeco))
+    return fullDeco
+
+def desacc(s, encoding='iso-8859-1') :
+    us = s.decode(encoding, 'ignore')
+    ret = []
+    for uc in us :
+        ret.append(_recurseDecomposition(uc))
+    return u''.join(ret)
\ No newline at end of file