MTP driver: UI for specifying top level folders to ignore on scan

This commit is contained in:
Kovid Goyal 2012-12-17 18:36:23 +05:30
parent c937e74be6
commit 449c1d5752
3 changed files with 124 additions and 13 deletions

View File

@ -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:

View File

@ -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

View File

@ -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())