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
+
+
-
+
+
+
-