Files
qt-creator/src/plugins/coreplugin/fileiconprovider.cpp
hjk 65cc8ae4c2 Core: Clean up FileIconProvider interface
Change-Id: I98c3c8796cb887f5bb3c5184854562ff36727836
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
2013-09-13 14:06:16 +02:00

205 lines
6.4 KiB
C++

/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#include "fileiconprovider.h"
#include "mimedatabase.h"
#include <utils/hostosinfo.h>
#include <utils/qtcassert.h>
#include <QApplication>
#include <QStyle>
#include <QPainter>
#include <QFileInfo>
#include <QPair>
#include <QDebug>
#include <QFileIconProvider>
#include <QIcon>
using namespace Utils;
/*!
\class Core::FileIconProvider
Provides icons based on file suffixes with the ability to overwrite system
icons for specific subtypes. The underlying QFileIconProvider
can be used for QFileSystemModel.
Note: Registering overlay icons currently completely replaces the system
icon and is therefore not recommended on platforms that have their
own overlay icon handling (Mac/Windows).
Plugins can register custom overlay icons via registerIconOverlayForSuffix(), and
retrieve icons via the icon() method.
*/
// Cache icons in a list of pairs suffix/icon which should be faster than
// hashes for small lists.
namespace Core {
namespace FileIconProvider {
enum { debug = 0 };
typedef QPair<QString, QIcon> StringIconPair;
typedef QList<StringIconPair> StringIconPairList;
class FileIconProviderImplementation : public QFileIconProvider
{
public:
FileIconProviderImplementation()
: m_unknownFileIcon(qApp->style()->standardIcon(QStyle::SP_FileIcon))
{}
QIcon icon(const QFileInfo &info) const;
using QFileIconProvider::icon;
void registerIconOverlayForSuffix(const QIcon &icon, const QString &suffix)
{
if (debug)
qDebug() << "FileIconProvider::registerIconOverlayForSuffix" << suffix;
QTC_ASSERT(!icon.isNull() && !suffix.isEmpty(), return);
const QPixmap fileIconPixmap = FileIconProvider::overlayIcon(QStyle::SP_FileIcon, icon, QSize(16, 16));
// replace old icon, if it exists
for (int i = 0, n = m_cache.size(); i != n; ++i) {
if (m_cache.at(i).first == suffix) {
m_cache[i].second = fileIconPixmap;
return;
}
}
m_cache.append(StringIconPair(suffix, fileIconPixmap));
}
void registerIconOverlayForMimeType(const QIcon &icon, const MimeType &mimeType)
{
foreach (const QString &suffix, mimeType.suffixes())
registerIconOverlayForSuffix(icon, suffix);
}
// Mapping of file suffix to icon.
StringIconPairList m_cache;
QIcon m_unknownFileIcon;
};
FileIconProviderImplementation *instance()
{
static FileIconProviderImplementation theInstance;
return &theInstance;
}
QFileIconProvider *iconProvider()
{
return instance();
}
QIcon FileIconProviderImplementation::icon(const QFileInfo &fileInfo) const
{
if (debug)
qDebug() << "FileIconProvider::icon" << fileInfo.absoluteFilePath();
// Check for cached overlay icons by file suffix.
if (!m_cache.isEmpty() && !fileInfo.isDir()) {
const QString suffix = fileInfo.suffix();
if (!suffix.isEmpty()) {
for (int i = 0, n = m_cache.size(); i != n; ++i)
if (m_cache.at(i).first == suffix)
return m_cache[i].second;
}
}
// Get icon from OS.
if (HostOsInfo::isWindowsHost() || HostOsInfo::isMacHost())
return QFileIconProvider::icon(fileInfo);
// File icons are unknown on linux systems.
return fileInfo.isDir() ? QFileIconProvider::icon(fileInfo) : m_unknownFileIcon;
}
/*!
Returns the icon associated with the file suffix in fileInfo. If there is none,
the default icon of the operating system is returned.
*/
QIcon icon(const QFileInfo &info)
{
return instance()->icon(info);
}
/*!
* \overload
*/
QIcon icon(QFileIconProvider::IconType type)
{
return instance()->icon(type);
}
/*!
Creates a pixmap with baseicon at size and overlays overlayIcon over it.
See platform note in class documentation about recommended usage.
*/
QPixmap overlayIcon(QStyle::StandardPixmap baseIcon, const QIcon &overlayIcon, const QSize &size)
{
QPixmap iconPixmap = qApp->style()->standardIcon(baseIcon).pixmap(size);
QPainter painter(&iconPixmap);
painter.drawPixmap(0, 0, overlayIcon.pixmap(size));
painter.end();
return iconPixmap;
}
/*!
Registers an icon for a given suffix, overlaying the system file icon.
See platform note in class documentation about recommended usage.
*/
void registerIconOverlayForSuffix(const char *path, const char *suffix)
{
instance()->registerIconOverlayForSuffix(QIcon(QLatin1String(path)), QLatin1String(suffix));
}
/*!
Registers an icon for all the suffixes of a given mime type, overlaying the system file icon.
*/
void registerIconOverlayForMimeType(const QIcon &icon, const char *mimeType)
{
instance()->registerIconOverlayForMimeType(icon, MimeDatabase::findByType(QString::fromLatin1(mimeType)));
}
/*!
* \overload
*/
void registerIconOverlayForMimeType(const char *path, const char *mimeType)
{
instance()->registerIconOverlayForMimeType(QIcon(QLatin1String(path)), MimeDatabase::findByType(QString::fromLatin1(mimeType)));
}
} // namespace FileIconProvider
} // namespace Core