class FileIconProvider(object): def __init__(self): self.qt_provider = QFileIconProvider() def __getitem__(self, path): icon = QIcon() has_images = False with disposable_hicon(get_file_icon(path)) as hicon: pixmap = pixmap_from_hicon(hicon) if pixmap: icon.addPixmap(pixmap) has_images = True with disposable_hicon(get_file_icon(path, large=True)) as hicon: pixmap = pixmap_from_hicon(hicon) if pixmap: icon.addPixmap(pixmap) has_images = True if has_images: return icon return self.qt_provider.icon(QFileIconProvider.File)
def __init__(self, res): QWidget.__init__(self) self.res = res layout = QVBoxLayout() self.setLayout(layout) preview = QLabel() if 'image' in res.mime: pixmap = QPixmap(res.file_path).scaledToWidth(32) else: info = QFileInfo(res.file_path) pixmap = QFileIconProvider().icon(info).pixmap(32, 32) preview.setPixmap(pixmap) preview.setMask(pixmap.mask()) preview.setMaximumHeight(32) label = QLabel() label.setText(res.file_name) layout.addWidget(preview) layout.addWidget(label) layout.setAlignment(Qt.AlignHCenter) self.setFixedWidth(64) self.setFixedHeight(64)
def __init__(self, path='', parent=None): '''Initialise with root *path*.''' super(Filesystem, self).__init__(parent=parent) self.root = ItemFactory(path) self.columns = ['Name', 'Size', 'Type', 'Date Modified'] self.iconFactory = QFileIconProvider()
class Filesystem(QAbstractItemModel): '''Model representing filesystem.''' ITEM_ROLE = Qt.UserRole + 1 def __init__(self, path='', parent=None): '''Initialise with root *path*.''' super(Filesystem, self).__init__(parent=parent) self.root = ItemFactory(path) self.columns = ['Name', 'Size', 'Type', 'Date Modified'] self.iconFactory = QFileIconProvider() def rowCount(self, parent): '''Return number of children *parent* index has.''' if parent.column() > 0: return 0 if parent.isValid(): item = parent.internalPointer() else: item = self.root return len(item.children) def columnCount(self, parent): '''Return amount of data *parent* index has.''' return len(self.columns) def flags(self, index): '''Return flags for *index*.''' if not index.isValid(): return Qt.NoItemFlags return Qt.ItemIsEnabled | Qt.ItemIsSelectable def index(self, row, column, parent): '''Return index for *row* and *column* under *parent*.''' if not self.hasIndex(row, column, parent): return QModelIndex() if not parent.isValid(): item = self.root else: item = parent.internalPointer() try: child = item.children[row] except IndexError: return QModelIndex() else: return self.createIndex(row, column, child) def pathIndex(self, path): '''Return index of item with *path*.''' if path == self.root.path: return QModelIndex() if not path.startswith(self.root.path): return QModelIndex() parts = [] while True: if path == self.root.path: break head, tail = os.path.split(path) if head == path: if path: parts.append(path) break parts.append(tail) path = head parts.reverse() if parts: item = self.root count = 0 for count, part in enumerate(parts): matched = False for child in item.children: if child.name == part: item = child matched = True break if not matched: break if count + 1 == len(parts): return self.createIndex(item.row, 0, item) return QModelIndex() def parent(self, index): '''Return parent of *index*.''' if not index.isValid(): return QModelIndex() item = index.internalPointer() if not item: return QModelIndex() parent = item.parent if not parent or parent == self.root: return QModelIndex() return self.createIndex(parent.row, 0, parent) def item(self, index): '''Return item at *index*.''' return self.data(index, role=self.ITEM_ROLE) def icon(self, index): '''Return icon for index.''' return self.data(index, role=Qt.DecorationRole) def data(self, index, role): '''Return data for *index* according to *role*.''' if not index.isValid(): return None column = index.column() item = index.internalPointer() if role == self.ITEM_ROLE: return item elif role == Qt.DisplayRole: if column == 0: return item.name elif column == 1: if item.size: return item.size elif column == 2: return item.type elif column == 3: if item.modified is not None: return item.modified.strftime('%c') elif role == Qt.DecorationRole: if column == 0: icon = self.iconFactory.icon(QFileInfo(item.path)) if icon is None or icon.isNull(): if isinstance(item, Directory): icon = QIcon(':icon_folder') elif isinstance(item, Mount): icon = QIcon(':icon_drive') elif isinstance(item, Collection): icon = QIcon(':icon_collection') else: icon = QIcon(':icon_file') return icon elif role == Qt.TextAlignmentRole: if column == 1: return Qt.AlignRight else: return Qt.AlignLeft return None def headerData(self, section, orientation, role): '''Return label for *section* according to *orientation* and *role*.''' if orientation == Qt.Horizontal: if section < len(self.columns): column = self.columns[section] if role == Qt.DisplayRole: return column return None def hasChildren(self, index): '''Return if *index* has children. Optimised to avoid loading children at this stage. ''' if not index.isValid(): item = self.root else: item = index.internalPointer() if not item: return False return item.mayHaveChildren() def canFetchMore(self, index): '''Return if more data available for *index*.''' if not index.isValid(): item = self.root else: item = index.internalPointer() return item.canFetchMore() def fetchMore(self, index): '''Fetch additional data under *index*.''' if not index.isValid(): item = self.root else: item = index.internalPointer() if item.canFetchMore(): startIndex = len(item.children) additionalChildren = item.fetchChildren() endIndex = startIndex + len(additionalChildren) - 1 if endIndex >= startIndex: self.beginInsertRows(index, startIndex, endIndex) for newChild in additionalChildren: item.addChild(newChild) self.endInsertRows() def reset(self): '''Reset model''' self.beginResetModel() self.root.refetch() self.endResetModel()
def __init__(self): self.qt_provider = QFileIconProvider()
class FileIconProvider(object): def __init__(self): self.qt_provider = QFileIconProvider() def __getitem__(self, path): return self.qt_provider.icon(QFileInfo(path))