From 987bc9a2c5b39ddd4dc2a665cea65688bfd2179e Mon Sep 17 00:00:00 2001 From: wimpie Date: Sun, 09 Jan 2005 02:59:13 +0000 Subject: applnk : lazy loading of mime type icons (load only when needed) resource.cpp : print warning when requested image cannot be found and print the name of that image too --- (limited to 'library') diff --git a/library/applnk.cpp b/library/applnk.cpp index 1c1a227..80f2c62 100644 --- a/library/applnk.cpp +++ b/library/applnk.cpp @@ -981,17 +981,52 @@ void AppLnk::removeLinkFile() } } +class AppLnkImagePrivate { +public : + AppLnkImagePrivate( const QString & ImageName ) { + IconName = ImageName; + Small = 0; + Big = 0; + } + ~AppLnkImagePrivate( ) { + if ( Small ) delete Small; + if ( Big ) delete Big; + } + + inline QPixmap * small( void ) { + if( ! Small ) { + QImage unscaledIcon = Resource::loadImage( IconName ); + // works as long as smallSize remains static + Small = new QPixmap(); + Small->convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) ); + } + return Small; + } + + inline QPixmap * big( void ) { + if( ! Big ) { + QImage unscaledIcon = Resource::loadImage( IconName ); + // works as long as bigSize remains static + Big = new QPixmap(); + Big->convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) ); + } + return Big; + } + + QString IconName; + QPixmap * Small; + QPixmap * Big; +}; + class AppLnkSetPrivate { public: AppLnkSetPrivate() { - typPix.setAutoDelete(TRUE); - typPixBig.setAutoDelete(TRUE); - typName.setAutoDelete(TRUE); + typPix.setAutoDelete(TRUE); + typName.setAutoDelete(TRUE); } - QDict typPix; - QDict typPixBig; + QDict typPix; QDict typName; }; @@ -1086,55 +1121,52 @@ void AppLnkSet::findChildren(const QString &dr, const QString& typ, const QStrin QString typNameLocal = typName; if ( dir.exists( ".directory" ) ) { - Config config( dr + "/.directory", Config::File ); - config.setGroup( "Desktop Entry" ); - typNameLocal = config.readEntry( "Name", typNameLocal ); - if ( !typ.isEmpty() ) { - QString iconFile = config.readEntry( "Icon", "AppsIcon" ); - QImage unscaledIcon = Resource::loadImage( iconFile ); - QPixmap pm, bpm; - pm.convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) ); - bpm.convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) ); - d->typPix.insert(typ, new QPixmap(pm)); - d->typPixBig.insert(typ, new QPixmap(bpm)); - d->typName.insert(typ, new QString(typNameLocal)); - } + Config config( dr + "/.directory", Config::File ); + config.setGroup( "Desktop Entry" ); + typNameLocal = config.readEntry( "Name", typNameLocal ); + if ( !typ.isEmpty() ) { + d->typPix.insert( typ, + new AppLnkImagePrivate( config.readEntry( "Icon", "AppsIcon" ) ) + ); + d->typName.insert(typ, new QString(typNameLocal)); + + } } const QFileInfoList *list = dir.entryInfoList(); if ( list ) { - QFileInfo* fi; - bool cadded=FALSE; - for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) { - QString bn = fi->fileName(); -// qDebug("findChildren "+bn); - if ( bn[0] != '.' && bn != "CVS" ) { - if ( fi->isDir() ) { - QString c = typ.isNull() ? bn : typ+"/"+bn; - QString d = typNameLocal.isNull() ? bn : typNameLocal+"/"+bn; - findChildren(fi->filePath(), c, d, depth ); - } else { - if ( fi->extension(FALSE) == "desktop" ) { - AppLnk* app = new AppLnk( fi->filePath() ); + QFileInfo* fi; + bool cadded=FALSE; + for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) { + QString bn = fi->fileName(); + // qDebug("findChildren "+bn); + if ( bn[0] != '.' && bn != "CVS" ) { + if ( fi->isDir() ) { + QString c = typ.isNull() ? bn : typ+"/"+bn; + QString d = typNameLocal.isNull() ? bn : typNameLocal+"/"+bn; + findChildren(fi->filePath(), c, d, depth ); + } else { + if ( fi->extension(FALSE) == "desktop" ) { + AppLnk* app = new AppLnk( fi->filePath() ); #ifdef QT_NO_QWS_MULTIPROCESS - if ( !Global::isBuiltinCommand( app->exec() ) ) - delete app; - else + if ( !Global::isBuiltinCommand( app->exec() ) ) + delete app; + else #endif - { - if ( !typ.isEmpty() ) { - if ( !cadded ) { - typs.append(typ); - cadded = TRUE; - } - app->setType(typ); + { + if ( !typ.isEmpty() ) { + if ( !cadded ) { + typs.append(typ); + cadded = TRUE; + } + app->setType(typ); + } + add(app); + } + } } - add(app); - } } - } } - } } } @@ -1192,8 +1224,8 @@ QString AppLnkSet::typeName( const QString& t ) const */ QPixmap AppLnkSet::typePixmap( const QString& t ) const { - QPixmap *pm = d->typPix.find(t); - return pm ? *pm : QPixmap(); + AppLnkImagePrivate *alip = d->typPix.find(t); + return alip ? *(alip->small()) : QPixmap(); } /*! @@ -1204,8 +1236,8 @@ QPixmap AppLnkSet::typePixmap( const QString& t ) const */ QPixmap AppLnkSet::typeBigPixmap( const QString& t ) const { - QPixmap *pm = d->typPixBig.find(t); - return pm ? *pm : QPixmap(); + AppLnkImagePrivate *alip = d->typPix.find(t); + return alip ? *(alip->big()) : QPixmap(); } /*! diff --git a/library/resource.cpp b/library/resource.cpp index cfa0d26..b31876f 100644 --- a/library/resource.cpp +++ b/library/resource.cpp @@ -59,13 +59,19 @@ static bool g_notUseSet = ::getenv("OVERWRITE_ICON_SET"); Returns the QPixmap called \a pix. You should avoid including any filename type extension (e.g. .png, .xpm). */ +#include QPixmap Resource::loadPixmap( const QString &pix ) { - QPixmap pm; + QPixmap pm; // null pixmap QString key="QPE_"+pix; if ( !QPixmapCache::find(key,pm) ) { - pm.convertFromImage(loadImage(pix)); - QPixmapCache::insert(key,pm); + QImage I = loadImage(pix); + if( I.isNull() ) { + qWarning( "Could not load %s", pix.latin1() ); + } else { + pm.convertFromImage(I); + QPixmapCache::insert(key,pm); + } } return pm; } @@ -101,7 +107,6 @@ QString Resource::findPixmap( const QString &pix ) if ( QFile( f ).exists() ) return f; - // All formats... QStrList fileFormats = QImageIO::inputFormats(); QString ff = fileFormats.first(); -- cgit v0.9.0.2