def __get_song_sort_key_func(self, order): last_tag = None last_order = None first = True key_func = [] for tag, reverse in order: tag = get_sort_tag(tag) # always sort using the default sort key first if first: first = False key_func.append((lambda s: s.sort_key, reverse)) last_order = reverse last_tag = "" # no need to sort twice in a row with the same key/order if tag == last_tag and last_order == reverse: continue last_order = reverse last_tag = tag if tag == "": key_func.append((lambda s: s.sort_key, reverse)) else: sort_func = AudioFile.sort_by_func(tag) key_func.append((sort_func, reverse)) return key_func
def set_songs(self, songs, sorted=False): model = self.get_model() if not sorted: tag, reverse = self.get_sort_by() tag = self.__get_sort_tag(tag) #try to set a sort indicator that matches the default order if not self.is_sorted(): self.set_sort_by_tag(tag, reverse) if not tag: songs.sort(key=lambda s: s.sort_key, reverse=reverse) else: sort_func = AudioFile.sort_by_func(tag) songs.sort(key=lambda s: s.sort_key) songs.sort(key=sort_func, reverse=reverse) else: self.set_sort_by(None, refresh=False) # Doing set_model(None) resets the sort indicator, so we need to # remember it before doing that. sorts = map(gtk.TreeViewColumn.get_sort_indicator, self.get_columns()) print_d("Detaching model.", context=self) self.set_model(None) model.set(songs) print_d("Attaching model.", context=self) self.set_model(model) print_d("Model attached.", context=self) map(gtk.TreeViewColumn.set_sort_indicator, self.get_columns(), sorts)
def _sort_songs(self, songs): """Sort passed songs in place based on the column sort orders""" last_tag = None last_order = None first = True for tag, reverse in self.get_sort_orders(): tag = get_sort_tag(tag) # always sort using the default sort key first if first: first = False songs.sort(key=lambda s: s.sort_key, reverse=reverse) last_order = reverse last_tag = "" # no need to sort twice in a row with the same key/order if tag == last_tag and last_order == reverse: continue last_order = reverse last_tag = tag if tag == "": songs.sort(key=lambda s: s.sort_key, reverse=reverse) else: sort_func = AudioFile.sort_by_func(tag) songs.sort(key=sort_func, reverse=reverse)
def _sort_songs(self, songs): """Sort passed songs in place based on the column sort orders""" last_tag = None last_order = None first = True for tag, reverse in self.get_sort_orders(): tag = get_sort_tag(tag) # always sort using the default sort key first if first: first = False songs.sort(key=lambda s: s.sort_key, reverse=reverse) last_order = reverse last_tag = "" # no need to sort twice in a row with the same key/order if tag == last_tag and last_order == reverse: continue last_order = reverse last_tag = tag if tag == "": songs.sort(key=lambda s: s.sort_key, reverse=reverse) else: sort_func = AudioFile.sort_by_func(tag) songs.sort(key=sort_func, reverse=reverse)
def set_songs(self, songs, sorted=False): model = self.get_model() if not sorted: tag, reverse = self.get_sort_by() tag = self.__get_sort_tag(tag) #try to set a sort indicator that matches the default order if not self.is_sorted(): self.set_sort_by_tag(tag, reverse) if not tag: songs.sort(key=lambda s: s.sort_key, reverse=reverse) else: sort_func = AudioFile.sort_by_func(tag) songs.sort(key=lambda s: s.sort_key) songs.sort(key=sort_func, reverse=reverse) else: self.set_sort_by(None, refresh=False) with self.without_model() as model: model.set(songs) # the song selection has queued a change now, cancel that and # pass the songs manually self.info._update_songs(songs)
def add_songs(self, songs): """Add songs to the list in the right order and position""" if not songs: return model = self.get_model() if not len(model): self.set_songs(songs) return tag, reverse = self.get_sort_by() tag = self.__get_sort_tag(tag) if not self.is_sorted(): self.set_sort_by_tag(tag, reverse) # FIXME: Replace with something fast old_songs = self.get_songs() old_songs.extend(songs) if not tag: old_songs.sort(key=lambda s: s.sort_key, reverse=reverse) else: sort_func = AudioFile.sort_by_func(tag) old_songs.sort(key=lambda s: s.sort_key) old_songs.sort(key=sort_func, reverse=reverse) for index, song in sorted(zip(map(old_songs.index, songs), songs)): model.insert(index, row=[song])
def add_songs(self, songs): """Add songs to the list in the right order and position""" if not songs: return model = self.get_model() if not len(model): self.set_songs(songs) return tag, reverse = self.get_sort_by() tag = self.__get_sort_tag(tag) if not self.is_sorted(): self.set_sort_by_tag(tag, reverse) # FIXME: Replace with something fast old_songs = self.get_songs() old_songs.extend(songs) if not tag: old_songs.sort(key=lambda s: s.sort_key, reverse=reverse) else: sort_func = AudioFile.sort_by_func(tag) old_songs.sort(key=lambda s: s.sort_key) old_songs.sort(key=sort_func, reverse=reverse) for index, song in sorted(zip(map(old_songs.index, songs), songs)): model.insert(index, row=[song])
def test_sort_func(self): tags = [lambda s: s("foo"), "artistsort", "albumsort", "~filename", "~format", "discnumber", "~#track"] for tag in tags: f = AudioFile.sort_by_func(tag) f(bar_1_1) f(bar_1_2) f(bar_2_1)
def test_sort_func(self): tags = [ lambda s: s("foo"), "artistsort", "albumsort", "~filename", "~format", "discnumber", "~#track" ] for tag in tags: f = AudioFile.sort_by_func(tag) f(bar_1_1) f(bar_1_2) f(bar_2_1)
def test_invalid_fs_encoding(self): # issue 798 a = AudioFile() a.sanitize("/\xf6\xe4\xfc/\xf6\xe4\xfc.ogg") # latin 1 encoded a.sort_by_func("~filename")(a) a.sort_by_func("~basename")(a) a.sort_by_func("~dirname")(a) # windows a.sanitize("/\xf6\xe4\xfc/\xf6\xe4\xfc.ogg".decode("latin-1")) a.sort_by_func("~filename")(a) a.sort_by_func("~basename")(a) a.sort_by_func("~dirname")(a)
def test_invalid_fs_encoding(self): # issue 798 a = AudioFile() a["~filename"] = "/\xf6\xe4\xfc/\xf6\xe4\xfc.ogg" # latin 1 encoded a.sort_by_func("~filename")(a) a.sort_by_func("~basename")(a) # windows a["~filename"] = "/\xf6\xe4\xfc/\xf6\xe4\xfc.ogg".decode("latin-1") a.sort_by_func("~filename")(a) a.sort_by_func("~basename")(a) a.sort_by_func("~dirname")(a)
def test_invalid_fs_encoding(self): # issue 798 a = AudioFile() if os.name != "nt": a["~filename"] = "/\xf6\xe4\xfc/\xf6\xe4\xfc.ogg" # latin 1 encoded a.sort_by_func("~filename")(a) a.sort_by_func("~basename")(a) else: # windows a["~filename"] = "/\xf6\xe4\xfc/\xf6\xe4\xfc.ogg".decode("latin-1") a.sort_by_func("~filename")(a) a.sort_by_func("~basename")(a) a.sort_by_func("~dirname")(a)