%PDF- %PDF-
Direktori : /lib/calibre/calibre/gui2/dialogs/ |
Current File : //lib/calibre/calibre/gui2/dialogs/enum_values_edit.py |
#!/usr/bin/env python3 # License: GPLv3 Copyright: 2020, Charles Haley from qt.core import (QDialog, QColor, QDialogButtonBox, QHeaderView, QApplication, QGridLayout, QTableWidget, QTableWidgetItem, QVBoxLayout, QToolButton, QIcon, QAbstractItemView, QComboBox) from calibre.gui2 import error_dialog, gprefs class EnumValuesEdit(QDialog): def __init__(self, parent, db, key): QDialog.__init__(self, parent) self.setWindowTitle(_('Edit permissible values for {0}').format(key)) self.db = db l = QGridLayout() bbox = QVBoxLayout() bbox.addStretch(10) self.del_button = QToolButton() self.del_button.setIcon(QIcon(I('trash.png'))) self.del_button.setToolTip(_('Remove the currently selected value')) self.ins_button = QToolButton() self.ins_button.setIcon(QIcon(I('plus.png'))) self.ins_button.setToolTip(_('Add a new permissible value')) self.move_up_button= QToolButton() self.move_up_button.setIcon(QIcon(I('arrow-up.png'))) self.move_down_button= QToolButton() self.move_down_button.setIcon(QIcon(I('arrow-down.png'))) 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) self.del_button.clicked.connect(self.del_line) self.all_colors = {str(s) for s in list(QColor.colorNames())} tl = QVBoxLayout() l.addItem(tl, 0, 1) self.table = t = QTableWidget(parent) t.setColumnCount(2) t.setRowCount(1) t.setHorizontalHeaderLabels([_('Value'), _('Color')]) t.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) tl.addWidget(t) 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)) c = self.make_color_combobox(i, -1) if colors: c.setCurrentIndex(c.findText(colors[i])) else: c.setCurrentIndex(0) t.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) self.setLayout(l) self.bb = bb = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel) bb.accepted.connect(self.accept) bb.rejected.connect(self.reject) l.addWidget(bb, 1, 0, 1, 2) self.ins_button.clicked.connect(self.ins_button_clicked) self.move_down_button.clicked.connect(self.move_down_clicked) self.move_up_button.clicked.connect(self.move_up_clicked) geom = gprefs.get('enum-values-edit-geometry') if geom is not None: QApplication.instance().safe_restore_geometry(self, geom) def sizeHint(self): sz = QDialog.sizeHint(self) sz.setWidth(max(sz.width(), 600)) sz.setHeight(max(sz.height(), 400)) return sz def make_color_combobox(self, row, dex): c = QComboBox(self) c.addItem('') c.addItems(QColor.colorNames()) self.table.setCellWidget(row, 1, c) if dex >= 0: c.setCurrentIndex(dex) return c def move_up_clicked(self): row = self.table.currentRow() if row < 0: error_dialog(self, _('Select a cell'), _('Select a cell before clicking the button'), show=True) return if row == 0: return self.move_row(row, -1) def move_row(self, row, direction): t = self.table.item(row, 0).text() 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.make_color_combobox(row, c) self.table.setCurrentCell(row, 0) def move_down_clicked(self): row = self.table.currentRow() if row < 0: error_dialog(self, _('Select a cell'), _('Select a cell before clicking the button'), show=True) return if row >= self.table.rowCount() - 1: return self.move_row(row, 1) def del_line(self): if self.table.currentRow() >= 0: self.table.removeRow(self.table.currentRow()) def ins_button_clicked(self): row = self.table.currentRow() if row < 0: error_dialog(self, _('Select a cell'), _('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) def save_geometry(self): gprefs.set('enum-values-edit-geometry', bytearray(self.saveGeometry())) def accept(self): disp = self.fm['display'] values = [] colors = [] for i in range(0, self.table.rowCount()): v = str(self.table.item(i, 0).text()) if not v: error_dialog(self, _('Empty value'), _('Empty values are not allowed'), show=True) return values.append(v) c = str(self.table.cellWidget(i, 1).currentText()) if c: colors.append(c) l_lower = [v.lower() for v in values] for i,v in enumerate(l_lower): if v in l_lower[i+1:]: error_dialog(self, _('Duplicate value'), _('The value "{0}" is in the list more than ' 'once, perhaps with different case').format(values[i]), show=True) return if colors and len(colors) != len(values): error_dialog(self, _('Invalid colors specification'), _( 'Either all values or no values must have colors'), show=True) return disp['enum_values'] = values disp['enum_colors'] = colors self.db.set_custom_column_metadata(self.fm['colnum'], display=disp, update_last_modified=True) self.save_geometry() return QDialog.accept(self) def reject(self): return QDialog.reject(self)