diff --git a/src/calibre/gui2/dialogs/enum_values_edit.py b/src/calibre/gui2/dialogs/enum_values_edit.py
index 503679f2ac..552b23cd95 100644
--- a/src/calibre/gui2/dialogs/enum_values_edit.py
+++ b/src/calibre/gui2/dialogs/enum_values_edit.py
@@ -50,6 +50,8 @@ class EnumValuesEdit(QDialog):
bbox = QVBoxLayout()
bbox.addStretch(10)
+ self.move_up_button= QToolButton()
+ self.move_up_button.setIcon(QIcon.ic('arrow-up.png'))
self.del_button = QToolButton()
self.del_button.setIcon(QIcon.ic('trash.png'))
self.del_button.setToolTip(_('Remove the currently selected value. The '
@@ -57,16 +59,14 @@ class EnumValuesEdit(QDialog):
self.ins_button = QToolButton()
self.ins_button.setIcon(QIcon.ic('plus.png'))
self.ins_button.setToolTip(_('Add a new permissible value'))
- self.move_up_button= QToolButton()
- self.move_up_button.setIcon(QIcon.ic('arrow-up.png'))
self.move_down_button= QToolButton()
self.move_down_button.setIcon(QIcon.ic('arrow-down.png'))
+ bbox.addWidget(self.move_up_button)
+ bbox.addStretch(1)
bbox.addWidget(self.del_button)
bbox.addStretch(1)
bbox.addWidget(self.ins_button)
bbox.addStretch(1)
- bbox.addWidget(self.move_up_button)
- bbox.addStretch(1)
bbox.addWidget(self.move_down_button)
bbox.addStretch(10)
l.addItem(bbox, 0, 0)
diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py
index 82b85fd825..c8e80234d9 100644
--- a/src/calibre/gui2/dialogs/metadata_bulk.py
+++ b/src/calibre/gui2/dialogs/metadata_bulk.py
@@ -37,7 +37,7 @@ from calibre.gui2 import UNDEFINED_QDATETIME, FunctionDispatcher, error_dialog,
from calibre.gui2.custom_column_widgets import populate_metadata_page
from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog
from calibre.gui2.dialogs.tag_editor import TagEditor
-from calibre.gui2.dialogs.template_line_editor import TemplateLineEditor
+from calibre.gui2.dialogs.template_dialog import TemplateDialog
from calibre.gui2.widgets import LineEditECM, setup_status_actions, update_status_actions
from calibre.startup import connect_lambda
from calibre.utils.config import JSONConfig, dynamic, prefs, tweaks
@@ -749,8 +749,10 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
def prepare_search_and_replace(self):
self.search_for.initialize('bulk_edit_search_for')
self.replace_with.initialize('bulk_edit_replace_with')
- self.s_r_template.setLineEdit(TemplateLineEditor(self.s_r_template))
self.s_r_template.initialize('bulk_edit_template')
+ self.s_r_template.editTextChanged[native_string_type].connect(self.s_r_paint_results)
+ self.s_r_edit_template_button.setIcon(QIcon.ic('edit_input.png'))
+ self.s_r_edit_template_button.clicked.connect(self.s_r_edit_template_button_clicked)
self.test_text.initialize('bulk_edit_test_test')
self.all_fields = ['']
self.writable_fields = ['']
@@ -858,7 +860,6 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
self.case_sensitive.stateChanged.connect(self.s_r_paint_results)
self.s_r_src_ident.currentIndexChanged.connect(self.s_r_identifier_type_changed)
self.s_r_dst_ident.textChanged.connect(self.s_r_paint_results)
- self.s_r_template.lost_focus.connect(self.s_r_template_changed)
self.central_widget.setCurrentIndex(0)
self.search_for.completer().setCaseSensitivity(Qt.CaseSensitivity.CaseSensitive)
@@ -934,8 +935,20 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
def s_r_display_bounds_changed(self, i):
self.s_r_search_field_changed(self.search_field.currentIndex())
- def s_r_template_changed(self):
- self.s_r_search_field_changed(self.search_field.currentIndex())
+ def s_r_edit_template_button_clicked(self):
+ try:
+ mi = []
+ for c,_id in enumerate(self.ids):
+ if c >= self.s_r_number_of_books:
+ break
+ mi.append(self.db.new_api.get_proxy_metadata(_id))
+ except Exception as e:
+ prints(f'TemplateLineEditor: exception fetching metadata: {str(e)}')
+ mi = None
+ t = TemplateDialog(self, self.s_r_template.text(), mi=mi)
+ t.setWindowTitle(_('Edit search/replace template'))
+ if t.exec():
+ self.s_r_template.setText(t.rule[1])
def s_r_identifier_type_changed(self, idx):
self.s_r_search_field_changed(self.search_field.currentIndex())
@@ -943,12 +956,14 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
def s_r_search_field_changed(self, idx):
self.s_r_template.setVisible(False)
+ self.s_r_edit_template_button.setVisible(False)
self.template_label.setVisible(False)
self.s_r_src_ident_label.setVisible(False)
self.s_r_src_ident.setVisible(False)
if idx == 1: # Template
self.s_r_template.setVisible(True)
self.template_label.setVisible(True)
+ self.s_r_edit_template_button.setVisible(True)
elif self.s_r_sf_itemdata(idx) == 'identifiers':
self.s_r_src_ident_label.setVisible(True)
self.s_r_src_ident.setVisible(True)
@@ -1523,8 +1538,6 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
set_index(self.search_field, 'search_field')
set_text(self.s_r_template, 's_r_template')
- self.s_r_template_changed() # simulate gain/loss of focus
-
set_index(self.s_r_src_ident, 's_r_src_ident')
set_text(self.s_r_dst_ident, 's_r_dst_ident')
set_text(self.search_for, 'search_for')
diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui
index 73190767b6..324e4ea178 100644
--- a/src/calibre/gui2/dialogs/metadata_bulk.ui
+++ b/src/calibre/gui2/dialogs/metadata_bulk.ui
@@ -984,6 +984,13 @@ as that of the first selected book.
+ -
+
+
+ Click to open the template tester
+
+
+
-