diff --git a/picard/__init__.py b/picard/__init__.py index 62108ef07..a440e8588 100644 --- a/picard/__init__.py +++ b/picard/__init__.py @@ -42,7 +42,7 @@ PICARD_APP_NAME = "Picard" PICARD_DISPLAY_NAME = "MusicBrainz Picard" PICARD_APP_ID = "org.musicbrainz.Picard" PICARD_DESKTOP_NAME = PICARD_APP_ID + ".desktop" -PICARD_VERSION = Version(2, 7, 0, 'dev', 4) +PICARD_VERSION = Version(2, 7, 0, 'dev', 5) # optional build version diff --git a/picard/config_upgrade.py b/picard/config_upgrade.py index 04d565876..d0541402f 100644 --- a/picard/config_upgrade.py +++ b/picard/config_upgrade.py @@ -435,6 +435,20 @@ def upgrade_to_v2_7_0_dev_4(config): _s.remove("artist_locale") +def upgrade_to_v2_7_0_dev_5(config): + """Replace artist_script_exceptions with script_exceptions and remove artist_script_exception_weighting""" + _s = config.setting + ListOption("setting", "script_exceptions", []) + weighting = _s["artist_script_exception_weighting"] if _s["artist_script_exception_weighting"] else 0 + script_exceptions = [] + if _s["artist_script_exceptions"]: + for script_exception in _s["artist_script_exceptions"]: + script_exceptions.append((script_exception, weighting)) + _s["script_exceptions"] = script_exceptions + _s.remove("artist_script_exceptions") + _s.remove("artist_script_exception_weighting") + + def rename_option(config, old_opt, new_opt, option_type, default): _s = config.setting if old_opt in _s: @@ -477,4 +491,5 @@ def upgrade_config(config): cfg.register_upgrade_hook(upgrade_to_v2_7_0_dev_2) cfg.register_upgrade_hook(upgrade_to_v2_7_0_dev_3) cfg.register_upgrade_hook(upgrade_to_v2_7_0_dev_4) + cfg.register_upgrade_hook(upgrade_to_v2_7_0_dev_5) cfg.run_upgrade_hooks(log.debug) diff --git a/picard/mbjson.py b/picard/mbjson.py index 6f8ab0f41..f113c614f 100644 --- a/picard/mbjson.py +++ b/picard/mbjson.py @@ -35,7 +35,7 @@ from picard.util import ( parse_amazon_url, translate_from_sortname, ) -from picard.util.script_detector_weighted import list_script_weighted +from picard.util.script_detector_weighted import detect_script_weighted _artist_rel_types = { @@ -194,10 +194,10 @@ def _translate_artist_node(node): transl, translsort = None, None if config.setting['translate_artist_names']: if config.setting['translate_artist_names_script_exception']: - threshhold = config.setting["artist_script_exception_weighting"] / 100 - detected_scripts = list_script_weighted(node["name"], threshhold) - for script_id in config.setting["artist_script_exceptions"]: - if script_id in detected_scripts: + detected_scripts = detect_script_weighted(node["name"]) + for script_item in config.setting["script_exceptions"]: + script_id, script_weighting = script_item + if script_id in detected_scripts and detected_scripts[script_id] >= script_weighting / 100: return node['name'], node['sort-name'] def check_higher_score(locale_dict, locale, score): diff --git a/picard/profile.py b/picard/profile.py index 22d0c9112..c6da52f42 100644 --- a/picard/profile.py +++ b/picard/profile.py @@ -45,8 +45,7 @@ class UserProfileGroups(): SettingDesc("translate_artist_names", N_("Translate artist names"), ["translate_artist_names"]), SettingDesc("artist_locales", N_("Translation locales"), ["selected_locales"]), SettingDesc("translate_artist_names_script_exception", N_("Translate artist names exception"), ["translate_artist_names_script_exception"]), - SettingDesc("artist_script_exceptions", N_("Translation script exceptions"), ["ignore_tx_scripts"]), - SettingDesc("artist_script_exception_weighting", N_("Exception script weighting"), ["minimum_weighting"]), + SettingDesc("script_exceptions", N_("Translation script exceptions"), ["selected_scripts"]), SettingDesc("release_ars", N_("Use release relationships"), ["release_ars"]), SettingDesc("track_ars", N_("Use track relationships"), ["track_ars"]), SettingDesc("convert_punctuation", N_("Convert Unicode punctuation characters to ASCII"), ["convert_punctuation"]), diff --git a/picard/ui/options/metadata.py b/picard/ui/options/metadata.py index 3ab76f1ce..db5085042 100644 --- a/picard/ui/options/metadata.py +++ b/picard/ui/options/metadata.py @@ -34,7 +34,6 @@ from PyQt5 import ( from picard.config import ( BoolOption, - IntOption, ListOption, TextOption, get_config, @@ -50,6 +49,7 @@ from picard.ui.options import ( OptionsPage, register_options_page, ) +from picard.ui.ui_exception_script_selector import Ui_ExceptionScriptSelector from picard.ui.ui_multi_locale_selector import Ui_MultiLocaleSelector from picard.ui.ui_options_metadata import Ui_MetadataOptionsPage @@ -86,8 +86,7 @@ class MetadataOptionsPage(OptionsPage): ListOption("setting", "artist_locales", ["en"]), BoolOption("setting", "translate_artist_names", False), BoolOption("setting", "translate_artist_names_script_exception", False), - ListOption("setting", "artist_script_exceptions", []), - IntOption("setting", "artist_script_exception_weighting", 0), + ListOption("setting", "script_exceptions", []), BoolOption("setting", "release_ars", True), BoolOption("setting", "track_ars", False), BoolOption("setting", "convert_punctuation", True), @@ -103,6 +102,7 @@ class MetadataOptionsPage(OptionsPage): self.ui.va_name_default.clicked.connect(self.set_va_name_default) self.ui.nat_name_default.clicked.connect(self.set_nat_name_default) self.ui.select_locales.clicked.connect(self.open_locale_selector) + self.ui.select_scripts.clicked.connect(self.open_script_selector) self.ui.translate_artist_names.stateChanged.connect(self.set_enabled_states) self.ui.translate_artist_names_script_exception.stateChanged.connect(self.set_enabled_states) @@ -111,16 +111,9 @@ class MetadataOptionsPage(OptionsPage): self.ui.translate_artist_names.setChecked(config.setting["translate_artist_names"]) self.current_locales = config.setting["artist_locales"] self.make_locales_text() + self.current_scripts = config.setting["script_exceptions"] + self.make_scripts_text() self.ui.translate_artist_names_script_exception.setChecked(config.setting["translate_artist_names_script_exception"]) - self.ui.ignore_tx_scripts.clear() - for script_id in SCRIPTS: - enabled = script_id in config.setting["artist_script_exceptions"] - item = QtWidgets.QListWidgetItem(_(SCRIPTS[script_id])) - item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) - item.setData(QtCore.Qt.UserRole, script_id) - item.setCheckState(QtCore.Qt.Checked if enabled else QtCore.Qt.Unchecked) - self.ui.ignore_tx_scripts.addItem(item) - self.ui.minimum_weighting.setValue(config.setting["artist_script_exception_weighting"]) self.ui.convert_punctuation.setChecked(config.setting["convert_punctuation"]) self.ui.release_ars.setChecked(config.setting["release_ars"]) @@ -140,18 +133,22 @@ class MetadataOptionsPage(OptionsPage): self.ui.selected_locales.setText('; '.join(translated_locales())) + def make_scripts_text(self): + def translated_scripts(): + for script in self.current_scripts: + yield "{script} ({weighting}%)".format( + script=_(SCRIPTS[script[0]]), + weighting=script[1], + ) + + self.ui.selected_scripts.setText('; '.join(translated_scripts())) + def save(self): config = get_config() config.setting["translate_artist_names"] = self.ui.translate_artist_names.isChecked() config.setting["artist_locales"] = self.current_locales config.setting["translate_artist_names_script_exception"] = self.ui.translate_artist_names_script_exception.isChecked() - script_exceptions = [] - for idx in range(self.ui.ignore_tx_scripts.count()): - item = self.ui.ignore_tx_scripts.item(idx) - if item.checkState() == QtCore.Qt.Checked: - script_exceptions.append(item.data(QtCore.Qt.UserRole)) - config.setting["artist_script_exceptions"] = script_exceptions - config.setting["artist_script_exception_weighting"] = min(100, max(0, self.ui.minimum_weighting.value())) + config.setting["script_exceptions"] = self.current_scripts config.setting["convert_punctuation"] = self.ui.convert_punctuation.isChecked() config.setting["release_ars"] = self.ui.release_ars.isChecked() config.setting["track_ars"] = self.ui.track_ars.isChecked() @@ -179,12 +176,17 @@ class MetadataOptionsPage(OptionsPage): self.ui.select_locales.setEnabled(translate_checked) self.ui.selected_locales.setEnabled(translate_checked) self.ui.translate_artist_names_script_exception.setEnabled(translate_checked) - self.ui.ignore_script_frame.setEnabled(translate_checked and translate_exception_checked) + self.ui.selected_scripts.setEnabled(translate_checked and translate_exception_checked) + self.ui.select_scripts.setEnabled(translate_checked and translate_exception_checked) def open_locale_selector(self): dialog = MultiLocaleSelector(self) dialog.show() + def open_script_selector(self): + dialog = ScriptExceptionSelector(self) + dialog.show() + class MultiLocaleSelector(PicardDialog): def __init__(self, parent=None): @@ -261,4 +263,106 @@ class MultiLocaleSelector(PicardDialog): self.accept() +class ScriptExceptionSelector(PicardDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.ui = Ui_ExceptionScriptSelector() + self.ui.setupUi(self) + self.ui.button_box.accepted.connect(self.save_changes) + self.ui.button_box.rejected.connect(self.reject) + self.move_view = MoveableListView(self.ui.selected_scripts, self.ui.move_up, self.ui.move_down) + self.ui.add_script.clicked.connect(self.add_script) + self.ui.remove_script.clicked.connect(self.remove_script) + self.ui.selected_scripts.currentRowChanged.connect(self.selected_script_changed) + self.ui.weighting_selector.valueChanged.connect(self.weighting_changed) + self.load() + + @staticmethod + def make_label(script_id, script_weighting): + return "{script} ({weighting}%)".format( + script=_(SCRIPTS[script_id]), + weighting=script_weighting, + ) + + def load(self): + self.ui.selected_scripts.clear() + for script in self.parent().current_scripts: + label = self.make_label(script_id=script[0], script_weighting=script[1]) + item = QtWidgets.QListWidgetItem(label) + item.setData(QtCore.Qt.UserRole, script) + self.ui.selected_scripts.addItem(item) + if self.ui.selected_scripts.count() > 0: + self.ui.selected_scripts.setCurrentRow(0) + self.set_weighting_selector() + + self.ui.available_scripts.clear() + for script_id in SCRIPTS: + item = QtWidgets.QListWidgetItem(_(SCRIPTS[script_id])) + item.setData(QtCore.Qt.UserRole, script_id) + self.ui.available_scripts.addItem(item) + self.ui.available_scripts.setCurrentRow(0) + + self.set_button_state() + + def add_script(self): + item = self.ui.available_scripts.currentItem() + if item is None: + return + script_id = item.data(QtCore.Qt.UserRole) + for row in range(self.ui.selected_scripts.count()): + selected_item = self.ui.selected_scripts.item(row) + if selected_item.data(QtCore.Qt.UserRole)[0] == script_id: + return + new_item = QtWidgets.QListWidgetItem(self.make_label(script_id, 0)) + new_item.setData(QtCore.Qt.UserRole, (script_id, 0)) + self.ui.selected_scripts.addItem(new_item) + self.ui.selected_scripts.setCurrentRow(self.ui.selected_scripts.count() - 1) + self.set_weighting_selector() + + def remove_script(self): + row = self.ui.selected_scripts.currentRow() + self.ui.selected_scripts.takeItem(row) + + def selected_script_changed(self): + self.set_weighting_selector() + self.set_button_state() + + def weighting_changed(self): + self.set_item_from_weighting() + + def set_button_state(self): + enabled = self.ui.selected_scripts.count() > 0 + self.ui.remove_script.setEnabled(enabled) + self.ui.weighting_selector.setEnabled(enabled) + + def set_weighting_selector(self): + row = self.ui.selected_scripts.currentRow() + selected_item = self.ui.selected_scripts.item(row) + if selected_item: + weighting = selected_item.data(QtCore.Qt.UserRole)[1] + else: + weighting = 0 + self.ui.weighting_selector.setValue(weighting) + + def set_item_from_weighting(self): + row = self.ui.selected_scripts.currentRow() + selected_item = self.ui.selected_scripts.item(row) + if selected_item: + item_data = selected_item.data(QtCore.Qt.UserRole) + weighting = self.ui.weighting_selector.value() + new_data = (item_data[0], weighting) + selected_item.setData(QtCore.Qt.UserRole, new_data) + label = self.make_label(script_id=item_data[0], script_weighting=weighting) + selected_item.setText(label) + + def save_changes(self): + scripts = [] + for row in range(self.ui.selected_scripts.count()): + selected_item = self.ui.selected_scripts.item(row) + scripts.append(selected_item.data(QtCore.Qt.UserRole)) + self.parent().current_scripts = scripts + self.parent().make_scripts_text() + self.accept() + + register_options_page(MetadataOptionsPage) diff --git a/picard/ui/ui_exception_script_selector.py b/picard/ui/ui_exception_script_selector.py new file mode 100644 index 000000000..bc1b7a4cb --- /dev/null +++ b/picard/ui/ui_exception_script_selector.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- + +# Automatically generated - don't edit. +# Use `python setup.py build_ui` to update it. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_ExceptionScriptSelector(object): + def setupUi(self, ExceptionScriptSelector): + ExceptionScriptSelector.setObjectName("ExceptionScriptSelector") + ExceptionScriptSelector.setWindowModality(QtCore.Qt.WindowModal) + ExceptionScriptSelector.resize(507, 284) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(1) + sizePolicy.setVerticalStretch(1) + sizePolicy.setHeightForWidth(ExceptionScriptSelector.sizePolicy().hasHeightForWidth()) + ExceptionScriptSelector.setSizePolicy(sizePolicy) + self.verticalLayout = QtWidgets.QVBoxLayout(ExceptionScriptSelector) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.label = QtWidgets.QLabel(ExceptionScriptSelector) + self.label.setObjectName("label") + self.verticalLayout_2.addWidget(self.label) + self.selected_scripts = QtWidgets.QListWidget(ExceptionScriptSelector) + self.selected_scripts.setObjectName("selected_scripts") + self.verticalLayout_2.addWidget(self.selected_scripts) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setContentsMargins(-1, -1, -1, 0) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.label_3 = QtWidgets.QLabel(ExceptionScriptSelector) + self.label_3.setObjectName("label_3") + self.horizontalLayout_2.addWidget(self.label_3) + self.weighting_selector = QtWidgets.QSpinBox(ExceptionScriptSelector) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.weighting_selector.sizePolicy().hasHeightForWidth()) + self.weighting_selector.setSizePolicy(sizePolicy) + self.weighting_selector.setMaximumSize(QtCore.QSize(50, 16777215)) + self.weighting_selector.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.weighting_selector.setMaximum(100) + self.weighting_selector.setObjectName("weighting_selector") + self.horizontalLayout_2.addWidget(self.weighting_selector) + self.verticalLayout_2.addLayout(self.horizontalLayout_2) + self.horizontalLayout.addLayout(self.verticalLayout_2) + self.verticalLayout_3 = QtWidgets.QVBoxLayout() + self.verticalLayout_3.setObjectName("verticalLayout_3") + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_3.addItem(spacerItem) + self.move_up = QtWidgets.QToolButton(ExceptionScriptSelector) + self.move_up.setText("") + icon = QtGui.QIcon.fromTheme(":/images/16x16/go-up.png") + self.move_up.setIcon(icon) + self.move_up.setObjectName("move_up") + self.verticalLayout_3.addWidget(self.move_up) + self.add_script = QtWidgets.QToolButton(ExceptionScriptSelector) + self.add_script.setText("") + icon = QtGui.QIcon.fromTheme(":/images/16x16/go-previous.png") + self.add_script.setIcon(icon) + self.add_script.setObjectName("add_script") + self.verticalLayout_3.addWidget(self.add_script) + self.remove_script = QtWidgets.QToolButton(ExceptionScriptSelector) + self.remove_script.setText("") + icon = QtGui.QIcon.fromTheme(":/images/16x16/go-next.png") + self.remove_script.setIcon(icon) + self.remove_script.setObjectName("remove_script") + self.verticalLayout_3.addWidget(self.remove_script) + self.move_down = QtWidgets.QToolButton(ExceptionScriptSelector) + self.move_down.setText("") + icon = QtGui.QIcon.fromTheme(":/images/16x16/go-down.png") + self.move_down.setIcon(icon) + self.move_down.setObjectName("move_down") + self.verticalLayout_3.addWidget(self.move_down) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_3.addItem(spacerItem1) + self.horizontalLayout.addLayout(self.verticalLayout_3) + self.verticalLayout_4 = QtWidgets.QVBoxLayout() + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.label_2 = QtWidgets.QLabel(ExceptionScriptSelector) + self.label_2.setObjectName("label_2") + self.verticalLayout_4.addWidget(self.label_2) + self.available_scripts = QtWidgets.QListWidget(ExceptionScriptSelector) + self.available_scripts.setObjectName("available_scripts") + self.verticalLayout_4.addWidget(self.available_scripts) + self.horizontalLayout.addLayout(self.verticalLayout_4) + self.verticalLayout.addLayout(self.horizontalLayout) + self.button_box = QtWidgets.QDialogButtonBox(ExceptionScriptSelector) + self.button_box.setOrientation(QtCore.Qt.Horizontal) + self.button_box.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Save) + self.button_box.setObjectName("button_box") + self.verticalLayout.addWidget(self.button_box) + + self.retranslateUi(ExceptionScriptSelector) + QtCore.QMetaObject.connectSlotsByName(ExceptionScriptSelector) + + def retranslateUi(self, ExceptionScriptSelector): + _translate = QtCore.QCoreApplication.translate + ExceptionScriptSelector.setWindowTitle(_("Exception Script Selector")) + self.label.setText(_("Selected Scripts")) + self.label_3.setText(_("Selected script match threshold:")) + self.move_up.setToolTip(_("Move selected script up")) + self.add_script.setToolTip(_("Add to selected scripts")) + self.remove_script.setToolTip(_("Remove selected script")) + self.move_down.setToolTip(_("Move selected script down")) + self.label_2.setText(_("Available Scripts")) diff --git a/picard/ui/ui_options_metadata.py b/picard/ui/ui_options_metadata.py index 24191fba5..cb8c27f05 100644 --- a/picard/ui/ui_options_metadata.py +++ b/picard/ui/ui_options_metadata.py @@ -41,64 +41,17 @@ class Ui_MetadataOptionsPage(object): self.translate_artist_names_script_exception = QtWidgets.QCheckBox(self.metadata_groupbox) self.translate_artist_names_script_exception.setObjectName("translate_artist_names_script_exception") self.verticalLayout_3.addWidget(self.translate_artist_names_script_exception) - self.ignore_script_frame = QtWidgets.QFrame(self.metadata_groupbox) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.MinimumExpanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.ignore_script_frame.sizePolicy().hasHeightForWidth()) - self.ignore_script_frame.setSizePolicy(sizePolicy) - self.ignore_script_frame.setMinimumSize(QtCore.QSize(0, 0)) - self.ignore_script_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.ignore_script_frame.setFrameShadow(QtWidgets.QFrame.Raised) - self.ignore_script_frame.setObjectName("ignore_script_frame") - self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.ignore_script_frame) - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.ignore_tx_scripts = QtWidgets.QListWidget(self.ignore_script_frame) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.ignore_tx_scripts.sizePolicy().hasHeightForWidth()) - self.ignore_tx_scripts.setSizePolicy(sizePolicy) - self.ignore_tx_scripts.setObjectName("ignore_tx_scripts") - self.horizontalLayout_3.addWidget(self.ignore_tx_scripts) - self.frame = QtWidgets.QFrame(self.ignore_script_frame) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) - self.frame.setSizePolicy(sizePolicy) - self.frame.setMinimumSize(QtCore.QSize(180, 0)) - self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.frame.setFrameShadow(QtWidgets.QFrame.Raised) - self.frame.setObjectName("frame") - self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame) - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.label_2 = QtWidgets.QLabel(self.frame) - self.label_2.setWordWrap(True) - self.label_2.setObjectName("label_2") - self.verticalLayout_2.addWidget(self.label_2) - self.horizontalLayout_2 = QtWidgets.QHBoxLayout() - self.horizontalLayout_2.setContentsMargins(0, -1, -1, -1) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.label = QtWidgets.QLabel(self.frame) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) - self.label.setSizePolicy(sizePolicy) - self.label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) - self.label.setObjectName("label") - self.horizontalLayout_2.addWidget(self.label) - self.minimum_weighting = QtWidgets.QSpinBox(self.frame) - self.minimum_weighting.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) - self.minimum_weighting.setMaximum(100) - self.minimum_weighting.setObjectName("minimum_weighting") - self.horizontalLayout_2.addWidget(self.minimum_weighting) - self.verticalLayout_2.addLayout(self.horizontalLayout_2) - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem) - self.horizontalLayout_3.addWidget(self.frame) - self.verticalLayout_3.addWidget(self.ignore_script_frame) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setContentsMargins(-1, -1, -1, 0) + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.selected_scripts = QtWidgets.QLineEdit(self.metadata_groupbox) + self.selected_scripts.setReadOnly(True) + self.selected_scripts.setObjectName("selected_scripts") + self.horizontalLayout_4.addWidget(self.selected_scripts) + self.select_scripts = QtWidgets.QPushButton(self.metadata_groupbox) + self.select_scripts.setObjectName("select_scripts") + self.horizontalLayout_4.addWidget(self.select_scripts) + self.verticalLayout_3.addLayout(self.horizontalLayout_4) self.standardize_artists = QtWidgets.QCheckBox(self.metadata_groupbox) self.standardize_artists.setObjectName("standardize_artists") self.verticalLayout_3.addWidget(self.standardize_artists) @@ -148,8 +101,8 @@ class Ui_MetadataOptionsPage(object): self.va_name.setObjectName("va_name") self.gridlayout.addWidget(self.va_name, 1, 0, 1, 1) self.verticalLayout.addWidget(self.custom_fields_groupbox) - spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem1) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout.addItem(spacerItem) self.label_6.setBuddy(self.va_name_default) self.label_7.setBuddy(self.nat_name_default) @@ -173,8 +126,7 @@ class Ui_MetadataOptionsPage(object): self.translate_artist_names.setText(_("Translate artist names to these locales where possible:")) self.select_locales.setText(_("Select")) self.translate_artist_names_script_exception.setText(_("Ignore artist name translation for these scripts:")) - self.label_2.setText(_("
Only scripts where the percentage of the artist name that is written using that script are above the specified minimum weighting will be considered.
")) - self.label.setText(_("Minimum Weighting:")) + self.select_scripts.setText(_("Select")) self.standardize_artists.setText(_("Use standardized artist names")) self.standardize_instruments.setText(_("Use standardized instrument and vocal credits")) self.convert_punctuation.setText(_("Convert Unicode punctuation characters to ASCII")) diff --git a/ui/exception_script_selector.ui b/ui/exception_script_selector.ui new file mode 100644 index 000000000..dc3f2d70e --- /dev/null +++ b/ui/exception_script_selector.ui @@ -0,0 +1,194 @@ + +