X-Git-Url: https://scm.cri.ensmp.fr/git/minwii.git/blobdiff_plain/dd7cfaaea9bc84fa414c1ad52a5fe851f90fa205..eb54dac20092c54228bdd9f227c7ad163bca382d:/src/minwii/widgets/songfilebrowser.py diff --git a/src/minwii/widgets/songfilebrowser.py b/src/minwii/widgets/songfilebrowser.py index cfee85b..6117218 100755 --- a/src/minwii/widgets/songfilebrowser.py +++ b/src/minwii/widgets/songfilebrowser.py @@ -6,7 +6,17 @@ $Id$ $URL$ """ +import pygame from pgu.gui import FileDialog +import pgu.gui.basic as basic +import pgu.gui.input as input +import pgu.gui.button as button +import pgu.gui.pguglobals as pguglobals +import pgu.gui.table as table +import pgu.gui.area as area +from pgu.gui.const import * +from pgu.gui.dialog import Dialog + import os import tempfile from xml.etree import ElementTree @@ -19,13 +29,52 @@ class FileOpenDialog(FileDialog): def __init__(self, path): - FileDialog.__init__(self, - title_txt="Ouvrir une chanson", - button_txt="Ouvrir", - path=path, - ) - self.list.style.width = 700 - self.list.style.height = 250 + cls1 = 'filedialog' + if not path: self.curdir = os.getcwd() + else: self.curdir = path + self.dir_img = basic.Image( + pguglobals.app.theme.get(cls1+'.folder', '', '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.body = table.Table() + 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) + self.body.td(self.button_sort_alpha) + self.body.td(self.button_sort_num) + 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.body.td(self.input_file, style=td_style) + self.body.td(self.button_ok, style=td_style, colspan=2) + 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 @@ -187,8 +236,67 @@ 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() + + +# 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) : + us = s.decode('utf-8', 'ignore') + ret = [] + for uc in us : + ret.append(_recurseDecomposition(uc)) + return u''.join(ret) \ No newline at end of file