Skip to content

Commit daa01ef

Browse files
StevilKnevilphw
authored andcommitted
Added utility function to order the tags in tag_names
1 parent de9090a commit daa01ef

File tree

3 files changed

+60
-19
lines changed

3 files changed

+60
-19
lines changed

picard/ui/metadatabox/__init__.py

+1-19
Original file line numberDiff line numberDiff line change
@@ -608,25 +608,7 @@ def _update_tags(self, new_selection=True, drop_album_caches=False):
608608

609609
tag_diff.objects += 1
610610

611-
all_tags = set(list(tag_diff.old) + list(tag_diff.new))
612-
common_tags = [tag for tag in top_tags if tag in all_tags]
613-
tag_names = common_tags + sorted(all_tags.difference(common_tags),
614-
key=lambda x: display_tag_name(x).lower())
615-
616-
if config.persist['show_changes_first']:
617-
tags_by_status = {}
618-
619-
for tag in tag_names:
620-
tags_by_status.setdefault(tag_diff.tag_status(tag), []).append(tag)
621-
622-
for status in (TagStatus.CHANGED, TagStatus.ADDED,
623-
TagStatus.REMOVED, TagStatus.UNCHANGED):
624-
tag_diff.tag_names += tags_by_status.pop(status, [])
625-
else:
626-
tag_diff.tag_names = [
627-
tag for tag in tag_names if
628-
tag_diff.status[tag] != TagStatus.EMPTY]
629-
611+
tag_diff.update_tag_names(config.persist['show_changes_first'], top_tags)
630612
return tag_diff
631613

632614
def _update_items(self, result=None, error=None):

picard/ui/metadatabox/tagdiff.py

+31
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
from picard.i18n import ngettext
4242
from picard.metadata import MULTI_VALUED_JOINER
4343
from picard.util import format_time
44+
from picard.util.tags import display_tag_name
4445

4546

4647
class TagStatus:
@@ -311,3 +312,33 @@ def tag_status(self, tag):
311312
if status & s == s:
312313
return s
313314
return TagStatus.UNCHANGED
315+
316+
def update_tag_names(self, changes_first=False, top_tags=None):
317+
"""
318+
Updates the list of tag names to be displayed.
319+
320+
The tag names are sorted based on their name with the top_tags, and optionally
321+
the changed tags, first.
322+
323+
Args:
324+
changes_first (bool): Whether to display changed tags first.
325+
top_tags (set): Set of tags to always be displayed at the top.
326+
"""
327+
all_tags = set(list(self.old) + list(self.new))
328+
common_tags = [tag for tag in top_tags if tag in all_tags] if top_tags else []
329+
tag_names = common_tags + sorted(all_tags.difference(common_tags),
330+
key=lambda x: display_tag_name(x).lower())
331+
332+
if changes_first:
333+
tags_by_status = {}
334+
335+
for tag in tag_names:
336+
tags_by_status.setdefault(self.tag_status(tag), []).append(tag)
337+
338+
for status in (TagStatus.CHANGED, TagStatus.ADDED,
339+
TagStatus.REMOVED, TagStatus.UNCHANGED):
340+
self.tag_names += tags_by_status.pop(status, [])
341+
else:
342+
self.tag_names = [
343+
tag for tag in tag_names if
344+
self.status[tag] != TagStatus.EMPTY]

test/test_tagdiff.py

+28
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,34 @@ def test_add_not_removable(self):
205205
self.tag_diff.add("artist", old=["Artist 1"], new=["Artist 2"], removable=False)
206206
self.assertEqual(self.tag_diff.status["artist"], TagStatus.CHANGED | TagStatus.NOTREMOVABLE)
207207

208+
def test_update_tag_names(self):
209+
self.tag_diff.add("title", old=["Title 1"], new=["Title 2"])
210+
self.tag_diff.add("artist", new=["Artist 2"])
211+
self.tag_diff.add("album", old=["Album 1"])
212+
self.tag_diff.update_tag_names()
213+
self.assertEqual(self.tag_diff.tag_names, ["album", "artist", "title"])
214+
215+
def test_update_tag_names_top_tags(self):
216+
self.tag_diff.add("title", old=["Title 1"], new=["Title 2"])
217+
self.tag_diff.add("artist", new=["Artist 2"])
218+
self.tag_diff.add("album", old=["Album 1"])
219+
self.tag_diff.update_tag_names(top_tags={"title"})
220+
self.assertEqual(self.tag_diff.tag_names, ["title", "album", "artist"])
221+
222+
def test_update_tag_names_changes_first(self):
223+
self.tag_diff.add("title", old=["Title 1"], new=["Title 2"])
224+
self.tag_diff.add("artist", old=["Artist 2"])
225+
self.tag_diff.add("album", old=["Album 1"])
226+
self.tag_diff.update_tag_names(changes_first=True)
227+
self.assertEqual(self.tag_diff.tag_names, ["title", "album", "artist"])
228+
229+
def test_update_tag_names_top_tags_changed(self):
230+
self.tag_diff.add("title", old=["Title 1"], new=["Title 2"])
231+
self.tag_diff.add("artist", new=["Artist 2"])
232+
self.tag_diff.add("album", old=["Album 1"])
233+
self.tag_diff.update_tag_names(changes_first=True, top_tags={"title"})
234+
self.assertEqual(self.tag_diff.tag_names, ["title", "artist", "album"])
235+
208236
@staticmethod
209237
def _special_handler(old, new):
210238
for old_value, new_value in zip(old, new):

0 commit comments

Comments
 (0)