Browse Source

Use system file type specific icons in contents tab

The icon is determined via QFileIconProvider using filename extension only.
adaptive-webui-19844
Eugene Shalygin 8 years ago
parent
commit
30bf6e958f
  1. 3
      src/CMakeLists.txt
  2. 3
      src/gui/CMakeLists.txt
  3. 44
      src/gui/torrentcontentmodel.cpp
  4. 2
      src/gui/torrentcontentmodel.h
  5. 3
      src/src.pro

3
src/CMakeLists.txt

@ -14,6 +14,9 @@ find_package(LibtorrentRasterbar REQUIRED)
list(APPEND QBT_QT_COMPONENTS Core Network Xml) list(APPEND QBT_QT_COMPONENTS Core Network Xml)
if (GUI) if (GUI)
list (APPEND QBT_QT_COMPONENTS Concurrent Gui Widgets) list (APPEND QBT_QT_COMPONENTS Concurrent Gui Widgets)
if (WIN32)
list (APPEND QBT_QT_COMPONENTS WinExtras)
endif(WIN32)
endif (GUI) endif (GUI)
if (DBUS) if (DBUS)
list (APPEND QBT_QT_COMPONENTS DBus) list (APPEND QBT_QT_COMPONENTS DBus)

3
src/gui/CMakeLists.txt

@ -150,3 +150,6 @@ target_link_libraries(qbt_gui qbt_lineedit qbt_powermanagement qbt_rss qbt_prope
${QBT_GUI_OPTIONAL_LINK_LIBRARIES} qbt_base ${QBT_GUI_OPTIONAL_LINK_LIBRARIES} qbt_base
QtSingleApplication::QtSingleApplication QtSingleApplication::QtSingleApplication
) )
if(WIN32)
target_link_libraries(qbt_gui Qt5::WinExtras)
endif(WIN32)

44
src/gui/torrentcontentmodel.cpp

@ -29,8 +29,16 @@
*/ */
#include <QDir> #include <QDir>
#include <QFileIconProvider>
#include <QFileInfo>
#include <QIcon> #include <QIcon>
#ifdef Q_OS_WIN
#include <Windows.h>
#include <Shellapi.h>
#include <QtWin>
#endif
#include "guiiconprovider.h" #include "guiiconprovider.h"
#include "base/utils/misc.h" #include "base/utils/misc.h"
#include "base/utils/fs.h" #include "base/utils/fs.h"
@ -47,21 +55,53 @@ namespace
return cached; return cached;
} }
QIcon getFileIcon() class UnifiedFileIconProvider: public QFileIconProvider
{
public:
using QFileIconProvider::icon;
QIcon icon(const QFileInfo &info) const override
{ {
Q_UNUSED(info);
static QIcon cached = GuiIconProvider::instance()->getIcon("text-plain"); static QIcon cached = GuiIconProvider::instance()->getIcon("text-plain");
return cached; 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) TorrentContentModel::TorrentContentModel(QObject *parent)
: QAbstractItemModel(parent) : QAbstractItemModel(parent)
, m_rootItem(new TorrentContentModelFolder(QList<QVariant>({ tr("Name"), tr("Size"), tr("Progress"), tr("Download Priority"), tr("Remaining"), tr("Availability") }))) , 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() TorrentContentModel::~TorrentContentModel()
{ {
delete m_fileIconProvider;
delete m_rootItem; delete m_rootItem;
} }
@ -202,7 +242,7 @@ QVariant TorrentContentModel::data(const QModelIndex& index, int role) const
if (item->itemType() == TorrentContentModelItem::FolderType) if (item->itemType() == TorrentContentModelItem::FolderType)
return getDirectoryIcon(); return getDirectoryIcon();
else else
return getFileIcon(); return m_fileIconProvider->icon(QFileInfo(item->name()));
} }
if ((index.column() == TorrentContentModelItem::COL_NAME) && (role == Qt::CheckStateRole)) { if ((index.column() == TorrentContentModelItem::COL_NAME) && (role == Qt::CheckStateRole)) {

2
src/gui/torrentcontentmodel.h

@ -39,6 +39,7 @@
#include "base/bittorrent/torrentinfo.h" #include "base/bittorrent/torrentinfo.h"
#include "torrentcontentmodelitem.h" #include "torrentcontentmodelitem.h"
class QFileIconProvider;
class TorrentContentModelFile; class TorrentContentModelFile;
class TorrentContentModel: public QAbstractItemModel class TorrentContentModel: public QAbstractItemModel
@ -77,6 +78,7 @@ public slots:
private: private:
TorrentContentModelFolder *m_rootItem; TorrentContentModelFolder *m_rootItem;
QVector<TorrentContentModelFile *> m_filesIndex; QVector<TorrentContentModelFile *> m_filesIndex;
QFileIconProvider *m_fileIconProvider;
}; };
#endif // TORRENTCONTENTMODEL_H #endif // TORRENTCONTENTMODEL_H

3
src/src.pro

@ -28,6 +28,9 @@ nogui {
DEFINES += QBT_STATIC_QT DEFINES += QBT_STATIC_QT
QTPLUGIN += qico QTPLUGIN += qico
} }
win32 {
QT += winextras
}
TARGET = qbittorrent TARGET = qbittorrent
} }
nowebui: DEFINES += DISABLE_WEBUI nowebui: DEFINES += DISABLE_WEBUI

Loading…
Cancel
Save