~ubuntu-branches/ubuntu/karmic/calibre/karmic

« back to all changes in this revision

Viewing changes to src/calibre/gui2/convert/bulk.py

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2009-07-30 12:49:41 UTC
  • mfrom: (1.3.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090730124941-qjdsmri25zt8zocn
Tags: 0.6.3+dfsg-0ubuntu1
* New upstream release. Please see http://calibre.kovidgoyal.net/new_in_6/
  for the list of new features and changes.
* remove_postinstall.patch: Update for new version.
* build_debug.patch: Does not apply any more, disable for now. Might not be
  necessary any more.
* debian/copyright: Fix reference to versionless GPL.
* debian/rules: Drop obsolete dh_desktop call.
* debian/rules: Add workaround for weird Python 2.6 setuptools behaviour of
  putting compiled .so files into src/calibre/plugins/calibre/plugins
  instead of src/calibre/plugins.
* debian/rules: Drop hal fdi moving, new upstream version does not use hal
  any more. Drop hal dependency, too.
* debian/rules: Install udev rules into /lib/udev/rules.d.
* Add debian/calibre.preinst: Remove unmodified
  /etc/udev/rules.d/95-calibre.rules on upgrade.
* debian/control: Bump Python dependencies to 2.6, since upstream needs
  it now.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
 
 
3
__license__ = 'GPL 3'
 
4
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
 
5
__docformat__ = 'restructuredtext en'
 
6
 
 
7
from PyQt4.Qt import QString, SIGNAL
 
8
 
 
9
from calibre.gui2.convert.single import Config, sort_formats_by_preference, \
 
10
    GroupModel
 
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
 
21
 
 
22
class BulkConfig(Config):
 
23
 
 
24
    def __init__(self, parent, db, preferred_output_format=None):
 
25
        ResizableDialog.__init__(self, parent)
 
26
 
 
27
        self.setup_output_formats(db, preferred_output_format)
 
28
        self.db = db
 
29
 
 
30
        self.setup_pipeline()
 
31
 
 
32
        self.input_label.hide()
 
33
        self.input_formats.hide()
 
34
 
 
35
        self.connect(self.output_formats, SIGNAL('currentIndexChanged(QString)'),
 
36
                self.setup_pipeline)
 
37
        self.connect(self.groups, SIGNAL('activated(QModelIndex)'),
 
38
                self.show_pane)
 
39
        self.connect(self.groups, SIGNAL('clicked(QModelIndex)'),
 
40
                self.show_pane)
 
41
        self.connect(self.groups, SIGNAL('entered(QModelIndex)'),
 
42
                self.show_group_help)
 
43
        self.groups.setMouseTracking(True)
 
44
 
 
45
 
 
46
    def setup_pipeline(self, *args):
 
47
        oidx = self.groups.currentIndex().row()
 
48
        output_format = self.output_format
 
49
 
 
50
        input_path = 'dummy.epub'
 
51
        output_path = 'dummy.'+output_format
 
52
        log = Log()
 
53
        log.outputs = []
 
54
        self.plumber = Plumber(input_path, output_path, log)
 
55
 
 
56
        def widget_factory(cls):
 
57
            return cls(self.stack, self.plumber.get_option_by_name,
 
58
                self.plumber.get_option_help, self.db)
 
59
 
 
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)
 
65
 
 
66
        output_widget = None
 
67
        name = self.plumber.output_plugin.name.lower().replace(' ', '_')
 
68
        try:
 
69
            output_widget = __import__('calibre.gui2.convert.'+name,
 
70
                        fromlist=[1])
 
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)
 
75
        except ImportError:
 
76
            pass
 
77
 
 
78
        while True:
 
79
            c = self.stack.currentWidget()
 
80
            if not c: break
 
81
            self.stack.removeWidget(c)
 
82
 
 
83
        widgets = [lf, ps, sd, toc]
 
84
        if output_widget is not None:
 
85
            widgets.append(output_widget)
 
86
        for w in widgets:
 
87
            self.stack.addWidget(w)
 
88
            self.connect(w, SIGNAL('set_help(PyQt_PyObject)'),
 
89
                    self.help.setPlainText)
 
90
 
 
91
        self._groups_model = GroupModel(widgets)
 
92
        self.groups.setModel(self._groups_model)
 
93
 
 
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)
 
97
 
 
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
 
108
            output_formats])))
 
109
        self.output_formats.setCurrentIndex(output_formats.index(preferred_output_format))
 
110
 
 
111
    def accept(self):
 
112
        recs = GuiRecommendations()
 
113
        for w in self._groups_model.widgets:
 
114
            if not w.pre_commit_check():
 
115
                return
 
116
            x = w.commit(save_defaults=False)
 
117
            recs.update(x)
 
118
        self._recommendations = recs
 
119
        ResizableDialog.accept(self)
 
120