mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-07-31 03:50:20 -07:00
Use system file type specific icons in contents tab
The icon is determined via QFileIconProvider using filename extension only.
This commit is contained in:
parent
8318f72a9e
commit
30bf6e958f
5 changed files with 56 additions and 5 deletions
|
@ -29,8 +29,16 @@
|
|||
*/
|
||||
|
||||
#include <QDir>
|
||||
#include <QFileIconProvider>
|
||||
#include <QFileInfo>
|
||||
#include <QIcon>
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#include <Windows.h>
|
||||
#include <Shellapi.h>
|
||||
#include <QtWin>
|
||||
#endif
|
||||
|
||||
#include "guiiconprovider.h"
|
||||
#include "base/utils/misc.h"
|
||||
#include "base/utils/fs.h"
|
||||
|
@ -47,21 +55,53 @@ namespace
|
|||
return cached;
|
||||
}
|
||||
|
||||
QIcon getFileIcon()
|
||||
class UnifiedFileIconProvider: public QFileIconProvider
|
||||
{
|
||||
static QIcon cached = GuiIconProvider::instance()->getIcon("text-plain");
|
||||
return cached;
|
||||
}
|
||||
public:
|
||||
using QFileIconProvider::icon;
|
||||
QIcon icon(const QFileInfo &info) const override
|
||||
{
|
||||
Q_UNUSED(info);
|
||||
static QIcon cached = GuiIconProvider::instance()->getIcon("text-plain");
|
||||
return cached;
|
||||
}
|
||||
};
|
||||
#ifdef Q_OS_WIN
|
||||
// See QTBUG-25319 for explanation why this is required
|
||||
class WinShellFileIconProvider: public UnifiedFileIconProvider
|
||||
{
|
||||
public:
|
||||
using QFileIconProvider::icon;
|
||||
QIcon icon(const QFileInfo &info) const override
|
||||
{
|
||||
SHFILEINFO sfi = { 0 };
|
||||
HRESULT hr = ::SHGetFileInfoW(info.absoluteFilePath().toStdWString().c_str(),
|
||||
FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES);
|
||||
if (FAILED(hr))
|
||||
return UnifiedFileIconProvider::icon(info);
|
||||
|
||||
QPixmap iconPixmap = QtWin::fromHICON(sfi.hIcon);
|
||||
::DestroyIcon(sfi.hIcon);
|
||||
return QIcon(iconPixmap);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
}
|
||||
|
||||
TorrentContentModel::TorrentContentModel(QObject *parent)
|
||||
: QAbstractItemModel(parent)
|
||||
, m_rootItem(new TorrentContentModelFolder(QList<QVariant>({ tr("Name"), tr("Size"), tr("Progress"), tr("Download Priority"), tr("Remaining"), tr("Availability") })))
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
m_fileIconProvider = new WinShellFileIconProvider();
|
||||
#else
|
||||
m_fileIconProvider = new QFileIconProvider();
|
||||
#endif
|
||||
}
|
||||
|
||||
TorrentContentModel::~TorrentContentModel()
|
||||
{
|
||||
delete m_fileIconProvider;
|
||||
delete m_rootItem;
|
||||
}
|
||||
|
||||
|
@ -202,7 +242,7 @@ QVariant TorrentContentModel::data(const QModelIndex& index, int role) const
|
|||
if (item->itemType() == TorrentContentModelItem::FolderType)
|
||||
return getDirectoryIcon();
|
||||
else
|
||||
return getFileIcon();
|
||||
return m_fileIconProvider->icon(QFileInfo(item->name()));
|
||||
}
|
||||
|
||||
if ((index.column() == TorrentContentModelItem::COL_NAME) && (role == Qt::CheckStateRole)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue