Merge pull request #2484 from zas/collection_menu_cleanup

Collection menu cleanup
This commit is contained in:
Philipp Wolfer
2024-05-22 18:24:06 +02:00
committed by GitHub

View File

@@ -42,19 +42,19 @@ from picard.util import strxfrm
class CollectionMenu(QtWidgets.QMenu):
def __init__(self, albums, *args):
super().__init__(*args)
def __init__(self, albums, *args, **kwargs):
super().__init__(*args, **kwargs)
self.releases = set(a.id for a in albums)
self._ignore_update = False
self.update_collections()
self._ignore_hover = False
self._update_collections()
def update_collections(self):
def _update_collections(self):
self._ignore_update = True
self.clear()
self.actions = []
for id_, collection in sorted(user_collections.items(),
key=lambda k_v:
(strxfrm(str(k_v[1])), k_v[0])):
for collection in sorted(user_collections.values(),
key=lambda c: (strxfrm(c.name), c.id)):
action = QtWidgets.QWidgetAction(self)
action.setDefaultWidget(CollectionMenuItem(self, collection))
self.addAction(action)
@@ -62,19 +62,19 @@ class CollectionMenu(QtWidgets.QMenu):
self._ignore_update = False
self.addSeparator()
self.refresh_action = self.addAction(_("Refresh List"))
self.hovered.connect(self.update_highlight)
self.hovered.connect(self._on_hovered)
def refresh_list(self):
def _refresh_list(self):
self.refresh_action.setEnabled(False)
load_user_collections(self.update_collections)
load_user_collections(self._update_collections)
def mouseReleaseEvent(self, event):
# Not using self.refresh_action.triggered because it closes the menu
if self.actionAt(event.pos()) == self.refresh_action and self.refresh_action.isEnabled():
self.refresh_list()
self._refresh_list()
def update_highlight(self, action):
if self._ignore_update:
def _on_hovered(self, action):
if self._ignore_hover:
return
for a in self.actions:
a.defaultWidget().set_active(a == action)
@@ -94,8 +94,8 @@ class CollectionMenu(QtWidgets.QMenu):
class CollectionMenuItem(QtWidgets.QWidget):
def __init__(self, menu, collection):
super().__init__()
def __init__(self, menu, collection, *args, **kwargs):
super().__init__(*args, **kwargs)
self.menu = menu
self.active = False
self._setup_layout(menu, collection)
@@ -109,7 +109,7 @@ class CollectionMenuItem(QtWidgets.QWidget):
style.pixelMetric(QtWidgets.QStyle.PixelMetric.PM_FocusFrameVMargin),
style.pixelMetric(QtWidgets.QStyle.PixelMetric.PM_LayoutRightMargin),
style.pixelMetric(QtWidgets.QStyle.PixelMetric.PM_FocusFrameVMargin))
self.checkbox = CollectionCheckBox(self, menu, collection)
self.checkbox = CollectionCheckBox(menu, collection, parent=self)
layout.addWidget(self.checkbox)
def _setup_colors(self):
@@ -144,10 +144,10 @@ class CollectionMenuItem(QtWidgets.QWidget):
class CollectionCheckBox(QtWidgets.QCheckBox):
def __init__(self, parent, menu, collection):
def __init__(self, menu, collection, *args, **kwargs):
self.menu = menu
self.collection = collection
super().__init__(self.label(), parent)
super().__init__(self._label(), *args, **kwargs)
releases = collection.releases & menu.releases
if len(releases) == len(menu.releases):
@@ -163,16 +163,16 @@ class CollectionCheckBox(QtWidgets.QCheckBox):
return
diff = releases - self.collection.releases
if diff:
self.collection.add_releases(diff, self.updateText)
self.collection.add_releases(diff, self._update_text)
self.setCheckState(QtCore.Qt.CheckState.Checked)
else:
self.collection.remove_releases(releases & self.collection.releases, self.updateText)
self.collection.remove_releases(releases & self.collection.releases, self._update_text)
self.setCheckState(QtCore.Qt.CheckState.Unchecked)
def updateText(self):
self.setText(self.label())
def _update_text(self):
self.setText(self._label())
def label(self):
def _label(self):
c = self.collection
return ngettext("%(name)s (%(count)i release)", "%(name)s (%(count)i releases)", c.size) % {
'name': c.name,