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) @@ -14,6 +14,9 @@ find_package(LibtorrentRasterbar REQUIRED)
list(APPEND QBT_QT_COMPONENTS Core Network Xml)
if (GUI)
list (APPEND QBT_QT_COMPONENTS Concurrent Gui Widgets)
if (WIN32)
list (APPEND QBT_QT_COMPONENTS WinExtras)
endif(WIN32)
endif (GUI)
if (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 @@ -150,3 +150,6 @@ target_link_libraries(qbt_gui qbt_lineedit qbt_powermanagement qbt_rss qbt_prope
${QBT_GUI_OPTIONAL_LINK_LIBRARIES} qbt_base
QtSingleApplication::QtSingleApplication
)
if(WIN32)
target_link_libraries(qbt_gui Qt5::WinExtras)
endif(WIN32)

44
src/gui/torrentcontentmodel.cpp

@ -29,8 +29,16 @@ @@ -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 @@ -47,21 +55,53 @@ namespace
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");
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 @@ -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)) {

2
src/gui/torrentcontentmodel.h

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

3
src/src.pro

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

Loading…
Cancel
Save