summaryrefslogtreecommitdiff
authorwimpie <wimpie>2005-01-09 02:59:13 (UTC)
committer wimpie <wimpie>2005-01-09 02:59:13 (UTC)
commit987bc9a2c5b39ddd4dc2a665cea65688bfd2179e (patch) (unidiff)
tree815fc6d12162f1a5eccc4b1ae0da61dea3811bdf
parente54346d28b19d3ac671802a25e8c03f346693291 (diff)
downloadopie-987bc9a2c5b39ddd4dc2a665cea65688bfd2179e.zip
opie-987bc9a2c5b39ddd4dc2a665cea65688bfd2179e.tar.gz
opie-987bc9a2c5b39ddd4dc2a665cea65688bfd2179e.tar.bz2
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
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/applnk.cpp130
-rw-r--r--library/resource.cpp13
2 files changed, 90 insertions, 53 deletions
diff --git a/library/applnk.cpp b/library/applnk.cpp
index 1c1a227..80f2c62 100644
--- a/library/applnk.cpp
+++ b/library/applnk.cpp
@@ -968,43 +968,78 @@ void AppLnk::removeFiles()
968 968
969/*! 969/*!
970 Deletes the linkFile(), leaving any file() untouched. 970 Deletes the linkFile(), leaving any file() untouched.
971 971
972 \sa removeFiles() 972 \sa removeFiles()
973*/ 973*/
974void AppLnk::removeLinkFile() 974void AppLnk::removeLinkFile()
975{ 975{
976 if ( isValid() && linkFileKnown() && QFile::remove(linkFile()) ) { 976 if ( isValid() && linkFileKnown() && QFile::remove(linkFile()) ) {
977#ifndef QT_NO_COP 977#ifndef QT_NO_COP
978 QCopEnvelope e("QPE/System", "linkChanged(QString)"); 978 QCopEnvelope e("QPE/System", "linkChanged(QString)");
979 e << linkFile(); 979 e << linkFile();
980#endif 980#endif
981 } 981 }
982} 982}
983 983
984class AppLnkImagePrivate {
985public :
986 AppLnkImagePrivate( const QString & ImageName ) {
987 IconName = ImageName;
988 Small = 0;
989 Big = 0;
990 }
991 ~AppLnkImagePrivate( ) {
992 if ( Small ) delete Small;
993 if ( Big ) delete Big;
994 }
995
996 inline QPixmap * small( void ) {
997 if( ! Small ) {
998 QImage unscaledIcon = Resource::loadImage( IconName );
999 // works as long as smallSize remains static
1000 Small = new QPixmap();
1001 Small->convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) );
1002 }
1003 return Small;
1004 }
1005
1006 inline QPixmap * big( void ) {
1007 if( ! Big ) {
1008 QImage unscaledIcon = Resource::loadImage( IconName );
1009 // works as long as bigSize remains static
1010 Big = new QPixmap();
1011 Big->convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) );
1012 }
1013 return Big;
1014 }
1015
1016 QString IconName;
1017 QPixmap * Small;
1018 QPixmap * Big;
1019};
1020
984class AppLnkSetPrivate { 1021class AppLnkSetPrivate {
985public: 1022public:
986 AppLnkSetPrivate() 1023 AppLnkSetPrivate()
987 { 1024 {
988 typPix.setAutoDelete(TRUE); 1025 typPix.setAutoDelete(TRUE);
989 typPixBig.setAutoDelete(TRUE); 1026 typName.setAutoDelete(TRUE);
990 typName.setAutoDelete(TRUE);
991 } 1027 }
992 1028
993 QDict<QPixmap> typPix; 1029 QDict<AppLnkImagePrivate> typPix;
994 QDict<QPixmap> typPixBig;
995 QDict<QString> typName; 1030 QDict<QString> typName;
996}; 1031};
997 1032
998/*! 1033/*!
999 \class AppLnkSet applnk.h 1034 \class AppLnkSet applnk.h
1000 \brief The AppLnkSet class is a set of AppLnk objects. 1035 \brief The AppLnkSet class is a set of AppLnk objects.
1001*/ 1036*/
1002 1037
1003/*! 1038/*!
1004 \fn QStringList AppLnkSet::types() const 1039 \fn QStringList AppLnkSet::types() const
1005 1040
1006 Returns the list of \link applnk.html#Types types\endlink in the set. 1041 Returns the list of \link applnk.html#Types types\endlink in the set.
1007 1042
1008 For applications, games and settings the type is \c Application; 1043 For applications, games and settings the type is \c Application;
1009 for documents the type is the document's MIME type. 1044 for documents the type is the document's MIME type.
1010 1045
@@ -1073,81 +1108,78 @@ AppLnkSet::~AppLnkSet()
1073 a->mId = 0; 1108 a->mId = 0;
1074 delete a; 1109 delete a;
1075 } 1110 }
1076 delete d; 1111 delete d;
1077} 1112}
1078 1113
1079void AppLnkSet::findChildren(const QString &dr, const QString& typ, const QString& typName, int depth) 1114void AppLnkSet::findChildren(const QString &dr, const QString& typ, const QString& typName, int depth)
1080{ 1115{
1081 depth++; 1116 depth++;
1082 if ( depth > 10 ) 1117 if ( depth > 10 )
1083 return; 1118 return;
1084 1119
1085 QDir dir( dr ); 1120 QDir dir( dr );
1086 QString typNameLocal = typName; 1121 QString typNameLocal = typName;
1087 1122
1088 if ( dir.exists( ".directory" ) ) { 1123 if ( dir.exists( ".directory" ) ) {
1089 Config config( dr + "/.directory", Config::File ); 1124 Config config( dr + "/.directory", Config::File );
1090 config.setGroup( "Desktop Entry" ); 1125 config.setGroup( "Desktop Entry" );
1091 typNameLocal = config.readEntry( "Name", typNameLocal ); 1126 typNameLocal = config.readEntry( "Name", typNameLocal );
1092 if ( !typ.isEmpty() ) { 1127 if ( !typ.isEmpty() ) {
1093 QString iconFile = config.readEntry( "Icon", "AppsIcon" ); 1128 d->typPix.insert( typ,
1094 QImage unscaledIcon = Resource::loadImage( iconFile ); 1129 new AppLnkImagePrivate( config.readEntry( "Icon", "AppsIcon" ) )
1095 QPixmap pm, bpm; 1130 );
1096 pm.convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) ); 1131 d->typName.insert(typ, new QString(typNameLocal));
1097 bpm.convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) ); 1132
1098 d->typPix.insert(typ, new QPixmap(pm)); 1133 }
1099 d->typPixBig.insert(typ, new QPixmap(bpm));
1100 d->typName.insert(typ, new QString(typNameLocal));
1101 }
1102 } 1134 }
1103 1135
1104 const QFileInfoList *list = dir.entryInfoList(); 1136 const QFileInfoList *list = dir.entryInfoList();
1105 if ( list ) { 1137 if ( list ) {
1106 QFileInfo* fi; 1138 QFileInfo* fi;
1107 bool cadded=FALSE; 1139 bool cadded=FALSE;
1108 for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) { 1140 for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) {
1109 QString bn = fi->fileName(); 1141 QString bn = fi->fileName();
1110// qDebug("findChildren "+bn); 1142 // qDebug("findChildren "+bn);
1111 if ( bn[0] != '.' && bn != "CVS" ) { 1143 if ( bn[0] != '.' && bn != "CVS" ) {
1112 if ( fi->isDir() ) { 1144 if ( fi->isDir() ) {
1113 QString c = typ.isNull() ? bn : typ+"/"+bn; 1145 QString c = typ.isNull() ? bn : typ+"/"+bn;
1114 QString d = typNameLocal.isNull() ? bn : typNameLocal+"/"+bn; 1146 QString d = typNameLocal.isNull() ? bn : typNameLocal+"/"+bn;
1115 findChildren(fi->filePath(), c, d, depth ); 1147 findChildren(fi->filePath(), c, d, depth );
1116 } else { 1148 } else {
1117 if ( fi->extension(FALSE) == "desktop" ) { 1149 if ( fi->extension(FALSE) == "desktop" ) {
1118 AppLnk* app = new AppLnk( fi->filePath() ); 1150 AppLnk* app = new AppLnk( fi->filePath() );
1119#ifdef QT_NO_QWS_MULTIPROCESS 1151#ifdef QT_NO_QWS_MULTIPROCESS
1120 if ( !Global::isBuiltinCommand( app->exec() ) ) 1152 if ( !Global::isBuiltinCommand( app->exec() ) )
1121 delete app; 1153 delete app;
1122 else 1154 else
1123#endif 1155#endif
1124 { 1156 {
1125 if ( !typ.isEmpty() ) { 1157 if ( !typ.isEmpty() ) {
1126 if ( !cadded ) { 1158 if ( !cadded ) {
1127 typs.append(typ); 1159 typs.append(typ);
1128 cadded = TRUE; 1160 cadded = TRUE;
1129 } 1161 }
1130 app->setType(typ); 1162 app->setType(typ);
1163 }
1164 add(app);
1165 }
1166 }
1131 } 1167 }
1132 add(app);
1133 }
1134 } 1168 }
1135 }
1136 } 1169 }
1137 }
1138 } 1170 }
1139} 1171}
1140 1172
1141/*! 1173/*!
1142 Adds AppLnk \a f to the set. The set takes responsibility for 1174 Adds AppLnk \a f to the set. The set takes responsibility for
1143 deleting \a f. 1175 deleting \a f.
1144 1176
1145 \sa remove() 1177 \sa remove()
1146*/ 1178*/
1147void AppLnkSet::add( AppLnk *f ) 1179void AppLnkSet::add( AppLnk *f )
1148{ 1180{
1149 if ( f->mId == 0 ) { 1181 if ( f->mId == 0 ) {
1150 AppLnk::lastId++; 1182 AppLnk::lastId++;
1151 f->mId = AppLnk::lastId; 1183 f->mId = AppLnk::lastId;
1152 mApps.append( f ); 1184 mApps.append( f );
1153 } else { 1185 } else {
@@ -1179,46 +1211,46 @@ bool AppLnkSet::remove( AppLnk *f )
1179 for documents the type is the document's MIME type. 1211 for documents the type is the document's MIME type.
1180*/ 1212*/
1181QString AppLnkSet::typeName( const QString& t ) const 1213QString AppLnkSet::typeName( const QString& t ) const
1182{ 1214{
1183 QString *st = d->typName.find(t); 1215 QString *st = d->typName.find(t);
1184 return st ? *st : QString::null; 1216 return st ? *st : QString::null;
1185} 1217}
1186 1218
1187/*! 1219/*!
1188 Returns the small pixmap associated with type \a t. 1220 Returns the small pixmap associated with type \a t.
1189 1221
1190 For applications, games and settings the type is \c Application; 1222 For applications, games and settings the type is \c Application;
1191 for documents the type is the document's MIME type. 1223 for documents the type is the document's MIME type.
1192*/ 1224*/
1193QPixmap AppLnkSet::typePixmap( const QString& t ) const 1225QPixmap AppLnkSet::typePixmap( const QString& t ) const
1194{ 1226{
1195 QPixmap *pm = d->typPix.find(t); 1227 AppLnkImagePrivate *alip = d->typPix.find(t);
1196 return pm ? *pm : QPixmap(); 1228 return alip ? *(alip->small()) : QPixmap();
1197} 1229}
1198 1230
1199/*! 1231/*!
1200 Returns the large pixmap associated with type \a t. 1232 Returns the large pixmap associated with type \a t.
1201 1233
1202 For applications, games and settings the type is \c Application; 1234 For applications, games and settings the type is \c Application;
1203 for documents the type is the document's MIME type. 1235 for documents the type is the document's MIME type.
1204*/ 1236*/
1205QPixmap AppLnkSet::typeBigPixmap( const QString& t ) const 1237QPixmap AppLnkSet::typeBigPixmap( const QString& t ) const
1206{ 1238{
1207 QPixmap *pm = d->typPixBig.find(t); 1239 AppLnkImagePrivate *alip = d->typPix.find(t);
1208 return pm ? *pm : QPixmap(); 1240 return alip ? *(alip->big()) : QPixmap();
1209} 1241}
1210 1242
1211/*! 1243/*!
1212 Returns the AppLnk with the given \a id. 1244 Returns the AppLnk with the given \a id.
1213*/ 1245*/
1214const AppLnk *AppLnkSet::find( int id ) const 1246const AppLnk *AppLnkSet::find( int id ) const
1215{ 1247{
1216 QListIterator<AppLnk> it( children() ); 1248 QListIterator<AppLnk> it( children() );
1217 1249
1218 for ( ; it.current(); ++it ) { 1250 for ( ; it.current(); ++it ) {
1219 const AppLnk *app = it.current(); 1251 const AppLnk *app = it.current();
1220 if ( app->id() == id ) 1252 if ( app->id() == id )
1221 return app; 1253 return app;
1222 } 1254 }
1223 1255
1224 return 0; 1256 return 0;
diff --git a/library/resource.cpp b/library/resource.cpp
index cfa0d26..b31876f 100644
--- a/library/resource.cpp
+++ b/library/resource.cpp
@@ -46,39 +46,45 @@ static bool g_notUseSet = ::getenv("OVERWRITE_ICON_SET");
46 46
47 Images can be loaded with loadImage(), loadPixmap(), loadBitmap() 47 Images can be loaded with loadImage(), loadPixmap(), loadBitmap()
48 and loadIconSet(). 48 and loadIconSet().
49 49
50 \ingroup qtopiaemb 50 \ingroup qtopiaemb
51*/ 51*/
52 52
53/*! 53/*!
54 \fn Resource::Resource() 54 \fn Resource::Resource()
55 \internal 55 \internal
56*/ 56*/
57 57
58/*! 58/*!
59 Returns the QPixmap called \a pix. You should avoid including 59 Returns the QPixmap called \a pix. You should avoid including
60 any filename type extension (e.g. .png, .xpm). 60 any filename type extension (e.g. .png, .xpm).
61*/ 61*/
62#include <stdio.h>
62QPixmap Resource::loadPixmap( const QString &pix ) 63QPixmap Resource::loadPixmap( const QString &pix )
63{ 64{
64 QPixmap pm; 65 QPixmap pm; // null pixmap
65 QString key="QPE_"+pix; 66 QString key="QPE_"+pix;
66 if ( !QPixmapCache::find(key,pm) ) { 67 if ( !QPixmapCache::find(key,pm) ) {
67 pm.convertFromImage(loadImage(pix)); 68 QImage I = loadImage(pix);
68 QPixmapCache::insert(key,pm); 69 if( I.isNull() ) {
70 qWarning( "Could not load %s", pix.latin1() );
71 } else {
72 pm.convertFromImage(I);
73 QPixmapCache::insert(key,pm);
74 }
69 } 75 }
70 return pm; 76 return pm;
71} 77}
72 78
73/*! 79/*!
74 Returns the QBitmap called \a pix. You should avoid including 80 Returns the QBitmap called \a pix. You should avoid including
75 any filename type extension (e.g. .png, .xpm). 81 any filename type extension (e.g. .png, .xpm).
76*/ 82*/
77QBitmap Resource::loadBitmap( const QString &pix ) 83QBitmap Resource::loadBitmap( const QString &pix )
78{ 84{
79 QBitmap bm; 85 QBitmap bm;
80 bm = loadPixmap(pix); 86 bm = loadPixmap(pix);
81 return bm; 87 return bm;
82} 88}
83 89
84/*! 90/*!
@@ -88,33 +94,32 @@ QBitmap Resource::loadBitmap( const QString &pix )
88 Normally you will use loadPixmap() rather than this function. 94 Normally you will use loadPixmap() rather than this function.
89*/ 95*/
90QString Resource::findPixmap( const QString &pix ) 96QString Resource::findPixmap( const QString &pix )
91{ 97{
92 QString picsPath = QPEApplication::qpeDir() + "pics/"; 98 QString picsPath = QPEApplication::qpeDir() + "pics/";
93 99
94 QString f; 100 QString f;
95 101
96 // Common case optimizations... 102 // Common case optimizations...
97 f = picsPath + pix + ".png"; 103 f = picsPath + pix + ".png";
98 if ( QFile( f ).exists() ) 104 if ( QFile( f ).exists() )
99 return f; 105 return f;
100 f = picsPath + pix + ".xpm"; 106 f = picsPath + pix + ".xpm";
101 if ( QFile( f ).exists() ) 107 if ( QFile( f ).exists() )
102 return f; 108 return f;
103 109
104
105 // All formats... 110 // All formats...
106 QStrList fileFormats = QImageIO::inputFormats(); 111 QStrList fileFormats = QImageIO::inputFormats();
107 QString ff = fileFormats.first(); 112 QString ff = fileFormats.first();
108 while ( fileFormats.current() ) { 113 while ( fileFormats.current() ) {
109 QStringList exts = MimeType("image/"+ff.lower()).extensions(); 114 QStringList exts = MimeType("image/"+ff.lower()).extensions();
110 for ( QStringList::ConstIterator it = exts.begin(); it!=exts.end(); ++it ) { 115 for ( QStringList::ConstIterator it = exts.begin(); it!=exts.end(); ++it ) {
111 QString f = picsPath + pix + "." + *it; 116 QString f = picsPath + pix + "." + *it;
112 if ( QFile(f).exists() ) 117 if ( QFile(f).exists() )
113 return f; 118 return f;
114 } 119 }
115 ff = fileFormats.next(); 120 ff = fileFormats.next();
116 } 121 }
117 122
118 // Finally, no (or existing) extension... 123 // Finally, no (or existing) extension...
119 if ( QFile( picsPath + pix ).exists() ) 124 if ( QFile( picsPath + pix ).exists() )
120 return picsPath + pix; 125 return picsPath + pix;