From 0a8e26071a237c9cb2446325cfdf69fe02f66f35 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Fri, 24 Nov 2017 17:18:09 +0100 Subject: [PATCH] Changes for enhancement #1731750 1) make the bulk custom and standard series column editors behave similarly 2) allow zero as an increment so that all the books can be set to the same series number (standard and bulk) The enhancement request suggested that the "Apply changes" checkbox be removed for custom series. I didn't do that because that checkbox is used for all custom columns. --- src/calibre/gui2/custom_column_widgets.py | 95 ++++++++++++++++++----- src/calibre/gui2/dialogs/metadata_bulk.ui | 7 +- 2 files changed, 82 insertions(+), 20 deletions(-) diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 2eb5af1eaa..d734f7d104 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -975,29 +975,87 @@ class BulkSeries(BulkBase): layout = QHBoxLayout(w) layout.setContentsMargins(0, 0, 0, 0) self.remove_series = QCheckBox(parent) - self.remove_series.setText(_('Remove series')) + self.remove_series.setText(_('Clear series')) layout.addWidget(self.remove_series) self.idx_widget = QCheckBox(parent) self.idx_widget.setText(_('Automatically number books')) + self.idx_widget.setToolTip('

' + + _('If not checked, the series number for the books will be set to 1. ' + 'If checked, selected books will be automatically numbered, ' + 'in the order you selected them. So if you selected ' + 'Book A and then Book B, Book A will have series number 1 ' + 'and Book B series number 2.') + '

') layout.addWidget(self.idx_widget) self.force_number = QCheckBox(parent) self.force_number.setText(_('Force numbers to start with ')) + self.force_number.setToolTip('

' + + _('Series will normally be renumbered from the highest ' + 'number in the database for that series. Checking this ' + 'box will tell calibre to start numbering from the value ' + 'in the box') + '

') layout.addWidget(self.force_number) - self.series_start_number = QSpinBox(parent) - self.series_start_number.setMinimum(1) - self.series_start_number.setMaximum(9999999) - self.series_start_number.setProperty("value", 1) + self.series_start_number = QDoubleSpinBox(parent) + self.series_start_number.setMinimum(0.0) + self.series_start_number.setMaximum(9999999.0) + self.series_start_number.setProperty("value", 1.0) layout.addWidget(self.series_start_number) + self.series_increment = QDoubleSpinBox(parent) + self.series_increment.setMinimum(0.00) + self.series_increment.setMaximum(99999.0) + self.series_increment.setProperty("value", 1.0) + self.series_increment.setToolTip('

' + + _('The amount by which to increment the series number ' + 'for successive books. Only applicable when using ' + 'force series numbers.') + '

') + self.series_increment.setPrefix('+') + layout.addWidget(self.series_increment) layout.addItem(QSpacerItem(20, 10, QSizePolicy.Expanding, QSizePolicy.Minimum)) self.widgets.append(w) - self.idx_widget.stateChanged.connect(self.check_changed_checkbox) - self.force_number.stateChanged.connect(self.check_changed_checkbox) - self.series_start_number.valueChanged.connect(self.check_changed_checkbox) - self.remove_series.stateChanged.connect(self.check_changed_checkbox) + self.idx_widget.stateChanged.connect(self.a_c_checkbox_changed) + self.force_number.stateChanged.connect(self.a_c_checkbox_changed) + self.series_start_number.valueChanged.connect(self.a_c_checkbox_changed) + self.series_increment.valueChanged.connect(self.a_c_checkbox_changed) + self.remove_series.stateChanged.connect(self.a_c_checkbox_changed) + self.main_widget self.ignore_change_signals = False - def check_changed_checkbox(self): - self.a_c_checkbox.setChecked(True) + def a_c_checkbox_changed(self): + def disable_numbering_checkboxes(idx_widget_enable): + if idx_widget_enable: + self.idx_widget.setEnabled(True) + else: + self.idx_widget.setChecked(False) + self.idx_widget.setEnabled(False) + self.force_number.setChecked(False) + self.force_number.setEnabled(False) + self.series_start_number.setEnabled(False) + self.series_increment.setEnabled(False) + + if self.ignore_change_signals: + return + self.ignore_change_signals = True + apply_changes = False + if self.remove_series.isChecked(): + self.main_widget.setText('') + self.main_widget.setEnabled(False) + disable_numbering_checkboxes(idx_widget_enable=False) + apply_changes = True + elif self.main_widget.text(): + self.remove_series.setEnabled(False); + disable_numbering_checkboxes(idx_widget_enable=True) + apply_changes = True + else: # no text, no clear. Basically reinitialize + self.main_widget.setEnabled(True) + self.remove_series.setEnabled(True); + disable_numbering_checkboxes(idx_widget_enable=False) + apply_changes = False + + self.force_number.setEnabled(self.idx_widget.isChecked()) + self.series_start_number.setEnabled(self.force_number.isChecked()) + self.series_increment.setEnabled(self.force_number.isChecked()) + + self.ignore_change_signals = False + self.a_c_checkbox.setChecked(apply_changes) def initialize(self, book_id): self.idx_widget.setChecked(False) @@ -1008,16 +1066,17 @@ class BulkSeries(BulkBase): def getter(self): n = unicode(self.main_widget.currentText()).strip() - i = self.idx_widget.checkState() - f = self.force_number.checkState() - s = self.series_start_number.value() - r = self.remove_series.checkState() - return n, i, f, s, r + autonumber = self.idx_widget.checkState() + force = self.force_number.checkState() + start = self.series_start_number.value() + remove = self.remove_series.checkState() + increment = self.series_increment.value() + return n, autonumber, force, start, remove, increment def commit(self, book_ids, notify=False): if not self.a_c_checkbox.isChecked(): return - val, update_indices, force_start, at_value, clear = self.gui_val + val, update_indices, force_start, at_value, clear, increment = self.gui_val val = None if clear else self.normalize_ui_val(val) if clear or val != '': extras = [] @@ -1028,7 +1087,7 @@ class BulkSeries(BulkBase): if update_indices: if force_start: s_index = at_value - at_value += 1 + at_value += increment elif tweaks['series_index_auto_increment'] != 'const': s_index = self.db.get_next_cc_series_num_for(val, num=self.col_id) else: diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index 615c98e5c1..876b8b37e9 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -489,7 +489,7 @@ from the value in the box false - 1.000000000000000 + 0.000000000000000 99000000.000000000000000 @@ -511,7 +511,10 @@ from the value in the box + - 0.010000000000000 + 0.000000000000000 + + + 99999.0 1.000000000000000