From c73d87a71d3b7d52ed5144dbeda88a76f48ae1ed Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sun, 24 Aug 2014 11:15:58 +0200 Subject: [PATCH] Enhancement #1360766: show plugboards for disabled devices and allow entering plugboards when no metadata writer is enabled. --- src/calibre/gui2/preferences/plugboard.py | 52 ++++++++++++++++++----- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/src/calibre/gui2/preferences/plugboard.py b/src/calibre/gui2/preferences/plugboard.py index 13717a9ccc..7d0b4cfc1e 100644 --- a/src/calibre/gui2/preferences/plugboard.py +++ b/src/calibre/gui2/preferences/plugboard.py @@ -6,6 +6,7 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' import copy +from collections import defaultdict from PyQt5.Qt import Qt, QComboBox, QListWidgetItem @@ -15,7 +16,7 @@ from calibre.gui2.device import device_name_for_plugboards from calibre.gui2.dialogs.template_line_editor import TemplateLineEditor from calibre.gui2.preferences import ConfigWidgetBase, test_widget from calibre.gui2.preferences.plugboard_ui import Ui_Form -from calibre.customize.ui import metadata_writers, device_plugins +from calibre.customize.ui import metadata_writers, device_plugins, disabled_device_plugins from calibre.library.save_to_disk import plugboard_any_format_value, \ plugboard_any_device_value, plugboard_save_to_disk_value, \ find_plugboard @@ -56,6 +57,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.device_label.setText(_('Device currently connected: None')) self.devices = ['', 'APPLE', 'FOLDER_DEVICE'] + self.disabled_devices = [] self.device_to_formats_map = {} for device in device_plugins(): n = device_name_for_plugboards(device) @@ -64,6 +66,12 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.device_to_formats_map[n].add('device_db') if n not in self.devices: self.devices.append(n) + + for device in disabled_device_plugins(): + n = device_name_for_plugboards(device) + if n not in self.disabled_devices: + self.disabled_devices.append(n) + self.devices.sort(cmp=lambda x, y: cmp(x.lower(), y.lower())) self.devices.insert(1, plugboard_save_to_disk_value) self.devices.insert(1, plugboard_content_server_value) @@ -76,11 +84,12 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.new_device.addItems(self.devices) self.formats = [''] + self.format_to_writers_map = defaultdict(list) for w in metadata_writers(): - if not is_disabled(w): - for f in w.file_types: - if not f in self.formats: - self.formats.append(f) + for f in w.file_types: + if not f in self.formats: + self.formats.append(f) + self.format_to_writers_map[f].append(w) self.formats.append('device_db') self.formats.sort() self.formats.insert(1, plugboard_any_format_value) @@ -173,12 +182,26 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): print 'edit_format_changed: none editable format!' return self.current_format = txt + self.check_if_writer_disabled(txt) devices = [''] for d in fpb: devices.append(d) self.edit_device.clear() self.edit_device.addItems(devices) + def check_if_writer_disabled(self, format_name): + if format_name in ['device_db', plugboard_any_format_value]: + return; + show_message = True + for writer in self.format_to_writers_map[format_name]: + if not is_disabled(writer): + show_message = False + if show_message: + warning_dialog(self, '', + _('That format has no metadata writers enabled. A plugboard ' + 'will probably have no effect.'), + show=True) + def new_device_changed(self, txt): self.current_device = None if txt == '': @@ -272,6 +295,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): if txt: self.clear_fields(edit_boxes=True) self.current_format = unicode(txt) + self.check_if_writer_disabled(self.current_format) else: self.clear_fields(edit_boxes=False) @@ -320,10 +344,15 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.changed_signal.emit() self.refill_all_boxes() - def existing_pb_clicked(self, Qitem): - item = Qitem.data(Qt.UserRole) - self.edit_format.setCurrentIndex(self.edit_format.findText(item[0])) - self.edit_device.setCurrentIndex(self.edit_device.findText(item[1])) + def existing_pb_clicked(self, qitem): + item = qitem.data(Qt.UserRole) + if (qitem.flags() & Qt.ItemIsEnabled): + self.edit_format.setCurrentIndex(self.edit_format.findText(item[0])) + self.edit_device.setCurrentIndex(self.edit_device.findText(item[1])) + else: + warning_dialog(self, '', + _('The {0} device plugin is disabled.').format(item[1]), + show=True) def refill_all_boxes(self): if self.refilling: @@ -344,7 +373,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): for f in self.formats: if f not in self.current_plugboards: continue - for d in self.devices: + for d in sorted(self.devices + self.disabled_devices, + cmp=lambda x, y: cmp(x.lower(), y.lower())): if d not in self.current_plugboards[f]: continue ops = [] @@ -353,6 +383,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): txt = '%s:%s = %s\n'%(f, d, ', '.join(ops)) item = QListWidgetItem(txt) item.setData(Qt.UserRole, (f, d)) + if d in self.disabled_devices: + item.setFlags(item.flags() & ~Qt.ItemIsEnabled) self.existing_plugboards.addItem(item) self.refilling = False