diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.py b/src/calibre/gui2/catalog/catalog_epub_mobi.py index da9139a25e..a438f2ddb5 100644 --- a/src/calibre/gui2/catalog/catalog_epub_mobi.py +++ b/src/calibre/gui2/catalog/catalog_epub_mobi.py @@ -465,8 +465,7 @@ class GenericRulesTable(QTableWidget): self.db = db QTableWidget.__init__(self) self.setObjectName(object_name) - self.layout = QHBoxLayout() - parent_gb.setLayout(self.layout) + self.layout = parent_gb.layout() # Add ourselves to the layout #print("verticalHeader: %s" % dir(self.verticalHeader())) @@ -537,7 +536,7 @@ class GenericRulesTable(QTableWidget): def create_blank_row_data(self): ''' - ovverride + override ''' pass @@ -570,6 +569,9 @@ class GenericRulesTable(QTableWidget): self.clearSelection() def get_data(self): + ''' + override + ''' pass def move_row_down(self): @@ -597,6 +599,7 @@ class GenericRulesTable(QTableWidget): # Populate it with the saved data self.populate_table_row(src_row, saved_data) + self.blockSignals(False) scroll_to_row = last_sel_row + 1 if scroll_to_row < self.rowCount() - 1: @@ -650,23 +653,21 @@ class GenericRulesTable(QTableWidget): self.selectRow(row) self.scrollToItem(self.currentItem()) - def tweak_height(self, height=4): - for i in range(min(3,self.rowCount())): - height += self.rowHeight(i) - height += self.verticalHeader().sizeHint().height() - print("computed table height for %d rows: %d" % (self.rowCount(),height, )) - self.setMinimumSize(QSize(16777215, height)) - self.setMaximumSize(QSize(16777215, height)) - class ExclusionRules(GenericRulesTable): + COLUMNS = { 'ENABLED':{'ordinal': 0, 'name': ''}, + 'NAME': {'ordinal': 1, 'name': 'Name'}, + 'FIELD': {'ordinal': 2, 'name': 'Field'}, + 'PATTERN': {'ordinal': 3, 'name': 'Value'},} + def __init__(self, parent_gb_hl, object_name, rules, eligible_custom_fields, db): super(ExclusionRules, self).__init__(parent_gb_hl, object_name, rules, eligible_custom_fields, db) self._init_table_widget() self._initialize() def _init_table_widget(self): - header_labels = ['','Name','Field','Value'] + header_labels = [self.COLUMNS[index]['name'] \ + for index in sorted(self.COLUMNS.keys(), key=lambda c: self.COLUMNS[c]['ordinal'])] self.setColumnCount(len(header_labels)) self.setHorizontalHeaderLabels(header_labels) self.setSortingEnabled(False) @@ -682,10 +683,10 @@ class ExclusionRules(GenericRulesTable): def convert_row_to_data(self, row): data = self.create_blank_row_data() data['ordinal'] = row - data['enabled'] = self.item(row,0).checkState() == Qt.Checked - data['name'] = unicode(self.cellWidget(row,1).text()).strip() - data['field'] = unicode(self.cellWidget(row,2).currentText()).strip() - data['pattern'] = unicode(self.cellWidget(row,3).currentText()).strip() + data['enabled'] = self.item(row,self.COLUMNS['ENABLED']['ordinal']).checkState() == Qt.Checked + data['name'] = unicode(self.cellWidget(row,self.COLUMNS['NAME']['ordinal']).text()).strip() + data['field'] = unicode(self.cellWidget(row,self.COLUMNS['FIELD']['ordinal']).currentText()).strip() + data['pattern'] = unicode(self.cellWidget(row,self.COLUMNS['PATTERN']['ordinal']).currentText()).strip() return data def create_blank_row_data(self): @@ -740,18 +741,18 @@ class ExclusionRules(GenericRulesTable): # Entry point self.blockSignals(True) - # Column 0: Enabled - self.setItem(row, 0, CheckableTableWidgetItem(data['enabled'])) + # Enabled + self.setItem(row, self.COLUMNS['ENABLED']['ordinal'], CheckableTableWidgetItem(data['enabled'])) - # Column 1: Rule name - set_rule_name_in_row(row, 1, name=data['name']) + # Rule name + set_rule_name_in_row(row, self.COLUMNS['NAME']['ordinal'], name=data['name']) - # Column 2: Source field - source_combo = set_source_field_in_row(row, 2, field=data['field']) + # Source field + source_combo = set_source_field_in_row(row, self.COLUMNS['FIELD']['ordinal'], field=data['field']) - # Column 3: Pattern + # Pattern # The contents of the Pattern field is driven by the Source field - self.source_index_changed(source_combo, row, 3, pattern=data['pattern']) + self.source_index_changed(source_combo, row, self.COLUMNS['PATTERN']['ordinal'], pattern=data['pattern']) self.blockSignals(False) @@ -775,17 +776,24 @@ class ExclusionRules(GenericRulesTable): values = ['any date','unspecified'] values_combo = ComboBox(self, values, pattern) - self.setCellWidget(row, 3, values_combo) + self.setCellWidget(row, self.COLUMNS['PATTERN']['ordinal'], values_combo) class PrefixRules(GenericRulesTable): + COLUMNS = { 'ENABLED':{'ordinal': 0, 'name': ''}, + 'NAME': {'ordinal': 1, 'name': 'Name'}, + 'PREFIX': {'ordinal': 2, 'name': 'Prefix'}, + 'FIELD': {'ordinal': 3, 'name': 'Field'}, + 'PATTERN':{'ordinal': 4, 'name': 'Value'},} + def __init__(self, parent_gb_hl, object_name, rules, eligible_custom_fields, db): super(PrefixRules, self).__init__(parent_gb_hl, object_name, rules, eligible_custom_fields, db) self._init_table_widget() self._initialize() def _init_table_widget(self): - header_labels = ['','Name','Prefix','Field','Value'] + header_labels = [self.COLUMNS[index]['name'] \ + for index in sorted(self.COLUMNS.keys(), key=lambda c: self.COLUMNS[c]['ordinal'])] self.setColumnCount(len(header_labels)) self.setHorizontalHeaderLabels(header_labels) self.setSortingEnabled(False) @@ -803,10 +811,10 @@ class PrefixRules(GenericRulesTable): data = self.create_blank_row_data() data['ordinal'] = row data['enabled'] = self.item(row,0).checkState() == Qt.Checked - data['name'] = unicode(self.cellWidget(row,1).text()).strip() - data['prefix'] = unicode(self.cellWidget(row,2).currentText()).strip() - data['field'] = unicode(self.cellWidget(row,3).currentText()).strip() - data['pattern'] = unicode(self.cellWidget(row,4).currentText()).strip() + data['name'] = unicode(self.cellWidget(row,self.COLUMNS['NAME']['ordinal']).text()).strip() + data['prefix'] = unicode(self.cellWidget(row,self.COLUMNS['PREFIX']['ordinal']).currentText()).strip() + data['field'] = unicode(self.cellWidget(row,self.COLUMNS['FIELD']['ordinal']).currentText()).strip() + data['pattern'] = unicode(self.cellWidget(row,self.COLUMNS['PATTERN']['ordinal']).currentText()).strip() return data def create_blank_row_data(self): @@ -1003,22 +1011,21 @@ class PrefixRules(GenericRulesTable): self.blockSignals(True) #print("prefix_rules_populate_table_row processing rule:\n%s\n" % data) - # Column 0: Enabled - self.setItem(row, 0, CheckableTableWidgetItem(data['enabled'])) + # Enabled + self.setItem(row, self.COLUMNS['ENABLED']['ordinal'], CheckableTableWidgetItem(data['enabled'])) - # Column 1: Rule name - #rule_name = QTableWidgetItem(data['name']) - set_rule_name_in_row(row, 1, name=data['name']) + # Rule name + set_rule_name_in_row(row, self.COLUMNS['NAME']['ordinal'], name=data['name']) - # Column 2: Prefix - set_prefix_field_in_row(row, 2, field=data['prefix']) + # Prefix + set_prefix_field_in_row(row, self.COLUMNS['PREFIX']['ordinal'], field=data['prefix']) - # Column 3: Source field - source_combo = set_source_field_in_row(row, 3, field=data['field']) + # Source field + source_combo = set_source_field_in_row(row, self.COLUMNS['FIELD']['ordinal'], field=data['field']) - # Column 4: Pattern + # Pattern # The contents of the Pattern field is driven by the Source field - self.source_index_changed(source_combo, row, 4, pattern=data['pattern']) + self.source_index_changed(source_combo, row, self.COLUMNS['PATTERN']['ordinal'], pattern=data['pattern']) self.blockSignals(False) @@ -1044,5 +1051,5 @@ class PrefixRules(GenericRulesTable): values = ['any date','unspecified'] values_combo = ComboBox(self, values, pattern) - self.setCellWidget(row, 4, values_combo) + self.setCellWidget(row, self.COLUMNS['PATTERN']['ordinal'], values_combo) diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.ui b/src/calibre/gui2/catalog/catalog_epub_mobi.ui index bfe94a389f..5891d7a0cc 100644 --- a/src/calibre/gui2/catalog/catalog_epub_mobi.ui +++ b/src/calibre/gui2/catalog/catalog_epub_mobi.ui @@ -210,6 +210,11 @@ The default pattern \[.+\]|\+ excludes tags of the form [tag], e.g., [Test book] Excluded books + + + + + @@ -221,11 +226,16 @@ The default pattern \[.+\]|\+ excludes tags of the form [tag], e.g., [Test book] - The first enabled matching rule will be used to add a prefix to book listings in the generated catalog. + The first matching prefix rule applies a prefix to book listings in the generated catalog. - Prefix rules + Prefixes + + + + +