From eb38a529df6241158371f84d68dd49469de61dac Mon Sep 17 00:00:00 2001 From: GRiker Date: Mon, 28 Mar 2011 14:58:10 -0700 Subject: [PATCH] GwR patch supporting new user Apple driver disabling --- src/calibre/devices/apple/driver.py | 81 +++++++++++++++++++++-------- src/calibre/devices/errors.py | 4 +- src/calibre/gui2/device.py | 2 +- 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index c12b533c4e..ed26ae86e1 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -17,35 +17,75 @@ from calibre.ebooks.metadata import authors_to_string, MetaInformation, \ title_sort from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.epub import set_metadata +from calibre.gui2.dialogs.confirm_delete import _config_name from calibre.library.server.utils import strftime -from calibre.utils.config import config_dir, prefs +from calibre.utils.config import config_dir, dynamic, DynamicConfig, prefs from calibre.utils.date import now, parse_date from calibre.utils.logging import Log from calibre.utils.zipfile import ZipFile - class AppleOpenFeedback(OpenFeedback): - def __init__(self): + def __init__(self, plugin): OpenFeedback.__init__(self, u'') + self.log = plugin.log + self.plugin = plugin def custom_dialog(self, parent): - from PyQt4.Qt import (QDialog, QVBoxLayout, QLabel, QDialogButtonBox) + from PyQt4.Qt import (QCheckBox, QDialog, QDialogButtonBox, QIcon, + QLabel, QPixmap, QPushButton, QSize, QVBoxLayout) class Dialog(QDialog): - def __init__(self, p): + def __init__(self, p, pixmap='dialog_information.png'): QDialog.__init__(self, p) + + self.setWindowTitle("Apple iDevice detected") self.l = l = QVBoxLayout() self.setLayout(l) - l.addWidget(QLabel('test')) - self.bb = QDialogButtonBox(QDialogButtonBox.OK) + msg = QLabel() + msg.setText( + '

If you do not want calibre to recognize your Apple iDevice ' + 'when it is connected to your computer, ' + 'click Disable Apple Driver.

' + '

To transfer books to your iDevice, ' + 'click Disable Apple Driver, ' + "then use the 'Connect to iTunes' method recommended in the " + 'Calibre + iDevices FAQ, ' + 'using the Connect/Share|Connect to iTunes menu item.

' + '

Enabling the Apple driver for direct connection to iDevices ' + 'is an unsupported advanced user mode.

' + '

' + ) + msg.setWordWrap(True) + l.addWidget(msg) + + self.bb = QDialogButtonBox() + disable_driver = QPushButton(_("Disable Apple driver")) + disable_driver.setDefault(True) + self.bb.addButton(disable_driver, QDialogButtonBox.RejectRole) + + enable_driver = QPushButton(_("Enable Apple driver")) + self.bb.addButton(enable_driver, QDialogButtonBox.AcceptRole) l.addWidget(self.bb) self.bb.accepted.connect(self.accept) self.bb.rejected.connect(self.reject) - return Dialog(parent) + self.setWindowIcon(QIcon(I(pixmap))) + self.resize(self.sizeHint()) + + if Dialog(parent).exec_(): + # Enable Apple driver, inhibit future display of dialog + # Reset dialog with Preferences|Behavior|Reset all disabled confirmation dialogs + self.log.info(" Apple driver ENABLED") + dynamic[_config_name(self.plugin.DISPLAY_DISABLE_DIALOG)] = False + else: + # Disable Apple driver + from calibre.customize.ui import disable_plugin + self.log.info(" Apple driver DISABLED") + disable_plugin(self.plugin) + from PIL import Image as PILImage from lxml import etree @@ -77,15 +117,11 @@ class DriverBase(DeviceConfig, DevicePlugin): 'iBooks Category'), _('Cache covers from iTunes/iBooks') + ':::' + - _('Enable to cache and display covers from iTunes/iBooks'), - _("Skip 'Connect to iTunes' recommendation") + - ':::' + - _("Enable to skip the 'Connect to iTunes' recommendation dialog") + _('Enable to cache and display covers from iTunes/iBooks') ] EXTRA_CUSTOMIZATION_DEFAULT = [ True, True, - False, ] @@ -141,12 +177,13 @@ class ITUNES(DriverBase): supported_platforms = ['osx','windows'] author = 'GRiker' #: The version of this plugin as a 3-tuple (major, minor, revision) - version = (0,9,0) + version = (1,0,0) + + DISPLAY_DISABLE_DIALOG = "display_disable_dialog" # EXTRA_CUSTOMIZATION_MESSAGE indexes USE_SERIES_AS_CATEGORY = 0 CACHE_COVERS = 1 - SKIP_CONNECT_TO_ITUNES_DIALOG = 2 OPEN_FEEDBACK_MESSAGE = _( 'Apple device detected, launching iTunes, please wait ...') @@ -762,15 +799,17 @@ class ITUNES(DriverBase): Note that most of the initialization is necessarily performed in can_handle(), as we need to talk to iTunes to discover if there's a connected iPod ''' + if DEBUG: self.log.info("ITUNES.open()") - # Display a dialog recommending using 'Connect to iTunes' - if not self.settings().extra_customization[self.SKIP_CONNECT_TO_ITUNES_DIALOG]: - raise AppleOpenFeedback() - - if DEBUG: - self.log.info(" advanced user mode, directly connecting to iDevice") + # Display a dialog recommending using 'Connect to iTunes' if user hasn't + # previously disabled the dialog + if dynamic.get(_config_name(self.DISPLAY_DISABLE_DIALOG),True): + raise AppleOpenFeedback(self) + else: + if DEBUG: + self.log.info(" advanced user mode, directly connecting to iDevice") # Confirm/create thumbs archive if not os.path.exists(self.cache_dir): diff --git a/src/calibre/devices/errors.py b/src/calibre/devices/errors.py index 7b11b6933f..05c30c2f72 100644 --- a/src/calibre/devices/errors.py +++ b/src/calibre/devices/errors.py @@ -43,8 +43,8 @@ class OpenFeedback(DeviceError): def custom_dialog(self, parent): ''' - If you need to show the user a custom dialog, instead if just - displaying the feedback_msg, create and return it here. + If you need to show the user a custom dialog, create and + run it from a custom_dialog() method in your subclass. ''' raise NotImplementedError diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 6163c01d27..39a638850d 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -623,7 +623,7 @@ class DeviceMixin(object): # {{{ self.__of_dev_mem__ = d = e.custom_dialog(self) except NotImplementedError: self.__of_dev_mem__ = d = info_dialog(self, devname, e.feedback_msg) - d.show() + d.show() def auto_convert_question(self, msg, autos): autos = u'\n'.join(map(unicode, map(force_unicode, autos)))