forked from openlp/openlp
fixed bug #1280295 'Enable natural sorting for song book searches' --fixes 1280294
This commit is contained in:
parent
88cb02bb3d
commit
c8f200b20f
@ -255,7 +255,7 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
log.debug('display results Book')
|
log.debug('display results Book')
|
||||||
self.list_view.clear()
|
self.list_view.clear()
|
||||||
for book in search_results:
|
for book in search_results:
|
||||||
songs = sorted(book.songs, key=lambda song: int(re.match(r'[0-9]+', '0' + song.song_number).group()))
|
songs = sorted(book.songs, key=lambda song: self._natural_sort_key(song.song_number))
|
||||||
for song in songs:
|
for song in songs:
|
||||||
# Do not display temporary songs
|
# Do not display temporary songs
|
||||||
if song.temporary:
|
if song.temporary:
|
||||||
@ -583,6 +583,24 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
# List must be empty at the end
|
# List must be empty at the end
|
||||||
return not author_list
|
return not author_list
|
||||||
|
|
||||||
|
def _try_int(self, s):
|
||||||
|
"""
|
||||||
|
Convert string s to an integer if possible. Fail silently and return
|
||||||
|
the string as-is if it isn't an integer.
|
||||||
|
:param s: The string to try to convert.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
return int(s)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
return s
|
||||||
|
|
||||||
|
def _natural_sort_key(self, s):
|
||||||
|
"""
|
||||||
|
Return a tuple by which s is sorted.
|
||||||
|
:param s: A string value from the list we want to sort.
|
||||||
|
"""
|
||||||
|
return list(map(self._try_int, re.findall(r'(\d+|\D+)', s)))
|
||||||
|
|
||||||
def search(self, string, show_error):
|
def search(self, string, show_error):
|
||||||
"""
|
"""
|
||||||
Search for some songs
|
Search for some songs
|
||||||
|
Loading…
Reference in New Issue
Block a user