diff --git a/src/calibre/gui2/dialogs/enum_values_edit.py b/src/calibre/gui2/dialogs/enum_values_edit.py index 564d1dca93..8a5884cf3d 100644 --- a/src/calibre/gui2/dialogs/enum_values_edit.py +++ b/src/calibre/gui2/dialogs/enum_values_edit.py @@ -1,10 +1,9 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2020, Charles Haley -from qt.core import (QDialog, QColor, QDialogButtonBox, QHeaderView, - QGridLayout, QTableWidget, - QTableWidgetItem, QVBoxLayout, QToolButton, QIcon, - QAbstractItemView, QComboBox) +from qt.core import (Qt, QDialog, QColor, QDialogButtonBox, QHeaderView, + QGridLayout, QTableWidget, QTableWidgetItem, QVBoxLayout, + QToolButton, QIcon, QAbstractItemView, QComboBox) from calibre.gui2 import error_dialog, gprefs @@ -53,12 +52,13 @@ class EnumValuesEdit(QDialog): t.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) tl.addWidget(t) + self.key = key self.fm = fm = db.field_metadata[key] permitted_values = fm.get('display', {}).get('enum_values', '') colors = fm.get('display', {}).get('enum_colors', '') t.setRowCount(len(permitted_values)) for i,v in enumerate(permitted_values): - t.setItem(i, 0, QTableWidgetItem(v)) + self.make_name_item(i, v) c = self.make_color_combobox(i, -1) if colors: c.setCurrentIndex(c.findText(colors[i])) @@ -85,10 +85,19 @@ class EnumValuesEdit(QDialog): sz.setHeight(max(sz.height(), 400)) return sz + def make_name_item(self, row, txt): + it = QTableWidgetItem(txt) + it.setData(Qt.ItemDataRole.UserRole, txt) + it.setCheckState(Qt.CheckState.Unchecked) + it.setToolTip('
' + _('Check the box if you change the value and want it renamed in books where it is used') + '
') + self.table.setItem(row, 0, it) + def make_color_combobox(self, row, dex): c = QComboBox(self) c.addItem('') c.addItems(QColor.colorNames()) + c.setToolTip('' + _('Selects the color of the text when displayed in the book list. ' + 'Either all rows must have a color or no rows have a color') + '
') self.table.setCellWidget(row, 1, c) if dex >= 0: c.setCurrentIndex(dex) @@ -105,12 +114,12 @@ class EnumValuesEdit(QDialog): self.move_row(row, -1) def move_row(self, row, direction): - t = self.table.item(row, 0).text() + t = self.table.takeItem(row, 0) c = self.table.cellWidget(row, 1).currentIndex() self.table.removeRow(row) row += direction self.table.insertRow(row) - self.table.setItem(row, 0, QTableWidgetItem(t)) + self.table.setItem(row, 0, t) self.make_color_combobox(row, c) self.table.setCurrentCell(row, 0) @@ -135,11 +144,8 @@ class EnumValuesEdit(QDialog): _('Select a cell before clicking the button'), show=True) return self.table.insertRow(row) - self.table.setItem(row, 0, QTableWidgetItem()) - c = QComboBox(self) - c.addItem('') - c.addItems(QColor.colorNames()) - self.table.setCellWidget(row, 1, c) + self.make_name_item(row, '') + self.make_color_combobox(row, -1) def save_geometry(self): super().save_geometry(gprefs, 'enum-values-edit-geometry') @@ -148,12 +154,18 @@ class EnumValuesEdit(QDialog): disp = self.fm['display'] values = [] colors = [] + id_map = {} for i in range(0, self.table.rowCount()): - v = str(self.table.item(i, 0).text()) + it = self.table.item(i, 0) + v = str(it.text()) if not v: error_dialog(self, _('Empty value'), _('Empty values are not allowed'), show=True) return + ov = str(it.data(Qt.ItemDataRole.UserRole)) + if v != ov and it.checkState() == Qt.CheckState.Checked: + fid = self.db.new_api.get_item_id(self.key, ov) + id_map[fid] = v values.append(v) c = str(self.table.cellWidget(i, 1).currentText()) if c: @@ -177,8 +189,11 @@ class EnumValuesEdit(QDialog): disp['enum_colors'] = colors self.db.set_custom_column_metadata(self.fm['colnum'], display=disp, update_last_modified=True) + if id_map: + self.db.new_api.rename_items(self.key, id_map) self.save_geometry() return QDialog.accept(self) def reject(self): + self.save_geometry() return QDialog.reject(self) diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index f7a827bc12..f3236b3eb4 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -213,6 +213,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setText(_('&OK')) self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setText(_('&Cancel')) self.buttonBox.accepted.connect(self.accepted) + self.buttonBox.rejected.connect(self.rejected) self.search_box.initialize('tag_list_search_box_' + cat_name) le = self.search_box.lineEdit() @@ -682,3 +683,6 @@ class TagListEditor(QDialog, Ui_TagListEditor): def accepted(self): self.links = {self.table.item(r, 0).text():self.table.item(r, 3).text() for r in range(self.table.rowCount())} self.save_geometry() + + def rejected(self): + self.save_geometry()