diff --git a/picard/mbjson.py b/picard/mbjson.py
index fb412490a..d44de1035 100644
--- a/picard/mbjson.py
+++ b/picard/mbjson.py
@@ -257,6 +257,22 @@ def country_list_from_node(node):
return country
+def release_dates_and_countries_from_node(node):
+ dates = []
+ countries = []
+ if "release-events" in node:
+ for release_event in node['release-events']:
+ dates.append(release_event['date'])
+ country_code = None
+ try:
+ country_code = release_event['area']['iso-3166-1-codes'][0]
+ # TypeError in case object is None
+ except (KeyError, IndexError, TypeError):
+ pass
+ countries.append(country_code)
+ return dates, countries
+
+
def label_info_from_node(node):
labels = []
catalog_numbers = []
diff --git a/picard/ui/cdlookup.py b/picard/ui/cdlookup.py
index 83b130d98..cebdd1c89 100644
--- a/picard/ui/cdlookup.py
+++ b/picard/ui/cdlookup.py
@@ -18,12 +18,25 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from PyQt5 import QtCore, QtWidgets
+
+from picard import config, log
from picard.ui import PicardDialog
from picard.ui.ui_cdlookup import Ui_Dialog
-from picard.mbjson import artist_credit_from_node, label_info_from_node
+from picard.mbjson import (
+ artist_credit_from_node,
+ label_info_from_node,
+ release_dates_and_countries_from_node,
+)
class CDLookupDialog(PicardDialog):
+ dialog_window_size = "cdlookupdialog_window_size"
+ dialog_header_state = "cdlookupdialog_header_state"
+
+ options = [
+ config.Option("persist", dialog_window_size, QtCore.QSize(720, 360)),
+ config.Option("persist", dialog_header_state, QtCore.QByteArray())
+ ]
def __init__(self, releases, disc, parent=None):
PicardDialog.__init__(self, parent)
@@ -32,21 +45,25 @@ class CDLookupDialog(PicardDialog):
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.ui.release_list.setSortingEnabled(True)
+ self.ui.release_list.setAlternatingRowColors(True)
self.ui.release_list.setHeaderLabels([_("Album"), _("Artist"), _("Date"), _("Country"),
_("Labels"), _("Catalog #s"), _("Barcode")])
+ self.restore_state()
if self.releases:
+ def myjoin(l):
+ return "\n".join(l)
+
for release in self.releases:
labels, catalog_numbers = label_info_from_node(release['label-info'])
- date = release['date'] if "date" in release else ""
- country = release['country'] if "country" in release else ""
+ dates, countries = release_dates_and_countries_from_node(release)
barcode = release['barcode'] if "barcode" in release else ""
item = QtWidgets.QTreeWidgetItem(self.ui.release_list)
item.setText(0, release['title'])
item.setText(1, artist_credit_from_node(release['artist-credit'])[0])
- item.setText(2, date)
- item.setText(3, country)
- item.setText(4, ", ".join(labels))
- item.setText(5, ", ".join(catalog_numbers))
+ item.setText(2, myjoin(dates))
+ item.setText(3, myjoin(countries))
+ item.setText(4, myjoin(labels))
+ item.setText(5, myjoin(catalog_numbers))
item.setText(6, barcode)
item.setData(0, QtCore.Qt.UserRole, release['id'])
self.ui.release_list.setCurrentItem(self.ui.release_list.topLevelItem(0))
@@ -57,13 +74,46 @@ class CDLookupDialog(PicardDialog):
self.ui.release_list.sortByColumn(3, QtCore.Qt.AscendingOrder)
self.ui.release_list.sortByColumn(2, QtCore.Qt.DescendingOrder)
self.ui.lookup_button.clicked.connect(self.lookup)
+ self.restore_header_state()
+
+ def save_and_accept(self):
+ self.save_state()
+ QtWidgets.QDialog.accept(self)
def accept(self):
release_id = self.ui.release_list.currentItem().data(0, QtCore.Qt.UserRole)
self.tagger.load_album(release_id, discid=self.disc.id)
- QtWidgets.QDialog.accept(self)
+ self.save_and_accept()
def lookup(self):
lookup = self.tagger.get_file_lookup()
lookup.disc_lookup(self.disc.submission_url)
- QtWidgets.QDialog.accept(self)
+ self.save_and_accept()
+
+ def reject(self):
+ self.save_state()
+ QtWidgets.QDialog.reject(self)
+
+ def restore_state(self):
+ size = config.persist[self.dialog_window_size]
+ if size:
+ self.resize(size)
+ log.debug("restore_state: %s" % self.dialog_window_size)
+
+ def restore_header_state(self):
+ header = self.ui.release_list.header()
+ state = config.persist[self.dialog_header_state]
+ if state:
+ header.restoreState(state)
+ log.debug("restore_state: %s" % self.dialog_header_state)
+
+ def save_state(self):
+ if self.ui.release_list:
+ self.save_header_state()
+ log.debug("save_state: %s" % self.dialog_window_size)
+ config.persist[self.dialog_window_size] = self.size()
+
+ def save_header_state(self):
+ state = self.ui.release_list.header().saveState()
+ config.persist[self.dialog_header_state] = state
+ log.debug("save_state: %s" % self.dialog_header_state)
diff --git a/picard/ui/searchdialog/__init__.py b/picard/ui/searchdialog/__init__.py
index fac5d9869..8e8159660 100644
--- a/picard/ui/searchdialog/__init__.py
+++ b/picard/ui/searchdialog/__init__.py
@@ -317,6 +317,7 @@ class SearchDialog(PicardDialog):
self.table.resizeColumnsToContents()
self.table.resizeRowsToContents()
+ self.table.setAlternatingRowColors(True)
def network_error(self, reply, error):
error_msg = _("Following error occurred while fetching results:
"
diff --git a/picard/ui/ui_cdlookup.py b/picard/ui/ui_cdlookup.py
index d5e2f75b5..12e855c24 100644
--- a/picard/ui/ui_cdlookup.py
+++ b/picard/ui/ui_cdlookup.py
@@ -17,7 +17,6 @@ class Ui_Dialog(object):
self.label.setObjectName("label")
self.vboxlayout.addWidget(self.label)
self.release_list = QtWidgets.QTreeWidget(Dialog)
- self.release_list.setRootIsDecorated(False)
self.release_list.setObjectName("release_list")
self.release_list.headerItem().setText(0, "1")
self.vboxlayout.addWidget(self.release_list)
diff --git a/ui/cdlookup.ui b/ui/cdlookup.ui
index c0417e2fa..ebf8f1d9e 100644
--- a/ui/cdlookup.ui
+++ b/ui/cdlookup.ui
@@ -29,9 +29,6 @@
-
-
- false
-
1
@@ -103,8 +100,8 @@
accept()
- 278
- 253
+ 410
+ 227
96
@@ -119,8 +116,8 @@
reject()
- 369
- 253
+ 629
+ 227
179