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 #!/usr/bin/env python
# License: GPLv3 Copyright: 2020, Charles Haley # License: GPLv3 Copyright: 2020, Charles Haley
from qt.core import (QDialog, QColor, QDialogButtonBox, QHeaderView, from qt.core import (Qt, QDialog, QColor, QDialogButtonBox, QHeaderView,
QGridLayout, QTableWidget, QGridLayout, QTableWidget, QTableWidgetItem, QVBoxLayout,
QTableWidgetItem, QVBoxLayout, QToolButton, QIcon, QToolButton, QIcon, QAbstractItemView, QComboBox)
QAbstractItemView, QComboBox)
from calibre.gui2 import error_dialog, gprefs from calibre.gui2 import error_dialog, gprefs
@ -53,12 +52,13 @@ class EnumValuesEdit(QDialog):
t.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) t.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
tl.addWidget(t) tl.addWidget(t)
self.key = key
self.fm = fm = db.field_metadata[key] self.fm = fm = db.field_metadata[key]
permitted_values = fm.get('display', {}).get('enum_values', '') permitted_values = fm.get('display', {}).get('enum_values', '')
colors = fm.get('display', {}).get('enum_colors', '') colors = fm.get('display', {}).get('enum_colors', '')
t.setRowCount(len(permitted_values)) t.setRowCount(len(permitted_values))
for i,v in enumerate(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) c = self.make_color_combobox(i, -1)
if colors: if colors:
c.setCurrentIndex(c.findText(colors[i])) c.setCurrentIndex(c.findText(colors[i]))
@ -85,10 +85,19 @@ class EnumValuesEdit(QDialog):
sz.setHeight(max(sz.height(), 400)) sz.setHeight(max(sz.height(), 400))
return sz 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): def make_color_combobox(self, row, dex):
c = QComboBox(self) c = QComboBox(self)
c.addItem('') c.addItem('')
c.addItems(QColor.colorNames()) 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) self.table.setCellWidget(row, 1, c)
if dex >= 0: if dex >= 0:
c.setCurrentIndex(dex) c.setCurrentIndex(dex)
@ -105,12 +114,12 @@ class EnumValuesEdit(QDialog):
self.move_row(row, -1) self.move_row(row, -1)
def move_row(self, row, direction): 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() c = self.table.cellWidget(row, 1).currentIndex()
self.table.removeRow(row) self.table.removeRow(row)
row += direction row += direction
self.table.insertRow(row) self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(t)) self.table.setItem(row, 0, t)
self.make_color_combobox(row, c) self.make_color_combobox(row, c)
self.table.setCurrentCell(row, 0) self.table.setCurrentCell(row, 0)
@ -135,11 +144,8 @@ class EnumValuesEdit(QDialog):
_('Select a cell before clicking the button'), show=True) _('Select a cell before clicking the button'), show=True)
return return
self.table.insertRow(row) self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem()) self.make_name_item(row, '')
c = QComboBox(self) self.make_color_combobox(row, -1)
c.addItem('')
c.addItems(QColor.colorNames())
self.table.setCellWidget(row, 1, c)
def save_geometry(self): def save_geometry(self):
super().save_geometry(gprefs, 'enum-values-edit-geometry') super().save_geometry(gprefs, 'enum-values-edit-geometry')
@ -148,12 +154,18 @@ class EnumValuesEdit(QDialog):
disp = self.fm['display'] disp = self.fm['display']
values = [] values = []
colors = [] colors = []
id_map = {}
for i in range(0, self.table.rowCount()): 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: if not v:
error_dialog(self, _('Empty value'), error_dialog(self, _('Empty value'),
_('Empty values are not allowed'), show=True) _('Empty values are not allowed'), show=True)
return 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) values.append(v)
c = str(self.table.cellWidget(i, 1).currentText()) c = str(self.table.cellWidget(i, 1).currentText())
if c: if c:
@ -177,8 +189,11 @@ class EnumValuesEdit(QDialog):
disp['enum_colors'] = colors disp['enum_colors'] = colors
self.db.set_custom_column_metadata(self.fm['colnum'], display=disp, self.db.set_custom_column_metadata(self.fm['colnum'], display=disp,
update_last_modified=True) update_last_modified=True)
if id_map:
self.db.new_api.rename_items(self.key, id_map)
self.save_geometry() self.save_geometry()
return QDialog.accept(self) return QDialog.accept(self)
def reject(self): def reject(self):
self.save_geometry()
return QDialog.reject(self) 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.Ok).setText(_('&OK'))
self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setText(_('&Cancel')) self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setText(_('&Cancel'))
self.buttonBox.accepted.connect(self.accepted) self.buttonBox.accepted.connect(self.accepted)
self.buttonBox.rejected.connect(self.rejected)
self.search_box.initialize('tag_list_search_box_' + cat_name) self.search_box.initialize('tag_list_search_box_' + cat_name)
le = self.search_box.lineEdit() le = self.search_box.lineEdit()
@ -682,3 +683,6 @@ class TagListEditor(QDialog, Ui_TagListEditor):
def accepted(self): 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.links = {self.table.item(r, 0).text():self.table.item(r, 3).text() for r in range(self.table.rowCount())}
self.save_geometry() self.save_geometry()
def rejected(self):
self.save_geometry()