From df7e9441b01b084ba05447f8a3355075a7cc4fa5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 25 Sep 2013 12:15:21 +0530 Subject: [PATCH] Bulk metadata edit: Allow setting comments and cloning covers Bulk metadata edit: Allow setting the comments for all selected books and also allow cloning the covers. Cloning covers means that the cover of the first selected book will be set for all other selected books. Fixes #1230040 [Bulk edit covers and comments [Enhancement]](https://bugs.launchpad.net/calibre/+bug/1230040) --- src/calibre/gui2/dialogs/metadata_bulk.py | 32 +- src/calibre/gui2/dialogs/metadata_bulk.ui | 770 +++++++++++----------- 2 files changed, 427 insertions(+), 375 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 0b01b5b2a7..1bdaacf7ab 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -56,7 +56,8 @@ def get_cover_data(stream, ext): # {{{ Settings = namedtuple('Settings', 'remove_all remove add au aus do_aus rating pub do_series do_autonumber do_remove_format ' 'remove_format do_swap_ta do_remove_conv do_auto_author series do_series_restart series_start_value ' - 'do_title_case cover_action clear_series pubdate adddate do_title_sort languages clear_languages restore_original') + 'do_title_case cover_action clear_series pubdate adddate do_title_sort languages clear_languages restore_original comments') +null = object() class MyBlockingBusy(QDialog): # {{{ @@ -215,6 +216,14 @@ class MyBlockingBusy(QDialog): # {{{ im.trim(tweaks['cover_trim_fuzz_value']) cdata = im.export('jpg') cache.set_cover({book_id:cdata}) + elif args.cover_action == 'clone': + cdata = None + for book_id in self.ids: + cdata = cache.cover(book_id) + if cdata: + break + if cdata: + cache.set_cover({bid:cdata for bid in self.ids if bid != book_id}) # Formats if args.do_remove_format: @@ -262,6 +271,9 @@ class MyBlockingBusy(QDialog): # {{{ elif tweaks['series_index_auto_increment'] != 'no_change': cache.set_field('series_index', {bid:1.0 for bid in self.ids}) + if args.comments is not null: + cache.set_field('comments', {bid:args.comments for bid in self.ids}) + if args.do_remove_conv: cache.delete_conversion_options(self.ids) @@ -310,12 +322,16 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): self.refresh_book_list.setChecked(gprefs['refresh_book_list_on_bulk_edit']) self.refresh_book_list.toggled.connect(self.save_refresh_booklist) self.ids = [self.db.id(r) for r in rows] + self.first_title = self.db.title(self.ids[0], index_is_id=True) + self.cover_clone.setToolTip(unicode(self.cover_clone.toolTip()) + ' (%s)' % self.first_title) self.box_title.setText('

