Esempio n. 1
1
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)
Esempio n. 2
0
 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
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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
Esempio n. 8
0
 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)
Esempio n. 9
0
    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)
Esempio n. 10
0
 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)
Esempio n. 11
0
    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)
Esempio n. 12
0
    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)
Esempio n. 13
0
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))
Esempio n. 15
0
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)
Esempio n. 16
0
 def __init__(self):
     QFileIconProvider.__init__(self)
Esempio n. 17
0
 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)
Esempio n. 18
0
 def icon(self):
     provider = QFileIconProvider()
     return provider.icon(QFileInfo(self.abspath))
Esempio n. 19
0
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()
Esempio n. 20
0
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))
Esempio n. 21
0
 def icon(self):
     provider = QFileIconProvider()
     return provider.icon(QFileInfo(self.abspath))