diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py
index 78afa3be15..04f9b80529 100644
--- a/src/calibre/customize/ui.py
+++ b/src/calibre/customize/ui.py
@@ -276,6 +276,13 @@ def plugin_for_input_format(fmt):
if fmt.lower() in plugin.file_types:
return plugin
+def all_input_formats():
+ formats = set([])
+ for plugin in input_format_plugins():
+ for format in plugin.file_types:
+ formats.add(format)
+ return formats
+
def available_input_formats():
formats = set([])
for plugin in input_format_plugins():
diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py
index af4ca16eac..a7e088ee1c 100644
--- a/src/calibre/gui2/__init__.py
+++ b/src/calibre/gui2/__init__.py
@@ -11,6 +11,7 @@ ORG_NAME = 'KovidsBrain'
APP_UID = 'libprs500'
from calibre import islinux, iswindows
from calibre.startup import get_lang
+from calibre.customize.ui import all_input_formats
from calibre.utils.config import Config, ConfigProxy, dynamic
import calibre.resources as resources
from calibre.ebooks.metadata.meta import get_metadata, metadata_from_formats
@@ -48,9 +49,11 @@ def _config():
help=_('Defaults for conversion to LRF'))
c.add_opt('LRF_ebook_viewer_options', default=None,
help=_('Options for the LRF ebook viewer'))
- c.add_opt('internally_viewed_formats', default=['LRF', 'EPUB', 'LIT',
- 'MOBI', 'PRC', 'HTML', 'FB2', 'PDB', 'RB'],
+ c.add_opt('internally_viewed_formats', default=all_input_formats(),
help=_('Formats that are viewed using the internal viewer'))
+ c.add_opt('input_format_order', default=['EPUB', 'MOBI', 'PRC', 'LIT',
+ 'HTML', 'FB2', 'PDB', 'RB'],
+ help=_('Order list of formats to prefer for input.'))
c.add_opt('column_map', default=ALL_COLUMNS,
help=_('Columns to be displayed in the book list'))
c.add_opt('autolaunch_server', default=False, help=_('Automatically launch content server on application startup'))
diff --git a/src/calibre/gui2/dialogs/config.py b/src/calibre/gui2/dialogs/config.py
index aacccbd6b9..20ade05846 100644
--- a/src/calibre/gui2/dialogs/config.py
+++ b/src/calibre/gui2/dialogs/config.py
@@ -22,7 +22,8 @@ from calibre.library import server_config
from calibre.customize.ui import initialized_plugins, is_disabled, enable_plugin, \
disable_plugin, customize_plugin, \
plugin_customization, add_plugin, \
- remove_plugin, input_format_plugins, \
+ remove_plugin, all_input_formats, \
+ input_format_plugins, \
output_format_plugins, available_output_formats
from calibre.utils.smtp import config as smtp_prefs
from calibre.gui2.convert.look_and_feel import LookAndFeelWidget
@@ -337,6 +338,18 @@ class ConfigDialog(QDialog, Ui_Dialog):
self.connect(self.browse_button, SIGNAL('clicked(bool)'), self.browse)
self.connect(self.compact_button, SIGNAL('clicked(bool)'), self.compact)
+ input_map = config['input_format_order']
+ all_formats = set()
+ for fmt in all_input_formats():
+ all_formats.add(fmt.upper())
+ for format in input_map + list(all_formats.difference(input_map)):
+ item = QListWidgetItem(format, self.input_order)
+ item.setData(Qt.UserRole, QVariant(format))
+ item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable)
+
+ self.connect(self.input_up, SIGNAL('clicked()'), self.up_input)
+ self.connect(self.input_down, SIGNAL('clicked()'), self.down_input)
+
dirs = config['frequently_used_directories']
rn = config['use_roman_numerals_for_series_number']
self.timeout.setValue(prefs['network_timeout'])
@@ -553,6 +566,17 @@ class ConfigDialog(QDialog, Ui_Dialog):
plugin.name + _(' cannot be removed. It is a '
'builtin plugin. Try disabling it instead.')).exec_()
+ def up_input(self):
+ idx = self.input_order.currentRow()
+ if idx > 0:
+ self.input_order.insertItem(idx-1, self.input_order.takeItem(idx))
+ self.input_order.setCurrentRow(idx-1)
+
+ def down_input(self):
+ idx = self.input_order.currentRow()
+ if idx < self.input_order.count()-1:
+ self.input_order.insertItem(idx+1, self.input_order.takeItem(idx))
+ self.input_order.setCurrentRow(idx+1)
def up_column(self):
idx = self.columns.currentRow()
@@ -656,6 +680,8 @@ class ConfigDialog(QDialog, Ui_Dialog):
config['new_version_notification'] = bool(self.new_version_notification.isChecked())
prefs['network_timeout'] = int(self.timeout.value())
path = qstring_to_unicode(self.location.text())
+ input_cols = [unicode(self.input_order.item(i).data(Qt.UserRole).toString()) for i in range(self.input_order.count())]
+ config['input_format_order'] = input_cols
cols = [unicode(self.columns.item(i).data(Qt.UserRole).toString()) for i in range(self.columns.count()) if self.columns.item(i).checkState()==Qt.Checked]
if not cols:
cols = ['title']
diff --git a/src/calibre/gui2/dialogs/config.ui b/src/calibre/gui2/dialogs/config.ui
index 90a53364ca..f2cf9b3202 100644
--- a/src/calibre/gui2/dialogs/config.ui
+++ b/src/calibre/gui2/dialogs/config.ui
@@ -232,6 +232,68 @@
+ -
+
+
+ Preferred &input format order:
+
+
+
-
+
+
-
+
+
+ true
+
+
+ QAbstractItemView::SelectRows
+
+
+
+ -
+
+
-
+
+
+ ...
+
+
+
+ :/images/arrow-up.svg:/images/arrow-up.svg
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ ...
+
+
+
+ :/images/arrow-down.svg:/images/arrow-down.svg
+
+
+
+
+
+
+
+
+
+
-