Finish migration of apply metadata to edit metadata action

This commit is contained in:
Kovid Goyal 2011-04-22 12:15:45 -06:00
parent 6f06278fa2
commit 0bec074f80
2 changed files with 20 additions and 117 deletions

View File

@ -467,13 +467,23 @@ class EditMetadataAction(InterfaceAction):
self.gui.upload_collections(model.db, view=view, oncard=oncard) self.gui.upload_collections(model.db, view=view, oncard=oncard)
view.reset() view.reset()
def apply_metadata_changes(self, id_map): def apply_metadata_changes(self, id_map,
title=_('Applying changed metadata'), msg=''):
self.apply_id_map = list(id_map.iteritems()) self.apply_id_map = list(id_map.iteritems())
self.apply_current_idx = 0 self.apply_current_idx = 0
self.apply_failures = [] self.apply_failures = []
self.applied_ids = [] self.applied_ids = []
self.apply_pd = None
if len(self.apply_id_map) > 1:
from calibre.gui2.dialogs.progress import ProgressDialog
self.apply_pd = ProgressDialog(title, msg, min=0,
max=len(self.apply_id_map)-1, parent=self.gui,
cancelable=False)
self.apply_pd.setModal(True)
self.apply_pd.show()
self.do_one_apply() self.do_one_apply()
def do_one_apply(self): def do_one_apply(self):
if self.apply_current_idx >= len(self.apply_id_map): if self.apply_current_idx >= len(self.apply_id_map):
return self.finalize_apply() return self.finalize_apply()
@ -497,12 +507,17 @@ class EditMetadataAction(InterfaceAction):
pass pass
self.apply_current_idx += 1 self.apply_current_idx += 1
if self.apply_pd is not None:
self.apply_pd.value += 1
QTimer.singleShot(50, self.do_one_apply) QTimer.singleShot(50, self.do_one_apply)
def finalize_apply(self): def finalize_apply(self):
db = self.gui.current_db db = self.gui.current_db
db.commit() db.commit()
if self.apply_pd is not None:
self.apply_pd.hide()
if self.apply_failures: if self.apply_failures:
msg = [] msg = []
for i, tb in self.apply_failures: for i, tb in self.apply_failures:
@ -525,4 +540,5 @@ class EditMetadataAction(InterfaceAction):
self.gui.cover_flow.dataChanged() self.gui.cover_flow.dataChanged()
self.apply_id_map = [] self.apply_id_map = []
self.apply_pd = None

View File

@ -7,14 +7,12 @@ __license__ = 'GPL v3'
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>' __copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
import os
from functools import partial from functools import partial
from itertools import izip from itertools import izip
from threading import Event from threading import Event
from PyQt4.Qt import (QIcon, QDialog, QVBoxLayout, QTextBrowser, QSize, from PyQt4.Qt import (QIcon, QDialog, QVBoxLayout, QTextBrowser, QSize,
QDialogButtonBox, QApplication, QTimer, QLabel, QProgressBar, QDialogButtonBox, QApplication, QLabel, QGridLayout, QPixmap, Qt)
QGridLayout, QPixmap, Qt)
from calibre.gui2.dialogs.message_box import MessageBox from calibre.gui2.dialogs.message_box import MessageBox
from calibre.gui2.threaded_jobs import ThreadedJob from calibre.gui2.threaded_jobs import ThreadedJob
@ -144,118 +142,7 @@ def view_log(job, parent):
# }}} # }}}
# Apply downloaded metadata {{{ # Apply metadata {{{
class ApplyDialog(QDialog):
def __init__(self, msg, gui):
QDialog.__init__(self, gui)
self.setModal(True)
self.l = l = QVBoxLayout()
self.setLayout(l)
l.addWidget(QLabel(msg))
self.pb = QProgressBar(self)
l.addWidget(self.pb)
self.bb = QDialogButtonBox(QDialogButtonBox.Cancel)
self.bb.rejected.connect(self.reject)
l.addWidget(self.bb)
self.setWindowTitle(_('Applying metadata'))
self.gui = gui
def start_applying(self, id_map):
self.id_map = list(id_map.iteritems())
self.current_idx = 0
self.failures = []
self.ids = []
self.canceled = False
self.pb.setMinimum(0)
self.pb.setMaximum(len(id_map))
self.pb.setValue(0)
self.do_one()
def do_one(self):
if self.canceled:
return
if self.current_idx >= len(self.id_map):
self.finalize()
return
i, mi = self.id_map[self.current_idx]
db = self.gui.current_db
try:
set_title = not mi.is_null('title')
set_authors = not mi.is_null('authors')
db.set_metadata(i, mi, commit=False, set_title=set_title,
set_authors=set_authors)
self.ids.append(i)
except:
import traceback
self.failures.append((i, traceback.format_exc()))
try:
if mi.cover:
os.remove(mi.cover)
except:
pass
self.pb.setValue(self.pb.value()+1)
self.current_idx += 1
if not self.canceled:
QTimer.singleShot(50, self.do_one)
def reject(self):
self.canceled = True
# Commit any changes so far
db = self.gui.current_db
db.commit()
QDialog.reject(self)
def finalize(self):
if self.canceled:
return
db = self.gui.current_db
db.commit()
if self.failures:
msg = []
for i, tb in self.failures:
title = db.title(i, index_is_id=True)
authors = db.authors(i, index_is_id=True)
if authors:
authors = [x.replace('|', ',') for x in authors.split(',')]
title += ' - ' + authors_to_string(authors)
msg.append(title+'\n\n'+tb+'\n'+('*'*80))
parent = self if self.isVisible() else self.parent()
error_dialog(parent, _('Some failures'),
_('Failed to apply updated metadata for some books'
' in your library. Click "Show Details" to see '
'details.'), det_msg='\n\n'.join(msg), show=True)
self.accept()
if self.ids:
cr = self.gui.library_view.currentIndex().row()
self.gui.library_view.model().refresh_ids(
self.ids, cr)
if self.gui.cover_flow:
self.gui.cover_flow.dataChanged()
self.id_map = []
_amd = None
def do_apply_metadata(gui, id_map,
msg=_('Applying downloaded metadata to your library')):
global _amd
_amd = ApplyDialog(msg, gui)
_amd.start_applying(id_map)
if len(id_map) > 3:
_amd.show()
def apply_metadata(job, gui, q, result): def apply_metadata(job, gui, q, result):
q.vlb.clicked.disconnect() q.vlb.clicked.disconnect()
q.finished.disconnect() q.finished.disconnect()
@ -361,7 +248,7 @@ def download(ids, db, do_identify, covers,
count = 0 count = 0
all_failed = True all_failed = True
''' '''
Test apply dialog # Test apply dialog
all_failed = do_identify = covers = False all_failed = do_identify = covers = False
''' '''
for i, mi in izip(ids, metadata): for i, mi in izip(ids, metadata):