From e01896ee76e456d562b8d4baca30c3ffd6ea335b Mon Sep 17 00:00:00 2001 From: Laurent Monin Date: Thu, 1 Feb 2018 16:13:26 +0100 Subject: [PATCH 1/3] PICARD-1175: save and restore CD Lookup dialog and headers states --- picard/ui/cdlookup.py | 47 ++++++++++++++++++++++++++++++++++++++-- picard/ui/ui_cdlookup.py | 1 - ui/cdlookup.ui | 11 ++++------ 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/picard/ui/cdlookup.py b/picard/ui/cdlookup.py index 83b130d98..8f188192a 100644 --- a/picard/ui/cdlookup.py +++ b/picard/ui/cdlookup.py @@ -18,12 +18,21 @@ # 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 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) @@ -34,6 +43,7 @@ class CDLookupDialog(PicardDialog): self.ui.release_list.setSortingEnabled(True) self.ui.release_list.setHeaderLabels([_("Album"), _("Artist"), _("Date"), _("Country"), _("Labels"), _("Catalog #s"), _("Barcode")]) + self.restore_state() if self.releases: for release in self.releases: labels, catalog_numbers = label_info_from_node(release['label-info']) @@ -57,13 +67,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/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 From eaa5ffa5011a27993cf564a9c61daae03fe5c06c Mon Sep 17 00:00:00 2001 From: Laurent Monin Date: Thu, 1 Feb 2018 17:01:09 +0100 Subject: [PATCH 2/3] PICARD-994: display all values in columns for dates, countries, labels, catno To ease reading, use alternate row colors --- picard/mbjson.py | 16 ++++++++++++++++ picard/ui/cdlookup.py | 21 ++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) 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 8f188192a..cebdd1c89 100644 --- a/picard/ui/cdlookup.py +++ b/picard/ui/cdlookup.py @@ -22,7 +22,11 @@ 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): @@ -41,22 +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)) From 13942f220c46b11e4b3ab6761f715cdd75a59d68 Mon Sep 17 00:00:00 2001 From: Laurent Monin Date: Thu, 1 Feb 2018 17:18:30 +0100 Subject: [PATCH 3/3] SearchDialog: alternate row color --- picard/ui/searchdialog/__init__.py | 1 + 1 file changed, 1 insertion(+) 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:

"