' + _('Editing meta information for %d books') % len(rows)) self.write_series = False self.changed = False self.refresh_books = refresh_books + self.comments = null + self.comments_button.clicked.connect(self.set_comments) all_tags = self.db.all_tags() self.tags.update_items_cache(all_tags) @@ -373,6 +389,16 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): self.authors.setFocus(Qt.OtherFocusReason) self.exec_() + def set_comments(self): + from calibre.gui2.dialogs.comments_dialog import CommentsDialog + d = CommentsDialog(self, '' if self.comments is null else (self.comments or ''), _('Comments')) + if d.exec_() == d.Accepted: + self.comments = d.textbox.html + b = self.comments_button + b.setStyleSheet('QPushButton { font-weight: bold }') + if unicode(b.text())[-1] != '*': + b.setText(unicode(b.text()) + ' *') + def save_refresh_booklist(self, *args): gprefs['refresh_book_list_on_bulk_edit'] = bool(self.refresh_book_list.isChecked()) @@ -960,13 +986,15 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): cover_action = 'fromfmt' elif self.cover_trim.isChecked(): cover_action = 'trim' + elif self.cover_clone.isChecked(): + cover_action = 'clone' args = Settings(remove_all, remove, add, au, aus, do_aus, rating, pub, do_series, do_autonumber, do_remove_format, remove_format, do_swap_ta, do_remove_conv, do_auto_author, series, do_series_restart, series_start_value, do_title_case, cover_action, clear_series, pubdate, adddate, do_title_sort, languages, clear_languages, - restore_original) + restore_original, self.comments) source = self.s_r_sf_itemdata(None) do_sr = source and self.s_r_obj diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index 741f8cae54..b6e86652e8 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -62,16 +62,230 @@ &Basic metadata - - + + + + + 0 + 0 + + + + List of known series. You can add new series. + + + List of known series. You can add new series. + + + true + + + QComboBox::InsertAlphabetically + + + QComboBox::AdjustToMinimumContentsLengthWithIcon + + + 40 + + + + + + + If checked, the series will be cleared + - &Author(s): + &Clear series + + + + + + + &Apply date + + + + + + + &Published: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - authors + pubdate + + + + + + + + + MMM yyyy + + + true + + + + + + + Clear published date + + + ... + + + + :/images/trash.png:/images/trash.png + + + + + + + + + &Apply date + + + + + + + Open Tag Editor + + + Open Tag Editor + + + + :/images/chapters.png:/images/chapters.png + + + + + + + &Remove tags: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + remove_tags + + + + + + + Comma separated list of tags to remove from the books. + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 15 + + + + + + + + + + + 120 + 16777215 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + When doing a same format to same format conversion, +for e.g., EPUB to EPUB, calibre saves the original EPUB + as ORIGINAL_EPUB. This option tells calibre to restore + the EPUB from ORIGINAL_EPUB. Useful if you did a bulk + conversion of a large number of books and something went wrong. + + + Restore pre conversion &originals, if available + + + + + + + + + &Series: + + + Qt::PlainText + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + series + + + + + + + true + + + + + + + Add ta&gs: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + tags + + + + + + + Tags categorize the book. This is particularly useful while searching. <br><br>They can be any words or phrases, separated by commas. @@ -100,6 +314,131 @@ + + + + &Author(s): + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + authors + + + + + + + Check this box to remove all tags from the books. + + + Remove &all + + + + + + + + + false + + + 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. + + + &Automatically number books in this series + + + + + + + false + + + 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 + + + &Force numbers to start with: + + + + + + + false + + + 1 + + + 99000000 + + + 1 + + + + + + + + + &Date: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + adddate + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + d MMM yyyy + + + true + + + + + + + ... + + + + :/images/trash.png:/images/trash.png + + + + + @@ -174,365 +513,6 @@ - - - - true - - - - - - - Add ta&gs: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - tags - - - - - - - Tags categorize the book. This is particularly useful while searching. <br><br>They can be any words or phrases, separated by commas. - - - - - - - Open Tag Editor - - - Open Tag Editor - - - - :/images/chapters.png:/images/chapters.png - - - - - - - &Remove tags: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - remove_tags - - - - - - - Comma separated list of tags to remove from the books. - - - - - - - Check this box to remove all tags from the books. - - - Remove &all - - - - - - - &Series: - - - Qt::PlainText - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - series - - - - - - - - 0 - 0 - - - - List of known series. You can add new series. - - - List of known series. You can add new series. - - - true - - - QComboBox::InsertAlphabetically - - - QComboBox::AdjustToMinimumContentsLengthWithIcon - - - 40 - - - - - - - If checked, the series will be cleared - - - &Clear series - - - - - - - - - false - - - 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. - - - &Automatically number books in this series - - - - - - - false - - - 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 - - - &Force numbers to start with: - - - - - - - false - - - 1 - - - 99000000 - - - 1 - - - - - - - - - &Date: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - adddate - - - - - - - - - d MMM yyyy - - - true - - - - - - - ... - - - - :/images/trash.png:/images/trash.png - - - - - - - - - &Apply date - - - - - - - &Published: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - pubdate - - - - - - - - - MMM yyyy - - - true - - - - - - - Clear published date - - - ... - - - - :/images/trash.png:/images/trash.png - - - - - - - - - &Apply date - - - - - - - &Languages: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - languages - - - - - - - - - - Remove &all - - - - - - - Remove &format: - - - remove_format - - - - - - - - - - 120 - 16777215 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - When doing a same format to same format conversion, -for e.g., EPUB to EPUB, calibre saves the original EPUB - as ORIGINAL_EPUB. This option tells calibre to restore - the EPUB from ORIGINAL_EPUB. Useful if you did a bulk - conversion of a large number of books and something went wrong. - - - Restore pre conversion &originals, if available - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 15 - - - - @@ -622,21 +602,65 @@ Future conversion of these books will use the default settings. + + + + Set the covers of all selected books to be the same +as that of the first selected book. + + + &Clone covers + + + - - - - Qt::Vertical + + + + &Languages: - - - 20 - 40 - + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + + languages + + + + + + + + + + Remove &all + + + + + + + Remove &format: + + + remove_format + + + + + + + + 0 + 0 + + + + Set the co&mments for all selected books + +