Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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])
Ejemplo n.º 7
0
    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])
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
    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)
Ejemplo n.º 12
0
 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)