This commit is contained in:
Kovid Goyal 2010-01-21 17:24:26 -07:00
parent 03c5a395f3
commit 8f97e09d0b
4 changed files with 31 additions and 36 deletions

View File

@ -16,11 +16,11 @@ class PluginWidget(QWidget,Ui_Form):
HELP = _('Options specific to')+' <formats> '+_('output')
# Indicates whether this plugin wants its output synced to the connected device
sync_enabled = False
def initialize(self):
QWidget.__init__(self)
self.setupUi(self)
def options(self):
# Return a dictionary with options for this Widget
return {}
return {}

View File

@ -4,14 +4,12 @@ __license__ = 'GPL 3'
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
__docformat__ = 'restructuredtext en'
import os
from optparse import OptionParser
from calibre.customize.conversion import OptionRecommendation, DummyReporter
from calibre.ebooks.conversion.plumber import Plumber
from calibre.customize.ui import plugin_for_catalog_format
from calibre.utils.logging import Log
from calibre.gui2 import choose_dir, Application
def gui_convert(input, output, recommendations, notification=DummyReporter(),
abort_after_input_dump=False, log=None):
@ -36,7 +34,7 @@ def gui_catalog(fmt, title, dbspec, ids, out_file_name, fmt_options,
db = LibraryDatabase2(dbpath)
else: # To be implemented in the future
pass
# Create a minimal OptionParser that we can append to
parser = OptionParser()
args = []
@ -56,8 +54,8 @@ def gui_catalog(fmt, title, dbspec, ids, out_file_name, fmt_options,
plugin = plugin_for_catalog_format(fmt)
plugin.run(out_file_name, opts, db)

View File

@ -6,15 +6,14 @@ __license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
import os, shutil, sys, tempfile
import os, sys
from PyQt4.Qt import QDialog, QWidget
from PyQt4.Qt import QDialog
from calibre.customize.ui import config
from calibre.gui2.dialogs.catalog_ui import Ui_Dialog
from calibre.gui2 import gprefs, dynamic
from calibre.customize.ui import available_catalog_formats, catalog_plugins
from calibre.gui2.catalog.catalog_csv_xml import PluginWidget
from calibre.gui2 import dynamic
from calibre.customize.ui import catalog_plugins
class Catalog(QDialog, Ui_Dialog):
''' Catalog Dialog builder'''
@ -23,11 +22,10 @@ class Catalog(QDialog, Ui_Dialog):
def __init__(self, parent, dbspec, ids):
import re, cStringIO
from calibre import prints as info
from calibre.gui2 import dynamic
from PyQt4.uic import compileUi
QDialog.__init__(self, parent)
# Run the dialog setup generated from catalog.ui
self.setupUi(self)
self.dbspec, self.ids = dbspec, ids
@ -43,25 +41,24 @@ class Catalog(QDialog, Ui_Dialog):
# This code models #69 in calibre/gui2/dialogs/config/__init__.py
self.fmts = []
from calibre.customize.builtins import plugins as builtin_plugins
from calibre.customize import CatalogPlugin
for plugin in catalog_plugins():
if plugin.name in config['disabled_plugins']:
continue
name = plugin.name.lower().replace(' ', '_')
if type(plugin) in builtin_plugins:
#info("Adding widget for builtin Catalog plugin %s" % plugin.name)
#info("Adding widget for builtin Catalog plugin %s" % plugin.name)
try:
catalog_widget = __import__('calibre.gui2.catalog.'+name,
fromlist=[1])
pw = catalog_widget.PluginWidget()
pw.initialize(name)
pw.ICON = I('forward.svg')
pw.ICON = I('forward.svg')
self.widgets.append(pw)
[self.fmts.append([file_type.upper(), pw.sync_enabled,pw]) for file_type in plugin.file_types]
[self.fmts.append([file_type.upper(), pw.sync_enabled,pw]) for file_type in plugin.file_types]
except ImportError:
info("ImportError with %s" % name)
continue
@ -73,38 +70,38 @@ class Catalog(QDialog, Ui_Dialog):
if os.path.exists(form) and os.path.exists(klass):
#info("Adding widget for user-installed Catalog plugin %s" % plugin.name)
# Compile the .ui form provided in plugin.zip
if not os.path.exists(compiled_form):
# info('\tCompiling form', form)
buf = cStringIO.StringIO()
compileUi(form, buf)
dat = buf.getvalue()
dat = re.compile(r'QtGui.QApplication.translate\(.+?,\s+"(.+?)(?<!\\)",.+?\)',
dat = re.compile(r'QtGui.QApplication.translate\(.+?,\s+"(.+?)(?<!\\)",.+?\)',
re.DOTALL).sub(r'_("\1")', dat)
open(compiled_form, 'wb').write(dat)
# Import the dynamic PluginWidget() from .py file provided in plugin.zip
try:
sys.path.insert(0, plugin.resources_path)
catalog_widget = __import__(name, fromlist=[1])
pw = catalog_widget.PluginWidget()
pw.initialize(name)
pw.ICON = I('forward.svg')
self.widgets.append(pw)
pw.ICON = I('forward.svg')
self.widgets.append(pw)
[self.fmts.append([file_type.upper(), pw.sync_enabled,pw]) for file_type in plugin.file_types]
except ImportError:
info("ImportError with %s" % name)
continue
finally:
sys.path.remove(plugin.resources_path)
else:
info("No dynamic tab resources found for %s" % name)
self.widgets = sorted(self.widgets, key=lambda x:(x.TITLE, x.TITLE))
for pw in self.widgets:
page = self.tabs.addTab(pw,pw.TITLE)
self.tabs.addTab(pw,pw.TITLE)
# Generate a sorted list of installed catalog formats/sync_enabled pairs
fmts = sorted([x[0] for x in self.fmts])
@ -127,7 +124,7 @@ class Catalog(QDialog, Ui_Dialog):
if self.sync.isEnabled():
self.sync.setChecked(dynamic.get('catalog_sync_to_device', True))
def format_changed(self, idx):
cf = unicode(self.format.currentText())
if cf in self.sync_enabled_formats:

View File

@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en'
'''The main GUI'''
import atexit, os, shutil, sys, tempfile, textwrap, collections, time
import os, shutil, sys, textwrap, collections, time
from xml.parsers.expat import ExpatError
from Queue import Queue, Empty
from threading import Thread
@ -1359,7 +1359,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
############################### Generate catalog ###########################
def generate_catalog(self):
def generate_catalog(self):
rows = self.library_view.selectionModel().selectedRows()
if not rows or len(rows) < 2:
rows = xrange(self.library_view.model().rowCount(QModelIndex()))
@ -1375,7 +1375,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
ret = generate_catalog(self, dbspec, ids)
if ret is None:
return
func, args, desc, out, sync, title = ret
fmt = os.path.splitext(out)[1][1:].upper()
@ -1384,7 +1384,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
description=desc)
job.catalog_file_path = out
job.fmt = fmt
job.catalog_sync, job.catalog_title = sync, title
job.catalog_sync, job.catalog_title = sync, title
self.status_bar.showMessage(_('Generating %s catalog...')%fmt)
def catalog_generated(self, job):
@ -1399,12 +1399,12 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.status_bar.showMessage(_('Catalog generated.'), 3000)
self.sync_catalogs()
if job.fmt in ['CSV','XML']:
export_dir = choose_dir(self, 'Export Catalog Directory',
export_dir = choose_dir(self, 'Export Catalog Directory',
'Select destination for %s.%s' % (job.catalog_title, job.fmt.lower()))
if export_dir:
destination = os.path.join(export_dir, '%s.%s' % (job.catalog_title, job.fmt.lower()))
shutil.copyfile(job.catalog_file_path, destination)
############################### Fetch news #################################
def download_scheduled_recipe(self, arg):