From e35622a98b9fa95eb8af921eed6033ed235baf37 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 12 Sep 2012 17:15:22 +0530 Subject: [PATCH] MTP: Filesystem browser widget --- .../gui2/device_drivers/mtp_folder_browser.py | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/calibre/gui2/device_drivers/mtp_folder_browser.py diff --git a/src/calibre/gui2/device_drivers/mtp_folder_browser.py b/src/calibre/gui2/device_drivers/mtp_folder_browser.py new file mode 100644 index 0000000000..97b75c9de2 --- /dev/null +++ b/src/calibre/gui2/device_drivers/mtp_folder_browser.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai +from __future__ import (unicode_literals, division, absolute_import, + print_function) + +__license__ = 'GPL v3' +__copyright__ = '2012, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +from operator import attrgetter + +from PyQt4.Qt import (QTabWidget, QTreeWidget, QTreeWidgetItem, Qt, QDialog, + QDialogButtonBox, QVBoxLayout, QSize) + +from calibre.gui2 import file_icon_provider + +def item(f, parent): + name = f.name + if not f.is_folder: + name += ' [%s]'%f.last_mod_string + ans = QTreeWidgetItem(parent, [name]) + ans.setData(0, Qt.UserRole, f.full_path) + if f.is_folder: + ext = 'dir' + else: + ext = f.name.rpartition('.')[-1] + ans.setData(0, Qt.DecorationRole, file_icon_provider().icon_from_ext(ext)) + + return ans + +class Storage(QTreeWidget): + + def __init__(self, storage, show_files): + QTreeWidget.__init__(self) + self.show_files = show_files + self.create_children(storage, self) + self.name = storage.name + self.object_id = storage.persistent_id + self.setMinimumHeight(350) + self.setHeaderHidden(True) + + def create_children(self, f, parent): + for child in sorted(f.folders, key=attrgetter('name')): + i = item(child, parent) + self.create_children(child, i) + if self.show_files: + for child in sorted(f.files, key=attrgetter('name')): + i = item(child, parent) + +class Folders(QTabWidget): + + def __init__(self, filesystem_cache, show_files=True): + QTabWidget.__init__(self) + self.fs = filesystem_cache + for storage in self.fs.entries: + w = Storage(storage, show_files) + self.addTab(w, w.name) + + self.setCurrentIndex(0) + +class Browser(QDialog): + + def __init__(self, filesystem_cache, show_files=True, parent=None): + QDialog.__init__(self, parent) + self.l = l = QVBoxLayout() + self.setLayout(l) + self.folders = cw = Folders(filesystem_cache, show_files=show_files) + l.addWidget(cw) + bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel) + l.addWidget(bb) + bb.accepted.connect(self.accept) + bb.rejected.connect(self.reject) + self.setMinimumSize(QSize(500, 500)) + +def browse(): + from calibre.gui2 import Application + from calibre.devices.mtp.driver import MTP_DEVICE + from calibre.devices.scanner import DeviceScanner + s = DeviceScanner() + s.scan() + app = Application([]) + app + dev = MTP_DEVICE(None) + dev.startup() + cd = dev.detect_managed_devices(s.devices) + if cd is None: + raise ValueError('No MTP device found') + dev.open(cd, 'test') + d = Browser(dev.filesystem_cache) + if d.exec_() == d.Accepted: + pass + dev.shutdown() + +if __name__ == '__main__': + browse() +