diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 5af6b36b8a..89adf7abc8 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -294,17 +294,26 @@ class BulkBase(Base): ans = list(ans) return ans + def process_each_book(self): + return False + def initialize(self, book_ids): - self.initial_val = val = self.get_initial_value(book_ids) - val = self.normalize_db_val(val) - self.setter(val) + if not self.process_each_book(): + self.initial_val = val = self.get_initial_value(book_ids) + val = self.normalize_db_val(val) + self.setter(val) def commit(self, book_ids, notify=False): - val = self.getter() - val = self.normalize_ui_val(val) - if val != self.initial_val: + if self.process_each_book(): for book_id in book_ids: - self.db.set_custom(book_id, val, num=self.col_id, notify=notify) + val = self.db.get_custom(book_id, num=self.col_id, index_is_id=True) + self.db.set_custom(book_id, self.getter(val), num=self.col_id, notify=notify) + else: + val = self.getter() + val = self.normalize_ui_val(val) + if val != self.initial_val: + for book_id in book_ids: + self.db.set_custom(book_id, val, num=self.col_id, notify=notify) class BulkBool(BulkBase, Bool): pass @@ -321,15 +330,34 @@ class BulkRating(BulkBase, Rating): class BulkDateTime(BulkBase, DateTime): pass -class BulkText(BulkBase, Text): +class BulkText(BulkBase): + + def setup_ui(self, parent): + values = self.all_values = list(self.db.all_custom(num=self.col_id)) + values.sort(cmp = lambda x,y: cmp(x.lower(), y.lower())) + if self.col_metadata['is_multiple']: + w = TagsLineEdit(parent, values) + w.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) + self.widgets = [QLabel('&'+self.col_metadata['name']+': (tags to add)', parent), w] + self.adding_widget = w + + w = TagsLineEdit(parent, values) + w.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) + self.widgets.append(QLabel('&'+self.col_metadata['name']+': (tags to remove)', parent)) + self.widgets.append(w) + self.removing_widget = w + else: + w = EnComboBox(parent) + w.setSizeAdjustPolicy(w.AdjustToMinimumContentsLengthWithIcon) + w.setMinimumContentsLength(25) + self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), w] def initialize(self, book_ids): - val = self.get_initial_value(book_ids) - self.initial_val = val = self.normalize_db_val(val) if self.col_metadata['is_multiple']: - self.setter(val) self.widgets[1].update_tags_cache(self.all_values) else: + val = self.get_initial_value(book_ids) + self.initial_val = val = self.normalize_db_val(val) idx = None for i, c in enumerate(self.all_values): if c == val: @@ -339,6 +367,30 @@ class BulkText(BulkBase, Text): if idx is not None: self.widgets[1].setCurrentIndex(idx) + def process_each_book(self): + return self.col_metadata['is_multiple'] + + def getter(self, original_value = None): + if self.col_metadata['is_multiple']: + ans = original_value + vals = [v.strip() for v in unicode(self.adding_widget.text()).split(',')] + for t in vals: + print 'adding', t + if t not in ans: + ans.append(t) + print ans + vals = [v.strip() for v in unicode(self.removing_widget.text()).split(',')] + print 'removing', vals + for t in vals: + print 'deleting', t + if t in ans: + ans.remove(t) + return ans + val = unicode(self.widgets[1].currentText()).strip() + if not val: + val = None + return val + bulk_widgets = { 'bool' : BulkBool, @@ -365,9 +417,13 @@ def populate_bulk_metadata_page(layout, db, book_ids, parent=None): if len(w.widgets) == 1: layout.addWidget(w.widgets[0], row, 0, 1, -1) else: - w.widgets[0].setBuddy(w.widgets[1]) - for c, widget in enumerate(w.widgets): - layout.addWidget(widget, row, c) + c = 0 + while c < len(w.widgets): + w.widgets[c].setBuddy(w.widgets[c+1]) + layout.addWidget(w.widgets[c], row, c%2) + layout.addWidget(w.widgets[c+1], row, (c+1)%2) + c += 2 + row += 1 items = [] if len(ans) > 0: items.append(QSpacerItem(10, 10, QSizePolicy.Minimum, diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 788c8681a6..1b8214804e 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -57,7 +57,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.__custom_col_layouts = [layout] ans = self.custom_column_widgets for i in range(len(ans)-1): - w.setTabOrder(ans[i].widgets[-1], ans[i+1].widgets[-1]) + w.setTabOrder(ans[i].widgets[1], ans[i+1].widgets[1]) def initialize_combos(self): self.initalize_authors()