mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
MTP driver: UI for specifying top level folders to ignore on scan
This commit is contained in:
parent
c937e74be6
commit
449c1d5752
@ -59,9 +59,24 @@ class MTP_DEVICE(BASE):
|
|||||||
p.defaults['blacklist'] = []
|
p.defaults['blacklist'] = []
|
||||||
p.defaults['history'] = {}
|
p.defaults['history'] = {}
|
||||||
p.defaults['rules'] = []
|
p.defaults['rules'] = []
|
||||||
|
p.defaults['ignored_folders'] = {}
|
||||||
|
|
||||||
return self._prefs
|
return self._prefs
|
||||||
|
|
||||||
|
def is_folder_ignored(self, storage_or_storage_id, name,
|
||||||
|
ignored_folders=None):
|
||||||
|
storage_id = unicode(getattr(storage_or_storage_id, 'object_id',
|
||||||
|
storage_or_storage_id))
|
||||||
|
name = icu_lower(name)
|
||||||
|
if ignored_folders is None:
|
||||||
|
ignored_folders = self.get_pref('ignored_folders')
|
||||||
|
if storage_id in ignored_folders:
|
||||||
|
return name in {icu_lower(x) for x in ignored_folders[storage_id]}
|
||||||
|
|
||||||
|
return name in {
|
||||||
|
'alarms', 'android', 'dcim', 'movies', 'music', 'notifications',
|
||||||
|
'pictures', 'ringtones', 'samsung', 'sony', 'htc'}
|
||||||
|
|
||||||
def configure_for_kindle_app(self):
|
def configure_for_kindle_app(self):
|
||||||
proxy = self.prefs
|
proxy = self.prefs
|
||||||
with proxy:
|
with proxy:
|
||||||
|
@ -19,7 +19,7 @@ from calibre.ebooks import BOOK_EXTENSIONS
|
|||||||
from calibre.gui2 import error_dialog
|
from calibre.gui2 import error_dialog
|
||||||
from calibre.gui2.dialogs.template_dialog import TemplateDialog
|
from calibre.gui2.dialogs.template_dialog import TemplateDialog
|
||||||
from calibre.utils.date import parse_date
|
from calibre.utils.date import parse_date
|
||||||
from calibre.gui2.device_drivers.mtp_folder_browser import Browser
|
from calibre.gui2.device_drivers.mtp_folder_browser import Browser, TopLevel
|
||||||
|
|
||||||
class FormatsConfig(QWidget): # {{{
|
class FormatsConfig(QWidget): # {{{
|
||||||
|
|
||||||
@ -373,23 +373,29 @@ class MTPConfig(QTabWidget):
|
|||||||
_('&Ignore the %s in calibre')%device.current_friendly_name,
|
_('&Ignore the %s in calibre')%device.current_friendly_name,
|
||||||
self.base)
|
self.base)
|
||||||
b.clicked.connect(self.ignore_device)
|
b.clicked.connect(self.ignore_device)
|
||||||
|
self.config_ign_folders_button = cif = QPushButton(
|
||||||
|
QIcon(I('tb_folder.png')), _('Change scanned &folders'))
|
||||||
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)
|
||||||
|
cif.clicked.connect(self.change_ignored_folders)
|
||||||
|
|
||||||
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, 4, 1)
|
l.addWidget(self.formats, 2, 0, 5, 1)
|
||||||
l.addWidget(self.send_to, 2, 1, 1, 1)
|
l.addWidget(self.send_to, 2, 1, 1, 1)
|
||||||
l.addWidget(self.template, 3, 1, 1, 1)
|
l.addWidget(self.template, 3, 1, 1, 1)
|
||||||
l.addWidget(self.show_debug_button, 4, 1, 1, 1)
|
l.addWidget(cif, 4, 1, 1, 1)
|
||||||
l.setRowStretch(5, 10)
|
l.addWidget(self.show_debug_button, 5, 1, 1, 1)
|
||||||
l.addWidget(r, 6, 0, 1, 2)
|
l.setRowStretch(6, 10)
|
||||||
l.setRowStretch(6, 100)
|
l.addWidget(r, 7, 0, 1, 2)
|
||||||
|
l.setRowStretch(7, 100)
|
||||||
|
|
||||||
self.igntab = IgnoredDevices(self.device.prefs['history'],
|
self.igntab = IgnoredDevices(self.device.prefs['history'],
|
||||||
self.device.prefs['blacklist'])
|
self.device.prefs['blacklist'])
|
||||||
self.addTab(self.igntab, _('Ignored devices'))
|
self.addTab(self.igntab, _('Ignored devices'))
|
||||||
|
self.current_ignored_folders = self.get_pref('ignored_folders')
|
||||||
|
self.initial_ignored_folders = self.current_ignored_folders
|
||||||
|
|
||||||
self.setCurrentIndex(1 if msg else 0)
|
self.setCurrentIndex(1 if msg else 0)
|
||||||
|
|
||||||
@ -413,6 +419,12 @@ class MTPConfig(QTabWidget):
|
|||||||
QApplication.clipboard().setText(v.toPlainText()))
|
QApplication.clipboard().setText(v.toPlainText()))
|
||||||
d.exec_()
|
d.exec_()
|
||||||
|
|
||||||
|
def change_ignored_folders(self):
|
||||||
|
d = TopLevel(self.device,
|
||||||
|
self.current_ignored_folders, parent=self)
|
||||||
|
if d.exec_() == d.Accepted:
|
||||||
|
self.current_ignored_folders = d.ignored_folders
|
||||||
|
|
||||||
def ignore_device(self):
|
def ignore_device(self):
|
||||||
self.igntab.ignore_device(self.device.current_serial_num)
|
self.igntab.ignore_device(self.device.current_serial_num)
|
||||||
self.base.b.setEnabled(False)
|
self.base.b.setEnabled(False)
|
||||||
@ -464,6 +476,9 @@ class MTPConfig(QTabWidget):
|
|||||||
if r and r != self.device.prefs['rules']:
|
if r and r != self.device.prefs['rules']:
|
||||||
p['rules'] = r
|
p['rules'] = r
|
||||||
|
|
||||||
|
if self.current_ignored_folders != self.initial_ignored_folders:
|
||||||
|
p['ignored_folders'] = self.current_ignored_folders
|
||||||
|
|
||||||
self.device.prefs[self.current_device_key] = p
|
self.device.prefs[self.current_device_key] = p
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,7 +10,8 @@ __docformat__ = 'restructuredtext en'
|
|||||||
from operator import attrgetter
|
from operator import attrgetter
|
||||||
|
|
||||||
from PyQt4.Qt import (QTabWidget, QTreeWidget, QTreeWidgetItem, Qt, QDialog,
|
from PyQt4.Qt import (QTabWidget, QTreeWidget, QTreeWidgetItem, Qt, QDialog,
|
||||||
QDialogButtonBox, QVBoxLayout, QSize, pyqtSignal, QIcon)
|
QDialogButtonBox, QVBoxLayout, QSize, pyqtSignal, QIcon, QLabel,
|
||||||
|
QListWidget, QListWidgetItem)
|
||||||
|
|
||||||
from calibre.gui2 import file_icon_provider
|
from calibre.gui2 import file_icon_provider
|
||||||
|
|
||||||
@ -95,25 +96,105 @@ class Browser(QDialog):
|
|||||||
def current_item(self):
|
def current_item(self):
|
||||||
return self.folders.current_item
|
return self.folders.current_item
|
||||||
|
|
||||||
def browse():
|
class TopLevel(QDialog):
|
||||||
from calibre.gui2 import Application
|
|
||||||
|
def __init__(self, dev, ignored_folders=None, parent=None):
|
||||||
|
QDialog.__init__(self, parent)
|
||||||
|
self.l = l = QVBoxLayout()
|
||||||
|
self.setLayout(l)
|
||||||
|
self.la = la = QLabel('<p>'+ _('<b>Scanned folders:</b>') + ' ' +
|
||||||
|
_('You can select which top level folders calibre will '
|
||||||
|
'scan when searching this device for books.'))
|
||||||
|
la.setWordWrap(True)
|
||||||
|
l.addWidget(la)
|
||||||
|
self.tabs = QTabWidget(self)
|
||||||
|
l.addWidget(self.tabs)
|
||||||
|
self.widgets = []
|
||||||
|
|
||||||
|
for storage in dev.filesystem_cache.entries:
|
||||||
|
w = QListWidget(self)
|
||||||
|
w.storage = storage
|
||||||
|
self.tabs.addTab(w, storage.name)
|
||||||
|
self.widgets.append(w)
|
||||||
|
for child in sorted(storage.folders, key=attrgetter('name')):
|
||||||
|
i = QListWidgetItem(child.name)
|
||||||
|
i.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
|
||||||
|
i.setCheckState(Qt.Unchecked if
|
||||||
|
dev.is_folder_ignored(storage, child.name,
|
||||||
|
ignored_folders=ignored_folders) else Qt.Checked)
|
||||||
|
w.addItem(i)
|
||||||
|
|
||||||
|
self.bb = QDialogButtonBox(QDialogButtonBox.Ok |
|
||||||
|
QDialogButtonBox.Cancel)
|
||||||
|
self.bb.accepted.connect(self.accept)
|
||||||
|
self.bb.rejected.connect(self.reject)
|
||||||
|
self.sab = self.bb.addButton(_('Select &All'), self.bb.ActionRole)
|
||||||
|
self.sab.clicked.connect(self.select_all)
|
||||||
|
self.snb = self.bb.addButton(_('Select &None'), self.bb.ActionRole)
|
||||||
|
self.snb.clicked.connect(self.select_none)
|
||||||
|
l.addWidget(self.bb)
|
||||||
|
self.setWindowTitle(_('Choose folders to scan'))
|
||||||
|
self.setWindowIcon(QIcon(I('devices/tablet.png')))
|
||||||
|
|
||||||
|
self.resize(500, 500)
|
||||||
|
|
||||||
|
def select_all(self):
|
||||||
|
w = self.tabs.currentWidget()
|
||||||
|
for i in xrange(w.count()):
|
||||||
|
x = w.item(i)
|
||||||
|
x.setCheckState(Qt.Checked)
|
||||||
|
|
||||||
|
def select_none(self):
|
||||||
|
w = self.tabs.currentWidget()
|
||||||
|
for i in xrange(w.count()):
|
||||||
|
x = w.item(i)
|
||||||
|
x.setCheckState(Qt.Unchecked)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ignored_folders(self):
|
||||||
|
ans = {}
|
||||||
|
for w in self.widgets:
|
||||||
|
ans[unicode(w.storage.object_id)] = folders = []
|
||||||
|
for i in xrange(w.count()):
|
||||||
|
x = w.item(i)
|
||||||
|
if x.checkState() != Qt.Checked:
|
||||||
|
folders.append(unicode(x.text()))
|
||||||
|
return ans
|
||||||
|
|
||||||
|
def setup_device():
|
||||||
from calibre.devices.mtp.driver import MTP_DEVICE
|
from calibre.devices.mtp.driver import MTP_DEVICE
|
||||||
from calibre.devices.scanner import DeviceScanner
|
from calibre.devices.scanner import DeviceScanner
|
||||||
s = DeviceScanner()
|
s = DeviceScanner()
|
||||||
s.scan()
|
s.scan()
|
||||||
app = Application([])
|
|
||||||
app
|
|
||||||
dev = MTP_DEVICE(None)
|
dev = MTP_DEVICE(None)
|
||||||
dev.startup()
|
dev.startup()
|
||||||
cd = dev.detect_managed_devices(s.devices)
|
cd = dev.detect_managed_devices(s.devices)
|
||||||
if cd is None:
|
if cd is None:
|
||||||
raise ValueError('No MTP device found')
|
raise ValueError('No MTP device found')
|
||||||
dev.open(cd, 'test')
|
dev.open(cd, 'test')
|
||||||
|
return dev
|
||||||
|
|
||||||
|
def browse():
|
||||||
|
from calibre.gui2 import Application
|
||||||
|
app = Application([])
|
||||||
|
app
|
||||||
|
dev = setup_device()
|
||||||
d = Browser(dev.filesystem_cache)
|
d = Browser(dev.filesystem_cache)
|
||||||
d.exec_()
|
d.exec_()
|
||||||
dev.shutdown()
|
dev.shutdown()
|
||||||
return d.current_item
|
return d.current_item
|
||||||
|
|
||||||
if __name__ == '__main__':
|
def top_level():
|
||||||
print (browse())
|
from calibre.gui2 import Application
|
||||||
|
app = Application([])
|
||||||
|
app
|
||||||
|
dev = setup_device()
|
||||||
|
d = TopLevel(dev, None)
|
||||||
|
d.exec_()
|
||||||
|
dev.shutdown()
|
||||||
|
return d.ignored_folders
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# print (browse())
|
||||||
|
print ('Ignored:', top_level())
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user