%PDF- %PDF-
| Direktori : /usr/lib/calibre/calibre/gui2/dialogs/ |
| Current File : //usr/lib/calibre/calibre/gui2/dialogs/confirm_merge.py |
#!/usr/bin/env python3
__license__ = 'GPL v3'
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
from qt.core import (
QVBoxLayout, QSplitter, QWidget, QLabel, QCheckBox, QTextBrowser, Qt, QDialog, QDialogButtonBox
)
from calibre.ebooks.metadata import authors_to_string
from calibre.ebooks.metadata.book.base import field_metadata
from calibre.gui2 import dynamic, gprefs
from calibre.gui2.widgets2 import Dialog
from calibre.gui2.dialogs.confirm_delete import confirm_config_name
from calibre.utils.config import tweaks
from calibre.utils.date import format_date
class Target(QTextBrowser):
def __init__(self, mi, parent=None):
QTextBrowser.__init__(self, parent)
series = ''
fm = field_metadata
if mi.series:
series = _('{num} of {series}').format(num=mi.format_series_index(), series='<i>%s</i>' % mi.series)
self.setHtml('''
<h3 style="text-align:center">{mb}</h3>
<p><b>{title}</b> - <i>{authors}</i><br></p>
<table>
<tr><td>{fm[timestamp][name]}:</td><td>{date}</td></tr>
<tr><td>{fm[pubdate][name]}:</td><td>{published}</td></tr>
<tr><td>{fm[formats][name]}:</td><td>{formats}</td></tr>
<tr><td>{fm[series][name]}:</td><td>{series}</td></tr>
</table>
'''.format(
mb=_('Target book'),
title=mi.title,
authors=authors_to_string(mi.authors),
date=format_date(mi.timestamp, tweaks['gui_timestamp_display_format']), fm=fm,
published=(format_date(mi.pubdate, tweaks['gui_pubdate_display_format']) if mi.pubdate else ''),
formats=', '.join(mi.formats or ()),
series=series
))
class ConfirmMerge(Dialog):
def __init__(self, msg, name, parent, mi):
self.msg, self.mi, self.conf_name = msg, mi, name
Dialog.__init__(self, _('Are you sure?'), 'confirm-merge-dialog', parent)
needed, sz = self.sizeHint(), self.size()
if needed.width() > sz.width() or needed.height() > sz.height():
self.resize(needed)
def setup_ui(self):
self.l = l = QVBoxLayout(self)
self.splitter = s = QSplitter(self)
s.setChildrenCollapsible(False)
l.addWidget(s), l.addWidget(self.bb)
self.bb.setStandardButtons(QDialogButtonBox.StandardButton.Yes | QDialogButtonBox.StandardButton.No)
self.left = w = QWidget(self)
s.addWidget(w)
w.l = l = QVBoxLayout(w)
l.setContentsMargins(0, 0, 0, 0)
self.la = la = QLabel(self.msg)
la.setWordWrap(True)
l.addWidget(la)
self.confirm = c = QCheckBox(_('Show this confirmation again'), self)
c.setChecked(True)
c.stateChanged.connect(self.toggle)
l.addWidget(c)
self.right = r = Target(self.mi, self)
s.addWidget(r)
def toggle(self):
dynamic[confirm_config_name(self.conf_name)] = self.confirm.isChecked()
def sizeHint(self):
ans = Dialog.sizeHint(self)
ans.setWidth(max(700, ans.width()))
return ans
def confirm_merge(msg, name, parent, mi):
config_set = dynamic
if not config_set.get(confirm_config_name(name), True):
return True
d = ConfirmMerge(msg, name, parent, mi)
return d.exec() == QDialog.DialogCode.Accepted
class ChooseMerge(Dialog):
def __init__(self, dest_id, src_ids, gui):
self.dest_id, self.src_ids = dest_id, src_ids
self.mi = gui.current_db.new_api.get_metadata(dest_id)
Dialog.__init__(self, _('Merge books'), 'choose-merge-dialog', parent=gui)
def setup_ui(self):
self.l = l = QVBoxLayout(self)
self.splitter = s = QSplitter(self)
s.setChildrenCollapsible(False)
l.addWidget(s), l.addWidget(self.bb)
self.bb.setStandardButtons(QDialogButtonBox.StandardButton.Yes | QDialogButtonBox.StandardButton.No)
self.left = w = QWidget(self)
s.addWidget(w)
w.l = l = QVBoxLayout(w)
l.setContentsMargins(0, 0, 0, 0)
def cb(name, text, tt=''):
ans = QCheckBox(text)
l.addWidget(ans)
prefs_key = ans.prefs_key = 'choose-merge-cb-' + name
ans.setChecked(gprefs.get(prefs_key, True))
connect_lambda(ans.stateChanged, self, lambda self, state: self.state_changed(getattr(self, name), state), type=Qt.ConnectionType.QueuedConnection)
if tt:
ans.setToolTip(tt)
setattr(self, name, ans)
return ans
cb('merge_metadata', _('Merge metadata'), _(
'Merge the metadata of the selected books into the target book'))
cb('merge_formats', _('Merge formats'), _(
'Merge the book files of the selected books into the target book'))
cb('delete_books', _('Delete merged books'), _(
'Delete the selected books after merging'))
l.addStretch(10)
self.msg = la = QLabel(self)
la.setWordWrap(True)
l.addWidget(la)
self.update_msg()
self.right = r = Target(self.mi, self)
s.addWidget(r)
def state_changed(self, cb, state):
mm = self.merge_metadata.isChecked()
mf = self.merge_formats.isChecked()
if not mm and not mf:
(self.merge_metadata if cb is self.merge_formats else self.merge_formats).setChecked(True)
gprefs[cb.prefs_key] = cb.isChecked()
self.update_msg()
def update_msg(self):
mm = self.merge_metadata.isChecked()
mf = self.merge_formats.isChecked()
rm = self.delete_books.isChecked()
msg = '<p>'
if mm and mf:
msg += _(
'Book formats and metadata from the selected books'
' will be merged into the target book ({title}).')
elif mf:
msg += _('Book formats from the selected books '
'will be merged into to the target book ({title}).'
' Metadata in the target book will not be changed.')
elif mm:
msg += _('Metadata from the selected books '
'will be merged into to the target book ({title}).'
' Formats will not be merged.')
msg += '<br>'
msg += _('All book formats of the first selected book will be kept.') + '<br><br>'
if rm:
msg += _('After being merged, the selected books will be <b>deleted</b>.')
if mf:
msg += '<br><br>' + _(
'Any duplicate formats in the selected books '
'will be permanently <b>deleted</b> from your calibre library.')
else:
if mf:
msg += _(
'Any formats not in the target book will be added to it from the selected books.')
if not msg.endswith('<br>'):
msg += '<br><br>'
msg += _('Are you <b>sure</b> you want to proceed?') + '</p>'
msg = msg.format(title=self.mi.title)
self.msg.setText(msg)
@property
def merge_type(self):
return self.merge_metadata.isChecked(), self.merge_formats.isChecked(), self.delete_books.isChecked()
def merge_drop(dest_id, src_ids, gui):
d = ChooseMerge(dest_id, src_ids, gui)
if d.exec() != QDialog.DialogCode.Accepted:
return None, None, None
return d.merge_type