Enhancement #2015114: Offer to rename enumerated values

This commit is contained in:
Charles Haley 2023-04-04 15:29:26 +01:00
parent c33df89ce2
commit cbcb17655c
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()