Edit metadata dialog: When editing metadata individually for multiple books, popup a confirmation if the user clicks OK before finishing the editing of all the books. Fixes #1378072 [[Enhancement] Edit Metadata, confirm "OK"](https://bugs.launchpad.net/calibre/+bug/1378072)

This commit is contained in:
Kovid Goyal 2014-10-08 11:21:05 +05:30
parent 78fa833930
commit 3b8cf69246
2 changed files with 21 additions and 7 deletions

View File

@ -298,8 +298,9 @@ class EditMetadataAction(InterfaceAction):
current_row = 0 current_row = 0
row_list = rows row_list = rows
editing_multiple = len(row_list) > 1
if len(row_list) == 1: if not editing_multiple:
cr = row_list[0] cr = row_list[0]
row_list = \ row_list = \
list(range(self.gui.library_view.model().rowCount(QModelIndex()))) list(range(self.gui.library_view.model().rowCount(QModelIndex())))
@ -311,7 +312,7 @@ class EditMetadataAction(InterfaceAction):
except Exception: except Exception:
hpos = 0 hpos = 0
changed, rows_to_refresh = self.do_edit_metadata(row_list, current_row) changed, rows_to_refresh = self.do_edit_metadata(row_list, current_row, editing_multiple)
m = self.gui.library_view.model() m = self.gui.library_view.model()
@ -331,12 +332,12 @@ class EditMetadataAction(InterfaceAction):
else: else:
view.horizontalScrollBar().setValue(hpos) view.horizontalScrollBar().setValue(hpos)
def do_edit_metadata(self, row_list, current_row): def do_edit_metadata(self, row_list, current_row, editing_multiple):
from calibre.gui2.metadata.single import edit_metadata from calibre.gui2.metadata.single import edit_metadata
db = self.gui.library_view.model().db db = self.gui.library_view.model().db
changed, rows_to_refresh = edit_metadata(db, row_list, current_row, changed, rows_to_refresh = edit_metadata(db, row_list, current_row,
parent=self.gui, view_slot=self.view_format_callback, parent=self.gui, view_slot=self.view_format_callback,
set_current_callback=self.set_current_callback) set_current_callback=self.set_current_callback, editing_multiple=editing_multiple)
return changed, rows_to_refresh return changed, rows_to_refresh
def set_current_callback(self, id_): def set_current_callback(self, id_):

View File

@ -42,12 +42,13 @@ class MetadataSingleDialogBase(ResizableDialog):
one_line_comments_toolbar = False one_line_comments_toolbar = False
use_toolbutton_for_config_metadata = True use_toolbutton_for_config_metadata = True
def __init__(self, db, parent=None): def __init__(self, db, parent=None, editing_multiple=False):
self.db = db self.db = db
self.changed = set() self.changed = set()
self.books_to_refresh = set() self.books_to_refresh = set()
self.rows_to_refresh = set() self.rows_to_refresh = set()
self.metadata_before_fetch = None self.metadata_before_fetch = None
self.editing_multiple = editing_multiple
ResizableDialog.__init__(self, parent) ResizableDialog.__init__(self, parent)
def setupUi(self, *args): # {{{ def setupUi(self, *args): # {{{
@ -548,6 +549,18 @@ class MetadataSingleDialogBase(ResizableDialog):
self.save_state() self.save_state()
if not self.apply_changes(): if not self.apply_changes():
return return
if self.editing_multiple and self.current_row != len(self.row_list) - 1:
num = len(self.row_list) - 1 - self.current_row
from calibre.gui2 import question_dialog
if not question_dialog(
self, _('Are you sure?'),
_('There are still %d more books to edit in this set.'
' Are you sure you want to stop? Use the Next button'
' instead of the OK button to move through books in the set.') % num,
yes_text=_('&Stop editing'), no_text=_('&Continue editing'),
yes_icon='dot_red.png', no_icon='dot_green.png',
default_yes=False, skip_dialog_name='edit-metadata-single-confirm-ok-on-multiple'):
return self.do_one(delta=1, apply_changes=False)
ResizableDialog.accept(self) ResizableDialog.accept(self)
def reject(self): def reject(self):
@ -1072,11 +1085,11 @@ editors = {'default': MetadataSingleDialog, 'alt1': MetadataSingleDialogAlt1,
'alt2': MetadataSingleDialogAlt2} 'alt2': MetadataSingleDialogAlt2}
def edit_metadata(db, row_list, current_row, parent=None, view_slot=None, def edit_metadata(db, row_list, current_row, parent=None, view_slot=None,
set_current_callback=None): set_current_callback=None, editing_multiple=False):
cls = gprefs.get('edit_metadata_single_layout', '') cls = gprefs.get('edit_metadata_single_layout', '')
if cls not in editors: if cls not in editors:
cls = 'default' cls = 'default'
d = editors[cls](db, parent) d = editors[cls](db, parent, editing_multiple=editing_multiple)
try: try:
d.start(row_list, current_row, view_slot=view_slot, d.start(row_list, current_row, view_slot=view_slot,
set_current_callback=set_current_callback) set_current_callback=set_current_callback)