Fixes #2015114 [Enhancement: Offer to rename enumerated values](https://bugs.launchpad.net/calibre/+bug/2015114)
This commit is contained in:
Kovid Goyal 2023-04-04 20:23:12 +05:30
commit 88144eae48
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 32 additions and 13 deletions

View File

@ -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('<p>' + _('Check the box if you change the value and want it renamed in books where it is used') + '</p>')
self.table.setItem(row, 0, it)
def make_color_combobox(self, row, dex):
c = QComboBox(self)
c.addItem('')
c.addItems(QColor.colorNames())
c.setToolTip('<p>' + _('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') + '</p>')
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)

View File

@ -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()