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