mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
MTP: Filesystem browser widget
This commit is contained in:
parent
5008cc5d92
commit
e35622a98b
96
src/calibre/gui2/device_drivers/mtp_folder_browser.py
Normal file
96
src/calibre/gui2/device_drivers/mtp_folder_browser.py
Normal file
@ -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 <kovid at kovidgoyal.net>'
|
||||||
|
__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()
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user