def cb_insert_file_list(combobox, index, paths): model = combobox.model() iconprovider = QFileIconProvider() for i, path in enumerate(paths): basename = os.path.basename(path) item = QStandardItem(basename) item.setToolTip(path) item.setIcon(iconprovider.icon(QFileInfo(path))) model.insertRow(index + i, item)
def setFileIcon(self, path): "每当txtPath的值改变时,就设置快捷方式的图标" fi = QFileInfo(path) if not fi.exists(): self.shortcutIcon = QIcon(":/images/unknown.png") else: ip = QFileIconProvider() self.shortcutIcon = ip.icon(fi) self.btnFace.setIcon(self.shortcutIcon)
def RecentPath_asqstandarditem(pathitem): icon_provider = QFileIconProvider() # basename of a normalized name (strip right path component separators) basename = os.path.basename(os.path.normpath(pathitem.abspath)) item = QStandardItem(icon_provider.icon(QFileInfo(pathitem.abspath)), basename) item.setToolTip(pathitem.abspath) item.setData(pathitem, Qt.UserRole) return item
def dragFile(widget, filename, icon=None, dropactions=Qt.CopyAction): """Starts dragging the given local file from the widget.""" if icon is None or icon.isNull(): icon = QFileIconProvider().icon(QFileInfo(filename)) drag = QDrag(widget) data = QMimeData() data.setUrls([QUrl.fromLocalFile(filename)]) drag.setMimeData(data) drag.setPixmap(icon.pixmap(32)) drag.exec_(dropactions)
def cb_insert_file_list(combobox, index, paths): model = combobox.model() iconprovider = QFileIconProvider() for i, path in enumerate(paths): basename = os.path.basename(path) item = QStandardItem(basename) item.setToolTip(path) item.setIcon(iconprovider.icon(QFileInfo(path))) model.insertRow(index + i, item)
def dragFile(widget, filename, icon=None, dropactions=Qt.CopyAction): """Starts dragging the given local file from the widget.""" if icon is None or icon.isNull(): icon = QFileIconProvider().icon(QFileInfo(filename)) drag = QDrag(widget) data = QMimeData() data.setUrls([QUrl.fromLocalFile(filename)]) drag.setMimeData(data) drag.setPixmap(icon.pixmap(32)) drag.exec_(dropactions)
def RecentPath_asqstandarditem(pathitem): icon_provider = QFileIconProvider() # basename of a normalized name (strip right path component separators) basename = os.path.basename(os.path.normpath(pathitem.abspath)) item = QStandardItem( icon_provider.icon(QFileInfo(pathitem.abspath)), basename ) item.setToolTip(pathitem.abspath) item.setData(pathitem, Qt.UserRole) return item
def __init__(self, iconHandler): """ Constructor. """ self._iconHandler = iconHandler self._loadedIcons = dict() self._decoratedLinkIcons = dict() self._decoratedNotRetrievableDataIcons = dict() self._decoratedArchiveIcons = dict() self._decoratedUnavailableIcons = dict() qtIconProvider = QFileIconProvider() self._defaultDriveIcon = qtIconProvider.icon(QFileIconProvider.Drive) self._defaultFolderIcon = qtIconProvider.icon(QFileIconProvider.Folder) self._defaultFileIcon = qtIconProvider.icon(QFileIconProvider.File)
def __init__(self, iconHandler): """ Constructor. """ self._iconHandler = iconHandler self._loadedIcons = dict() self._decoratedLinkIcons = dict() self._decoratedNotRetrievableDataIcons = dict() self._decoratedArchiveIcons = dict() self._decoratedUnavailableIcons = dict() qtIconProvider = QFileIconProvider() self._defaultDriveIcon = qtIconProvider.icon(QFileIconProvider.Drive) self._defaultFolderIcon = qtIconProvider.icon(QFileIconProvider.Folder) self._defaultFileIcon = qtIconProvider.icon(QFileIconProvider.File)
def changeFileIcon(self): "用户点击了更换图标按钮。" filename = QFileDialog.getOpenFileName(self, self.windowTitle()) if filename == "": return image = QImage(filename) if not image.isNull(): self.shortcutIcon = QIcon(QPixmap.fromImage(image)) else: ip = QFileIconProvider() shortcutIcon = ip.icon(QFileInfo(filename)) if shortcutIcon.isNull(): QMessageBox.information(self, self.trUtf8("更换图标"), self.trUtf8("您选择的文件不包含任何可以使用的图标。")) return self.shortcutIcon = shortcutIcon self.iconPath = filename self.btnFace.setIcon(self.shortcutIcon)
def paint(self, painter, option, index): filePath = self.model.filePath(index) fileName = self.model.fileName(index) r = option.rect img = QPixmap(filePath) if img.isNull(): # If not image file, try to load icon with QFileIconProvider # according to file type (extension name). # Currently not work as intended. fileInfo = self.model.fileInfo(index) icon = QFileIconProvider().icon(fileInfo) img = icon.pixmap(QSize(32, 32)) # Scale to height, align center horizontally, align bottom vertically. if img.height() > self.thumbHeight: img = img.scaledToHeight(self.thumbHeight, Qt.SmoothTransformation) if img.width() > self.thumbHeight: img = img.scaledToWidth(self.thumbHeight, Qt.SmoothTransformation) imgLeft = (self.width - img.width()) / 2 imgTop = self.thumbHeight - img.height() painter.drawPixmap(r.left() + imgLeft, r.top() + imgTop, img) rect = QRect(r.left(), r.top() + self.thumbHeight, self.width, self.nameHeight) flag = Qt.AlignHCenter | Qt.TextWrapAnywhere # get the bounding rectangle of the fileName bdRect = painter.boundingRect(rect, flag, fileName) if bdRect.height() < rect.height(): rect = bdRect if option.state & QStyle.State_Selected: painter.setBrush(self.parent().palette().highlight()) painter.drawRoundedRect(rect, 5, 5) pen = QPen(self.parent().palette().highlightedText(), 1, Qt.SolidLine) else: pen = QPen(self.parent().palette().text(), 1, Qt.SolidLine) painter.setPen(pen) painter.drawText(rect, flag, fileName)
def paint(self, painter, option, index): filePath = self.model.filePath(index) fileName = self.model.fileName(index) r = option.rect img = QPixmap(filePath) if img.isNull(): # If not image file, try to load icon with QFileIconProvider # according to file type (extension name). # Currently not work as intended. fileInfo = self.model.fileInfo(index) icon = QFileIconProvider().icon(fileInfo) img = icon.pixmap(QSize(32, 32)) # Scale to height, align center horizontally, align bottom vertically. if img.height() > self.thumbHeight: img = img.scaledToHeight(self.thumbHeight, Qt.SmoothTransformation) if img.width() > self.thumbHeight: img = img.scaledToWidth(self.thumbHeight, Qt.SmoothTransformation) imgLeft = (self.width - img.width()) / 2 imgTop = self.thumbHeight - img.height() painter.drawPixmap(r.left()+imgLeft, r.top()+imgTop, img) rect = QRect(r.left(), r.top()+self.thumbHeight, self.width, self.nameHeight) flag = Qt.AlignHCenter | Qt.TextWrapAnywhere # get the bounding rectangle of the fileName bdRect = painter.boundingRect(rect, flag, fileName) if bdRect.height() < rect.height(): rect = bdRect if option.state & QStyle.State_Selected: painter.setBrush(self.parent().palette().highlight()) painter.drawRoundedRect(rect, 5, 5) pen = QPen(self.parent().palette().highlightedText(), 1, Qt.SolidLine) else: pen = QPen(self.parent().palette().text(), 1, Qt.SolidLine) painter.setPen(pen) painter.drawText(rect, flag, fileName)
def getShortcutIcon(shortcut): if shortcut["icon"]: icon = QIcon(shortcut["icon"]) if not icon.isNull(): return icon iconProvider = QFileIconProvider() if shortcut["path"] == COMPUTER_PATH: return QIcon(":/images/user-home.png") elif shortcut["path"] == DOCUMENTS_PATH: documentsIcon = iconProvider.icon(QFileInfo(QDesktopServices.storageLocation(QDesktopServices.DocumentsLocation))) if documentsIcon.isNull(): return QIcon(":/images/folder-documents.png") else: return documentsIcon elif shortcut["path"] == MUSIC_PATH: musicIcon = iconProvider.icon(QFileInfo(QDesktopServices.storageLocation(QDesktopServices.MusicLocation))) if musicIcon.isNull(): return QIcon(":/images/folder-sound.png") else: return musicIcon elif shortcut["path"] == PICTURES_PATH: picturesIcon = iconProvider.icon(QFileInfo(QDesktopServices.storageLocation(QDesktopServices.PicturesLocation))) if picturesIcon.isNull(): return QIcon(":/images/folder-image.png") else: return picturesIcon else: url = QUrl.fromUserInput(shortcut["path"]) if url.scheme() == "file": if os.path.exists(shortcut["path"]): icon = iconProvider.icon(QFileInfo(url.toLocalFile())) if not icon.isNull(): return icon return QIcon(":/images/unknown.png") else: return QIcon(":/images/httpurl.png") return QIcon(":/images/unknown.png")
def _setFileIcon(self, curPath): if os.path.exists(curPath): fileInfo = QFileInfo(curPath) iconProvider = QFileIconProvider() icon = iconProvider.icon(fileInfo) self._fileIconLabel.setPixmap(icon.pixmap(16,16))
class MergeScanTreeModel(QAbstractItemModel): COL_CHECKED = 0 COL_NAME = 0 COL_ICON = 0 COL_CHANGE_TYPE = 1 COL_SIZE = 2 COL_PERMISSIONS = 3 COL_DATE_MODIFIED = 4 # make me larger if you add more columns... COL_MAX = 5 IconProvider = QFileIconProvider() def __init__(self, docu, mapper, rootMergeScans, owner=None): super(MergeScanTreeModel, self).__init__(owner) self.document = docu self.mapper = mapper self.roots = rootMergeScans def flags(self, index): if not index.isValid(): return 0 ms = self.mapper.getMergeScanForId(index.internalId()) if ms is None or ms.flags == PersistentScanningState.ITEM_DELETED: return Qt.ItemIsSelectable flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable if index.column() == MergeScanTreeModel.COL_CHECKED: flags |= Qt.ItemIsUserCheckable return flags def headerData(self, section, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole: if section == MergeScanTreeModel.COL_CHECKED or section == MergeScanTreeModel.COL_NAME: return "Path" elif section == MergeScanTreeModel.COL_SIZE: return "Size" elif section == MergeScanTreeModel.COL_PERMISSIONS: return "Permissions" elif section == MergeScanTreeModel.COL_CHANGE_TYPE: return "Change" elif section == MergeScanTreeModel.COL_DATE_MODIFIED: return "Modification Date" return QVariant() def mergeScanForIndex(self, index): """Public method that provides a FileSystemMerge object or None for any QModelIndex in the model""" return self.mapper.getMergeScanForId(index.internalId()) def columnCount(self, parent): return MergeScanTreeModel.COL_MAX def hasChildren(self, parent): if not parent.isValid(): return len(self.roots) > 0 item = self.mapper.getMergeScanForId(parent.internalId()) #logger.debug("hasChildren: ms {0}, # children: {1}".format(item, len(item.children))) return len(item.children) > 0 def index(self, row, col, parent): if col >= MergeScanTreeModel.COL_MAX: return QModelIndex() if not parent.isValid(): if row >= len(self.roots): logger.critical( "index: row/col {0}/{1} asked for a row where the parent is not valid" .format(row / col)) return QModelIndex() id = self.mapper.getUniqueIDForPath(self.roots[row].abs_path) else: id = parent.internalId() child = self.mapper.getMergeScanForId(id) if row >= len(child.children): logger.critical( "index: method requested row > child.children count") return QModelIndex() id = self.mapper.storeMergeScan(child.children[row]) if id != MergeScanMapper.INVALID_ID: return self.createIndex(row, col, id) logger.critical( "index: for row/col {0}/{1}, parent id {2} the internal id was invalid" .format(row, col, parent.internalId())) return QModelIndex() def setCheckedStateForMergeScan(self, ms, value, emit_layout_events=True): # looks weird, but a layout changed emission causes the view to redraw without losing the selection state if emit_layout_events: self.layoutAboutToBeChanged.emit() ms.checked = value ms.propagateCheckedStateToChildren() ms.propagateCurrentCheckedStateToParents() if emit_layout_events: self.layoutChanged.emit() def setData(self, index, value, role): if role != Qt.CheckStateRole or not index.isValid( ) or index.column() != MergeScanTreeModel.COL_CHECKED: return False id = index.internalId() ms = self.mapper.getMergeScanForId(id) if ms.flags == PersistentScanningState.ITEM_DELETED: return False if ms is not None: self.setCheckedStateForMergeScan(ms, value.toInt()[0]) return True return False def data(self, index, role): if not index.isValid(): return QVariant() ms = self.mapper.getMergeScanForId(index.internalId()) if ms is None: logger.critical( "data: wasn't able to get the FileSystemMerge for internal id {0}" .format(index.internalId())) return QVariant() if role == Qt.CheckStateRole and index.column( ) == MergeScanTreeModel.COL_CHECKED: return ms.checked if role == Qt.DecorationRole and index.column( ) == MergeScanTreeModel.COL_ICON: return self.IconProvider.icon( QFileIconProvider.Folder) if ms.is_dir else None if role == Qt.TextColorRole: if ms.flags == PersistentScanningState.ITEM_DELETED: return QColor(Qt.red) return QVariant() if role == Qt.FontRole: font = QFont() info = PathInfo(ms.abs_path, ms.path_info) if info.is_symlink or ms.flags == PersistentScanningState.ITEM_UNREADABLE: font.setItalic(True) return font if role == Qt.DisplayRole: data = None if index.column() == MergeScanTreeModel.COL_NAME: data = os.path.basename(ms.abs_path) if "Sample" in data: x = 0 elif index.column() == MergeScanTreeModel.COL_CHANGE_TYPE: if ms.flags == PersistentScanningState.ITEM_ADDED: data = "Added" elif ms.flags == PersistentScanningState.ITEM_DELETED: data = "Deleted" elif ms.flags == PersistentScanningState.ITEM_MODIFIED: data = "Modified" elif ms.flags == PersistentScanningState.ITEM_UNCHANGED: data = "" elif index.column() == MergeScanTreeModel.COL_SIZE: data = PathInfo( ms.abs_path, ms.path_info ).size_human_readable if not ms.is_dir else None elif index.column() == MergeScanTreeModel.COL_DATE_MODIFIED: value = QDateTime.fromTime_t( int(PathInfo(ms.abs_path, ms.path_info).modified_date)) data = value.toString() elif index.column() == MergeScanTreeModel.COL_PERMISSIONS: info = PathInfo(ms.abs_path, ms.path_info) data = "{0}:{1} {2}".format(info.uid, info.gid, info.posix_perms_human_readable) return data return QVariant() def parent(self, index): if not index.isValid(): return QModelIndex() internal_id = index.internalId() ms = self.mapper.getMergeScanForId(internal_id) if ms is None: return QModelIndex() ms_parent = ms.parent if ms_parent is None: return QModelIndex() parent_id = self.mapper.storeMergeScan(ms_parent) grand_parent = ms_parent.parent if grand_parent is None: # which row number is this parent at in the top level? row = self.roots.index(ms_parent) else: self.mapper.storeMergeScan(grand_parent) row = grand_parent.children.index(ms_parent) return self.createIndex(row, 0, parent_id) def rowCount(self, parent): if parent.isValid(): item = self.mapper.getMergeScanForId(parent.internalId()) return len(item.children) return len(self.roots)
def __init__(self): QFileIconProvider.__init__(self)
def icon(self, arg): # added robustness for filenames like "filename.50.20.jpg" if arg.completeSuffix().split(".")[-1] in ["PNG", "png", "jpg", "JPG", "JPEG", "jpeg", "GIF", "gif"]: return QIcon(":/image.png") else: return QFileIconProvider.icon(self, arg)
def icon(self): provider = QFileIconProvider() return provider.icon(QFileInfo(self.abspath))
class FileSystemItem(QObject): """ An element in the FileSystemModel. """ iconProvider = QFileIconProvider() fileExtensions = ['*.qlr'] xmlSearchableTags = ['title', 'abstract','layername', 'attribution'] def __init__(self, file, recurse = True, recursion_counter = None, namingregex = None): super(FileSystemItem, self).__init__() # Raise exception if root path has too many child elements if recursion_counter: recursion_counter.increment() if isinstance(file, QFileInfo): self.fileinfo = file else: self.fileinfo = QFileInfo(file) self.fullpath = self.fileinfo.absoluteFilePath() self.basename = self.fileinfo.completeBaseName() self.displayname = self.fileinfo.fileName() if self.fileinfo.isDir() else self.fileinfo.completeBaseName() if namingregex: self.displayname = namingregex.match(self.displayname).group(1) self.icon = FileSystemItem.iconProvider.icon(self.fileinfo) self.isdir = self.fileinfo.isDir() self.children = [] if self.isdir else None if self.isdir and recurse: qdir = QDir(self.fullpath) for finfo in qdir.entryInfoList( FileSystemItem.fileExtensions , QDir.Files | QDir.AllDirs | QDir.NoDotAndDotDot,QDir.Name): self.children.append(FileSystemItem(finfo, recurse, recursion_counter, namingregex)) else: # file # Populate this if and when needed self.searchablecontent = None def filtered(self, filter): """ Filters the root path. :filter is a string. Is it contained in the basename or displayname then this item will be rendered. :return: the directory item. If nothing is found returns None. """ if not filter: return self filterlower = filter.lower() namematch = self.name_matches(filter) if self.isdir: if namematch: # Stop searching. Return this dir and all sub items return FileSystemItem(self.fullpath, True) else: # Only return dir if at least one sub item is a filter match diritem = FileSystemItem(self.fullpath, False) for child in self.children: childmatch = child.filtered(filter) if childmatch is not None: diritem.children.append((childmatch)) if len(diritem.children) > 0: return diritem else: if self.searchablecontent is None: self.searchablecontent = self.get_searchable_content().lower() if namematch or self.content_matches(filter): return FileSystemItem(self.fullpath, False) return None def matches(self, searchterm): """Returns true if this item mathces the searchterm""" return self.name_matches(searchterm) or self.content_matches(searchterm) def name_matches(self, searchterm): """Returns true if the searchterm matches the name of this item""" lowered = searchterm.lower() return lowered in self.basename.lower() or lowered in self.displayname.lower() def content_matches(self, searchterm): """Returns True if the searchterm matches content of this item""" if self.isdir: return False lowered = searchterm.lower() if self.searchablecontent is None: self.searchablecontent = self.get_searchable_content().lower() return lowered in self.searchablecontent def get_searchable_content(self): """ Pulls out tags from the object and returns them in order to be used by the filtered() method. """ f = QFile(self.fileinfo.absoluteFilePath()) f.open(QIODevice.ReadOnly) #stream = QTextStream(f) #stream.setCodec("UTF-8") try: doc = QDomDocument() doc.setContent( f.readAll() ) docelt = doc.documentElement() texts = [] for tagName in FileSystemItem.xmlSearchableTags: nodes = docelt.elementsByTagName(tagName) for i in range(nodes.count()): node = nodes.at(i) value = node.firstChild().toText().data() #print value texts.append( value ) # Add keywords nodes = docelt.elementsByTagName("keywordList") for i in range(nodes.count()): kwnode = nodes.at(i) valnodes = kwnode.toElement().elementsByTagName("value") for j in range(valnodes.count()): value = valnodes.at(j).firstChild().toText().data() texts.append(value) return u' '.join(texts) finally: f.close()
def file_type(name): """Returns an icon for the given filename or extension.""" if '.' not in name: name = 'test.' + name return QFileIconProvider().icon(QFileInfo(name))
def icon(self): provider = QFileIconProvider() return provider.icon(QFileInfo(self.abspath))