mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
MTP driver: Prevent sending books into an ignored folder
This commit is contained in:
parent
9976b7e980
commit
0797811191
@ -13,6 +13,7 @@ from itertools import izip
|
|||||||
|
|
||||||
from calibre import prints
|
from calibre import prints
|
||||||
from calibre.constants import iswindows, numeric_version
|
from calibre.constants import iswindows, numeric_version
|
||||||
|
from calibre.devices.errors import PathError
|
||||||
from calibre.devices.mtp.base import debug
|
from calibre.devices.mtp.base import debug
|
||||||
from calibre.devices.mtp.defaults import DeviceDefaults
|
from calibre.devices.mtp.defaults import DeviceDefaults
|
||||||
from calibre.ptempfile import SpooledTemporaryFile, PersistentTemporaryDirectory
|
from calibre.ptempfile import SpooledTemporaryFile, PersistentTemporaryDirectory
|
||||||
@ -23,6 +24,12 @@ from calibre.utils.filenames import shorten_components_to
|
|||||||
BASE = importlib.import_module('calibre.devices.mtp.%s.driver'%(
|
BASE = importlib.import_module('calibre.devices.mtp.%s.driver'%(
|
||||||
'windows' if iswindows else 'unix')).MTP_DEVICE
|
'windows' if iswindows else 'unix')).MTP_DEVICE
|
||||||
|
|
||||||
|
class MTPInvalidSendPathError(PathError):
|
||||||
|
|
||||||
|
def __init__(self, folder):
|
||||||
|
PathError.__init__(self, 'Trying to send to ignored folder: %s'%folder)
|
||||||
|
self.folder = folder
|
||||||
|
|
||||||
class MTP_DEVICE(BASE):
|
class MTP_DEVICE(BASE):
|
||||||
|
|
||||||
METADATA_CACHE = 'metadata.calibre'
|
METADATA_CACHE = 'metadata.calibre'
|
||||||
@ -46,6 +53,7 @@ class MTP_DEVICE(BASE):
|
|||||||
self._prefs = None
|
self._prefs = None
|
||||||
self.device_defaults = DeviceDefaults()
|
self.device_defaults = DeviceDefaults()
|
||||||
self.current_device_defaults = {}
|
self.current_device_defaults = {}
|
||||||
|
self.highlight_ignored_folders = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def prefs(self):
|
def prefs(self):
|
||||||
@ -387,6 +395,8 @@ class MTP_DEVICE(BASE):
|
|||||||
|
|
||||||
for infile, fname, mi in izip(files, names, metadata):
|
for infile, fname, mi in izip(files, names, metadata):
|
||||||
path = self.create_upload_path(prefix, mi, fname, routing)
|
path = self.create_upload_path(prefix, mi, fname, routing)
|
||||||
|
if path and self.is_folder_ignored(storage, path[0]):
|
||||||
|
raise MTPInvalidSendPathError(path[0])
|
||||||
parent = self.ensure_parent(storage, path)
|
parent = self.ensure_parent(storage, path)
|
||||||
if hasattr(infile, 'read'):
|
if hasattr(infile, 'read'):
|
||||||
pos = infile.tell()
|
pos = infile.tell()
|
||||||
@ -488,7 +498,7 @@ class MTP_DEVICE(BASE):
|
|||||||
|
|
||||||
def config_widget(self):
|
def config_widget(self):
|
||||||
from calibre.gui2.device_drivers.mtp_config import MTPConfig
|
from calibre.gui2.device_drivers.mtp_config import MTPConfig
|
||||||
return MTPConfig(self)
|
return MTPConfig(self, highlight_ignored_folders=self.highlight_ignored_folders)
|
||||||
|
|
||||||
def save_settings(self, cw):
|
def save_settings(self, cw):
|
||||||
cw.commit()
|
cw.commit()
|
||||||
|
@ -985,6 +985,12 @@ class DeviceMixin(object): # {{{
|
|||||||
return
|
return
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
if getattr(job, 'exception', None).__class__.__name__ == 'MTPInvalidSendPathError':
|
||||||
|
try:
|
||||||
|
from calibre.gui2.device_drivers.mtp_config import SendError
|
||||||
|
return SendError(self, job.exception).exec_()
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
try:
|
try:
|
||||||
prints(job.details, file=sys.stderr)
|
prints(job.details, file=sys.stderr)
|
||||||
except:
|
except:
|
||||||
|
@ -13,7 +13,7 @@ from PyQt4.Qt import (QWidget, QListWidgetItem, Qt, QToolButton, QLabel,
|
|||||||
QTabWidget, QGridLayout, QListWidget, QIcon, QLineEdit, QVBoxLayout,
|
QTabWidget, QGridLayout, QListWidget, QIcon, QLineEdit, QVBoxLayout,
|
||||||
QPushButton, QGroupBox, QScrollArea, QHBoxLayout, QComboBox,
|
QPushButton, QGroupBox, QScrollArea, QHBoxLayout, QComboBox,
|
||||||
pyqtSignal, QSizePolicy, QDialog, QDialogButtonBox, QPlainTextEdit,
|
pyqtSignal, QSizePolicy, QDialog, QDialogButtonBox, QPlainTextEdit,
|
||||||
QApplication)
|
QApplication, QSize)
|
||||||
|
|
||||||
from calibre.ebooks import BOOK_EXTENSIONS
|
from calibre.ebooks import BOOK_EXTENSIONS
|
||||||
from calibre.gui2 import error_dialog
|
from calibre.gui2 import error_dialog
|
||||||
@ -328,7 +328,7 @@ class FormatRules(QGroupBox):
|
|||||||
|
|
||||||
class MTPConfig(QTabWidget):
|
class MTPConfig(QTabWidget):
|
||||||
|
|
||||||
def __init__(self, device, parent=None):
|
def __init__(self, device, parent=None, highlight_ignored_folders=False):
|
||||||
QTabWidget.__init__(self, parent)
|
QTabWidget.__init__(self, parent)
|
||||||
self._device = weakref.ref(device)
|
self._device = weakref.ref(device)
|
||||||
|
|
||||||
@ -375,6 +375,10 @@ class MTPConfig(QTabWidget):
|
|||||||
b.clicked.connect(self.ignore_device)
|
b.clicked.connect(self.ignore_device)
|
||||||
self.config_ign_folders_button = cif = QPushButton(
|
self.config_ign_folders_button = cif = QPushButton(
|
||||||
QIcon(I('tb_folder.png')), _('Change scanned &folders'))
|
QIcon(I('tb_folder.png')), _('Change scanned &folders'))
|
||||||
|
cif.setStyleSheet(
|
||||||
|
'QPushButton { font-weight: bold; }')
|
||||||
|
if highlight_ignored_folders:
|
||||||
|
cif.setIconSize(QSize(64, 64))
|
||||||
self.show_debug_button = bd = QPushButton(QIcon(I('debug.png')),
|
self.show_debug_button = bd = QPushButton(QIcon(I('debug.png')),
|
||||||
_('Show device information'))
|
_('Show device information'))
|
||||||
bd.clicked.connect(self.show_debug_info)
|
bd.clicked.connect(self.show_debug_info)
|
||||||
@ -383,9 +387,9 @@ class MTPConfig(QTabWidget):
|
|||||||
l.addWidget(b, 0, 0, 1, 2)
|
l.addWidget(b, 0, 0, 1, 2)
|
||||||
l.addWidget(la, 1, 0, 1, 1)
|
l.addWidget(la, 1, 0, 1, 1)
|
||||||
l.addWidget(self.formats, 2, 0, 5, 1)
|
l.addWidget(self.formats, 2, 0, 5, 1)
|
||||||
l.addWidget(self.send_to, 2, 1, 1, 1)
|
l.addWidget(cif, 2, 1, 1, 1)
|
||||||
l.addWidget(self.template, 3, 1, 1, 1)
|
l.addWidget(self.template, 3, 1, 1, 1)
|
||||||
l.addWidget(cif, 4, 1, 1, 1)
|
l.addWidget(self.send_to, 4, 1, 1, 1)
|
||||||
l.addWidget(self.show_debug_button, 5, 1, 1, 1)
|
l.addWidget(self.show_debug_button, 5, 1, 1, 1)
|
||||||
l.setRowStretch(6, 10)
|
l.setRowStretch(6, 10)
|
||||||
l.addWidget(r, 7, 0, 1, 2)
|
l.addWidget(r, 7, 0, 1, 2)
|
||||||
@ -481,6 +485,37 @@ class MTPConfig(QTabWidget):
|
|||||||
|
|
||||||
self.device.prefs[self.current_device_key] = p
|
self.device.prefs[self.current_device_key] = p
|
||||||
|
|
||||||
|
class SendError(QDialog):
|
||||||
|
|
||||||
|
def __init__(self, gui, error):
|
||||||
|
QDialog.__init__(self, gui)
|
||||||
|
self.l = l = QVBoxLayout()
|
||||||
|
self.setLayout(l)
|
||||||
|
self.la = la = QLabel('<p>'+
|
||||||
|
_('You are trying to send books into the <b>%s</b> folder. This '
|
||||||
|
'folder is currently ignored by calibre when scanning the '
|
||||||
|
'device. You have tell calibre you want this folder scanned '
|
||||||
|
'in order to be able to send books to it. Click the '
|
||||||
|
'<b>configure</b> button below to send books to it.')%error.folder)
|
||||||
|
la.setWordWrap(True)
|
||||||
|
la.setMinimumWidth(500)
|
||||||
|
l.addWidget(la)
|
||||||
|
self.bb = bb = QDialogButtonBox(QDialogButtonBox.Close)
|
||||||
|
self.b = bb.addButton(_('Configure'), bb.AcceptRole)
|
||||||
|
bb.accepted.connect(self.accept)
|
||||||
|
bb.rejected.connect(self.reject)
|
||||||
|
l.addWidget(bb)
|
||||||
|
self.setWindowTitle(_('Cannot send to %s')%error.folder)
|
||||||
|
self.setWindowIcon(QIcon(I('dialog_error.png')))
|
||||||
|
|
||||||
|
self.resize(self.sizeHint())
|
||||||
|
|
||||||
|
def accept(self):
|
||||||
|
QDialog.accept(self)
|
||||||
|
dev = self.parent().device_manager.connected_device
|
||||||
|
dev.highlight_ignored_folders = True
|
||||||
|
self.parent().configure_connected_device()
|
||||||
|
dev.highlight_ignored_folders = False
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
from calibre.gui2 import Application
|
from calibre.gui2 import Application
|
||||||
|
Loading…
x
Reference in New Issue
Block a user