// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qfileiconprovider.h" #include "qfileiconprovider_p.h" #include #include #include #include #include #include #include #include #include #include #if defined(Q_OS_WIN) # include # include # include #endif QT_BEGIN_NAMESPACE /*! \class QFileIconProvider \inmodule QtWidgets \brief The QFileIconProvider class provides file icons for the QFileSystemModel class. */ QFileIconProviderPrivate::QFileIconProviderPrivate(QFileIconProvider *q) : QAbstractFileIconProviderPrivate(q), homePath(QDir::home().absolutePath()) { } QIcon QFileIconProviderPrivate::getIcon(QStyle::StandardPixmap name) const { switch (name) { case QStyle::SP_FileIcon: if (file.isNull()) file = QApplication::style()->standardIcon(name); return file; case QStyle::SP_FileLinkIcon: if (fileLink.isNull()) fileLink = QApplication::style()->standardIcon(name); return fileLink; case QStyle::SP_DirIcon: if (directory.isNull()) directory = QApplication::style()->standardIcon(name); return directory; case QStyle::SP_DirLinkIcon: if (directoryLink.isNull()) directoryLink = QApplication::style()->standardIcon(name); return directoryLink; case QStyle::SP_DriveHDIcon: if (harddisk.isNull()) harddisk = QApplication::style()->standardIcon(name); return harddisk; case QStyle::SP_DriveFDIcon: if (floppy.isNull()) floppy = QApplication::style()->standardIcon(name); return floppy; case QStyle::SP_DriveCDIcon: if (cdrom.isNull()) cdrom = QApplication::style()->standardIcon(name); return cdrom; case QStyle::SP_DriveNetIcon: if (network.isNull()) network = QApplication::style()->standardIcon(name); return network; case QStyle::SP_ComputerIcon: if (computer.isNull()) computer = QApplication::style()->standardIcon(name); return computer; case QStyle::SP_DesktopIcon: if (desktop.isNull()) desktop = QApplication::style()->standardIcon(name); return desktop; case QStyle::SP_TrashIcon: if (trashcan.isNull()) trashcan = QApplication::style()->standardIcon(name); return trashcan; case QStyle::SP_DirHomeIcon: if (home.isNull()) home = QApplication::style()->standardIcon(name); return home; default: return QIcon(); } return QIcon(); } /*! Constructs a file icon provider. */ QFileIconProvider::QFileIconProvider() : QAbstractFileIconProvider(*new QFileIconProviderPrivate(this)) { } /*! Destroys the file icon provider. */ QFileIconProvider::~QFileIconProvider() = default; /*! \reimp */ QIcon QFileIconProvider::icon(IconType type) const { Q_D(const QFileIconProvider); switch (type) { case Computer: return d->getIcon(QStyle::SP_ComputerIcon); case Desktop: return d->getIcon(QStyle::SP_DesktopIcon); case Trashcan: return d->getIcon(QStyle::SP_TrashIcon); case Network: return d->getIcon(QStyle::SP_DriveNetIcon); case Drive: return d->getIcon(QStyle::SP_DriveHDIcon); case Folder: return d->getIcon(QStyle::SP_DirIcon); case File: return d->getIcon(QStyle::SP_FileIcon); default: break; }; return QIcon(); } QIcon QFileIconProviderPrivate::getIcon(const QFileInfo &fi) const { return getPlatformThemeIcon(fi); } /*! \reimp */ QIcon QFileIconProvider::icon(const QFileInfo &info) const { Q_D(const QFileIconProvider); QIcon retIcon = d->getIcon(info); if (!retIcon.isNull()) return retIcon; const QString &path = info.absoluteFilePath(); if (path.isEmpty() || QFileSystemEntry::isRootPath(path)) #if defined (Q_OS_WIN) { UINT type = GetDriveType(reinterpret_cast(path.utf16())); switch (type) { case DRIVE_REMOVABLE: return d->getIcon(QStyle::SP_DriveFDIcon); case DRIVE_FIXED: return d->getIcon(QStyle::SP_DriveHDIcon); case DRIVE_REMOTE: return d->getIcon(QStyle::SP_DriveNetIcon); case DRIVE_CDROM: return d->getIcon(QStyle::SP_DriveCDIcon); case DRIVE_RAMDISK: case DRIVE_UNKNOWN: case DRIVE_NO_ROOT_DIR: default: return d->getIcon(QStyle::SP_DriveHDIcon); } } #else return d->getIcon(QStyle::SP_DriveHDIcon); #endif if (info.isFile()) { if (info.isSymLink()) return d->getIcon(QStyle::SP_FileLinkIcon); else return d->getIcon(QStyle::SP_FileIcon); } if (info.isDir()) { if (info.isSymLink()) { return d->getIcon(QStyle::SP_DirLinkIcon); } else { if (info.absoluteFilePath() == d->homePath) { return d->getIcon(QStyle::SP_DirHomeIcon); } else { return d->getIcon(QStyle::SP_DirIcon); } } } return QIcon(); } QT_END_NAMESPACE