1
# -*- coding: utf-8 -*-
4
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
5
__docformat__ = 'restructuredtext en'
7
from PyQt4.Qt import QString, SIGNAL
9
from calibre.gui2.convert.single import Config, sort_formats_by_preference, \
11
from calibre.customize.ui import available_output_formats
12
from calibre.gui2 import ResizableDialog
13
from calibre.gui2.convert.look_and_feel import LookAndFeelWidget
14
from calibre.gui2.convert.page_setup import PageSetupWidget
15
from calibre.gui2.convert.structure_detection import StructureDetectionWidget
16
from calibre.gui2.convert.toc import TOCWidget
17
from calibre.gui2.convert import GuiRecommendations
18
from calibre.ebooks.conversion.plumber import Plumber
19
from calibre.utils.config import prefs
20
from calibre.utils.logging import Log
22
class BulkConfig(Config):
24
def __init__(self, parent, db, preferred_output_format=None):
25
ResizableDialog.__init__(self, parent)
27
self.setup_output_formats(db, preferred_output_format)
32
self.input_label.hide()
33
self.input_formats.hide()
35
self.connect(self.output_formats, SIGNAL('currentIndexChanged(QString)'),
37
self.connect(self.groups, SIGNAL('activated(QModelIndex)'),
39
self.connect(self.groups, SIGNAL('clicked(QModelIndex)'),
41
self.connect(self.groups, SIGNAL('entered(QModelIndex)'),
43
self.groups.setMouseTracking(True)
46
def setup_pipeline(self, *args):
47
oidx = self.groups.currentIndex().row()
48
output_format = self.output_format
50
input_path = 'dummy.epub'
51
output_path = 'dummy.'+output_format
54
self.plumber = Plumber(input_path, output_path, log)
56
def widget_factory(cls):
57
return cls(self.stack, self.plumber.get_option_by_name,
58
self.plumber.get_option_help, self.db)
60
self.setWindowTitle(_('Bulk Convert'))
61
lf = widget_factory(LookAndFeelWidget)
62
ps = widget_factory(PageSetupWidget)
63
sd = widget_factory(StructureDetectionWidget)
64
toc = widget_factory(TOCWidget)
67
name = self.plumber.output_plugin.name.lower().replace(' ', '_')
69
output_widget = __import__('calibre.gui2.convert.'+name,
71
pw = output_widget.PluginWidget
72
pw.ICON = ':/images/back.svg'
73
pw.HELP = _('Options specific to the output format.')
74
output_widget = widget_factory(pw)
79
c = self.stack.currentWidget()
81
self.stack.removeWidget(c)
83
widgets = [lf, ps, sd, toc]
84
if output_widget is not None:
85
widgets.append(output_widget)
87
self.stack.addWidget(w)
88
self.connect(w, SIGNAL('set_help(PyQt_PyObject)'),
89
self.help.setPlainText)
91
self._groups_model = GroupModel(widgets)
92
self.groups.setModel(self._groups_model)
94
idx = oidx if -1 < oidx < self._groups_model.rowCount() else 0
95
self.groups.setCurrentIndex(self._groups_model.index(idx))
96
self.stack.setCurrentIndex(idx)
98
def setup_output_formats(self, db, preferred_output_format):
99
if preferred_output_format:
100
preferred_output_format = preferred_output_format.lower()
101
output_formats = sorted(available_output_formats())
102
output_formats.remove('oeb')
103
preferred_output_format = preferred_output_format if \
104
preferred_output_format and preferred_output_format \
105
in output_formats else sort_formats_by_preference(output_formats,
106
prefs['output_format'])[0]
107
self.output_formats.addItems(list(map(QString, [x.upper() for x in
109
self.output_formats.setCurrentIndex(output_formats.index(preferred_output_format))
112
recs = GuiRecommendations()
113
for w in self._groups_model.widgets:
114
if not w.pre_commit_check():
116
x = w.commit(save_defaults=False)
118
self._recommendations = recs
119
ResizableDialog.accept(self)