-rw-r--r-- | library/applnk.cpp | 130 |
1 files changed, 81 insertions, 49 deletions
diff --git a/library/applnk.cpp b/library/applnk.cpp index 1c1a227..80f2c62 100644 --- a/library/applnk.cpp +++ b/library/applnk.cpp @@ -952,75 +952,110 @@ void AppLnk::removeFiles() bool valid = isValid(); if ( !valid || !linkFileKnown() || QFile::remove(linkFile()) ) { if ( QFile::remove(file()) ) { #ifndef QT_NO_COP QCopEnvelope e("QPE/System", "linkChanged(QString)"); if ( linkFileKnown() ) e << linkFile(); else e << file(); #endif } else if ( valid ) { // restore link writeLink(); } } } /*! Deletes the linkFile(), leaving any file() untouched. \sa removeFiles() */ void AppLnk::removeLinkFile() { if ( isValid() && linkFileKnown() && QFile::remove(linkFile()) ) { #ifndef QT_NO_COP QCopEnvelope e("QPE/System", "linkChanged(QString)"); e << linkFile(); #endif } } +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<QPixmap> typPix; - QDict<QPixmap> typPixBig; + QDict<AppLnkImagePrivate> typPix; QDict<QString> typName; }; /*! \class AppLnkSet applnk.h \brief The AppLnkSet class is a set of AppLnk objects. */ /*! \fn QStringList AppLnkSet::types() const Returns the list of \link applnk.html#Types types\endlink in the set. For applications, games and settings the type is \c Application; for documents the type is the document's MIME type. \sa AppLnk::type(), typeName(), typePixmap(), typeBigPixmap() */ /*! \fn const QList<AppLnk>& AppLnkSet::children() const Returns the members of the set. */ /*! Constructs an empty AppLnkSet. */ AppLnkSet::AppLnkSet() : d(new AppLnkSetPrivate) { } @@ -1057,184 +1092,181 @@ void AppLnkSet::detachChildren() a->mId = 0; } mApps.clear(); } /*! Destroys the set, deleting all the AppLnk objects it contains. \sa detachChildren() */ AppLnkSet::~AppLnkSet() { QListIterator<AppLnk> it( mApps ); for ( ; it.current(); ) { AppLnk* a = *it; ++it; a->mId = 0; delete a; } delete d; } void AppLnkSet::findChildren(const QString &dr, const QString& typ, const QString& typName, int depth) { depth++; if ( depth > 10 ) return; QDir dir( dr ); 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); - } } - } } - } } } /*! Adds AppLnk \a f to the set. The set takes responsibility for deleting \a f. \sa remove() */ void AppLnkSet::add( AppLnk *f ) { if ( f->mId == 0 ) { AppLnk::lastId++; f->mId = AppLnk::lastId; mApps.append( f ); } else { qWarning("Attempt to add an AppLnk twice"); } } /*! Removes AppLnk \a f to the set. The caller becomes responsible for deleting \a f. Returns TRUE if \a f was in the set; otherwise returns FALSE. \sa add() */ bool AppLnkSet::remove( AppLnk *f ) { if ( mApps.remove( f ) ) { f->mId = 0; return TRUE; } return FALSE; } /*! Returns the localized name for type \a t. For applications, games and settings the type is \c Application; for documents the type is the document's MIME type. */ QString AppLnkSet::typeName( const QString& t ) const { QString *st = d->typName.find(t); return st ? *st : QString::null; } /*! Returns the small pixmap associated with type \a t. For applications, games and settings the type is \c Application; for documents the type is the document's MIME type. */ 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(); } /*! Returns the large pixmap associated with type \a t. For applications, games and settings the type is \c Application; for documents the type is the document's MIME type. */ 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(); } /*! Returns the AppLnk with the given \a id. */ const AppLnk *AppLnkSet::find( int id ) const { QListIterator<AppLnk> it( children() ); for ( ; it.current(); ++it ) { const AppLnk *app = it.current(); if ( app->id() == id ) return app; } return 0; } /*! Returns the AppLnk with the given \a exec attribute. */ const AppLnk *AppLnkSet::findExec( const QString& exec ) const { QListIterator<AppLnk> it( children() ); for ( ; it.current(); ++it ) { const AppLnk *app = it.current(); if ( app->exec() == exec ) return app; } return 0; |