qskinny/src/graphic/QskGraphicProvider.cpp
2018-08-03 08:15:28 +02:00

107 lines
2.4 KiB
C++

/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskGraphicProvider.h"
#include "QskGraphic.h"
#include "QskSetup.h"
#include <qcache.h>
#include <qdebug.h>
#include <qurl.h>
class QskGraphicProvider::PrivateData
{
public:
// caching of graphics
QCache< QString, const QskGraphic > cache;
};
QskGraphicProvider::QskGraphicProvider( QObject* parent )
: QObject( parent )
, m_data( new PrivateData() )
{
}
QskGraphicProvider::~QskGraphicProvider()
{
}
void QskGraphicProvider::setCacheSize( int size )
{
if ( size < 0 )
size = 0;
m_data->cache.setMaxCost( size );
}
int QskGraphicProvider::cacheSize() const
{
return m_data->cache.maxCost();
}
void QskGraphicProvider::clearCache()
{
m_data->cache.clear();
}
const QskGraphic* QskGraphicProvider::requestGraphic( const QString& id ) const
{
const QskGraphic* graphic = m_data->cache.object( id );
if ( graphic == nullptr )
{
graphic = loadGraphic( id );
if ( graphic == nullptr )
{
qWarning() << "QskGraphicProvider: can't load" << id;
return nullptr;
}
const int cost = 1; // TODO ...
m_data->cache.insert( id, graphic, cost );
}
return graphic;
}
void Qsk::addGraphicProvider(
const QString& providerId, QskGraphicProvider* provider )
{
qskSetup->addGraphicProvider( providerId, provider );
}
QskGraphicProvider* Qsk::graphicProvider( const QString& providerId )
{
return qskSetup->graphicProvider( providerId );
}
QskGraphic Qsk::loadGraphic( const char* source )
{
return loadGraphic( QUrl( source ) );
}
QskGraphic Qsk::loadGraphic( const QUrl& url )
{
static QskGraphic nullGraphic;
QString imageId = url.toString( QUrl::RemoveScheme |
QUrl::RemoveAuthority | QUrl::NormalizePathSegments );
if ( imageId.isEmpty() )
return nullGraphic;
if ( imageId[ 0 ] == '/' )
imageId = imageId.mid( 1 );
const QString providerId = url.host();
const QskGraphic* graphic = nullptr;
if ( const auto provider = qskSetup->graphicProvider( providerId ) )
graphic = provider->requestGraphic( imageId );
return graphic ? *graphic : nullGraphic;
}