mirror of
https://github.com/transmission/transmission
synced 2024-12-23 08:13:27 +00:00
(trunk, qt) #5483: use native windows icons, more win portability goodness from mikedld
This commit is contained in:
parent
e0e98cbed5
commit
9ef851e790
2 changed files with 69 additions and 2 deletions
69
qt/utils.cc
69
qt/utils.cc
|
@ -12,6 +12,11 @@
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#include <shellapi.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
@ -19,6 +24,7 @@
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QInputDialog>
|
#include <QInputDialog>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QPixmapCache>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QStyle>
|
#include <QStyle>
|
||||||
|
|
||||||
|
@ -31,6 +37,11 @@
|
||||||
****
|
****
|
||||||
***/
|
***/
|
||||||
|
|
||||||
|
#if defined(WIN32) && QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||||
|
// Should be in QtWinExtras soon, but for now let's import it manually
|
||||||
|
extern QPixmap qt_pixmapFromWinHICON(HICON icon);
|
||||||
|
#endif
|
||||||
|
|
||||||
QString
|
QString
|
||||||
Utils :: remoteFileChooser( QWidget * parent, const QString& title, const QString& myPath, bool dir, bool local )
|
Utils :: remoteFileChooser( QWidget * parent, const QString& title, const QString& myPath, bool dir, bool local )
|
||||||
{
|
{
|
||||||
|
@ -55,9 +66,64 @@ Utils :: toStderr( const QString& str )
|
||||||
std::cerr << qPrintable(str) << std::endl;
|
std::cerr << qPrintable(str) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QIcon&
|
#ifdef WIN32
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
void
|
||||||
|
addAssociatedFileIcon (const QFileInfo& fileInfo, UINT iconSize, QIcon& icon)
|
||||||
|
{
|
||||||
|
QString const pixmapCacheKey = QLatin1String ("tr_file_ext_") +
|
||||||
|
QString::number (iconSize) + "_" + fileInfo.suffix ();
|
||||||
|
QPixmap pixmap;
|
||||||
|
if (!QPixmapCache::find (pixmapCacheKey, &pixmap))
|
||||||
|
{
|
||||||
|
const QString filename = fileInfo.fileName ();
|
||||||
|
|
||||||
|
SHFILEINFO shellFileInfo;
|
||||||
|
if (::SHGetFileInfoW ((const wchar_t*) filename.utf16 (), FILE_ATTRIBUTE_NORMAL,
|
||||||
|
&shellFileInfo, sizeof(shellFileInfo),
|
||||||
|
SHGFI_ICON | iconSize | SHGFI_USEFILEATTRIBUTES) != 0)
|
||||||
|
{
|
||||||
|
if (shellFileInfo.hIcon != NULL)
|
||||||
|
{
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||||
|
pixmap = qt_pixmapFromWinHICON (shellFileInfo.hIcon);
|
||||||
|
#else
|
||||||
|
pixmap = QPixmap::fromWinHICON (shellFileInfo.hIcon);
|
||||||
|
#endif
|
||||||
|
::DestroyIcon (shellFileInfo.hIcon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QPixmapCache::insert (pixmapCacheKey, pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pixmap.isNull ())
|
||||||
|
icon.addPixmap (pixmap);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QIcon
|
||||||
Utils :: guessMimeIcon( const QString& filename )
|
Utils :: guessMimeIcon( const QString& filename )
|
||||||
{
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
QIcon icon;
|
||||||
|
|
||||||
|
if (!filename.isEmpty ())
|
||||||
|
{
|
||||||
|
const QFileInfo fileInfo (filename);
|
||||||
|
|
||||||
|
addAssociatedFileIcon (fileInfo, SHGFI_SMALLICON, icon);
|
||||||
|
addAssociatedFileIcon (fileInfo, 0, icon);
|
||||||
|
addAssociatedFileIcon (fileInfo, SHGFI_LARGEICON, icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (icon.isNull ())
|
||||||
|
icon = QApplication::style ()->standardIcon (QStyle::SP_FileIcon);
|
||||||
|
|
||||||
|
return icon;
|
||||||
|
#else
|
||||||
enum { DISK, DOCUMENT, PICTURE, VIDEO, ARCHIVE, AUDIO, APP, TYPE_COUNT };
|
enum { DISK, DOCUMENT, PICTURE, VIDEO, ARCHIVE, AUDIO, APP, TYPE_COUNT };
|
||||||
static QIcon fallback;
|
static QIcon fallback;
|
||||||
static QIcon fileIcons[TYPE_COUNT];
|
static QIcon fileIcons[TYPE_COUNT];
|
||||||
|
@ -116,6 +182,7 @@ Utils :: guessMimeIcon( const QString& filename )
|
||||||
return fileIcons[i];
|
return fileIcons[i];
|
||||||
|
|
||||||
return fallback;
|
return fallback;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -31,7 +31,7 @@ class Utils: public QObject
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static QString remoteFileChooser( QWidget * parent, const QString& title, const QString& myPath, bool dir, bool local );
|
static QString remoteFileChooser( QWidget * parent, const QString& title, const QString& myPath, bool dir, bool local );
|
||||||
static const QIcon& guessMimeIcon( const QString& filename );
|
static QIcon guessMimeIcon( const QString& filename );
|
||||||
// Test if string is UTF-8 or not
|
// Test if string is UTF-8 or not
|
||||||
static bool isValidUtf8 ( const char *s );
|
static bool isValidUtf8 ( const char *s );
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue