KIO
kfilemetapreview.cpp
Go to the documentation of this file.
00001 /* 00002 * This file is part of the KDE project. 00003 * Copyright (C) 2003 Carsten Pfeiffer <pfeiffer@kde.org> 00004 * 00005 * You can Freely distribute this program under the GNU Library General Public 00006 * License. See the file "COPYING" for the exact licensing terms. 00007 */ 00008 00009 #include "kfilemetapreview.h" 00010 00011 #include <QtGui/QLayout> 00012 00013 #include <kdebug.h> 00014 #include <kio/previewjob.h> 00015 #include <kpluginloader.h> 00016 #include <kpluginfactory.h> 00017 #include <kimagefilepreview.h> 00018 00019 bool KFileMetaPreview::s_tryAudioPreview = true; 00020 00021 KFileMetaPreview::KFileMetaPreview( QWidget *parent ) 00022 : KPreviewWidgetBase( parent ), 00023 haveAudioPreview( false ) 00024 { 00025 QHBoxLayout *layout = new QHBoxLayout( this ); 00026 layout->setMargin( 0 ); 00027 m_stack = new QStackedWidget( this ); 00028 layout->addWidget( m_stack ); 00029 00030 // ### 00031 // m_previewProviders.setAutoDelete( true ); 00032 initPreviewProviders(); 00033 } 00034 00035 KFileMetaPreview::~KFileMetaPreview() 00036 { 00037 } 00038 00039 void KFileMetaPreview::initPreviewProviders() 00040 { 00041 qDeleteAll(m_previewProviders); 00042 m_previewProviders.clear(); 00043 // hardcoded so far 00044 00045 // image previews 00046 KImageFilePreview *imagePreview = new KImageFilePreview( m_stack ); 00047 (void) m_stack->addWidget( imagePreview ); 00048 m_stack->setCurrentWidget ( imagePreview ); 00049 resize( imagePreview->sizeHint() ); 00050 00051 const QStringList mimeTypes = imagePreview->supportedMimeTypes(); 00052 QStringList::ConstIterator it = mimeTypes.begin(); 00053 for ( ; it != mimeTypes.end(); ++it ) 00054 { 00055 // qDebug(".... %s", (*it).toLatin1().constData()); 00056 m_previewProviders.insert( *it, imagePreview ); 00057 } 00058 } 00059 00060 KPreviewWidgetBase* KFileMetaPreview::findExistingProvider(const QString& mimeType, const KMimeType::Ptr& mimeInfo) const 00061 { 00062 KPreviewWidgetBase* provider = m_previewProviders.value(mimeType); 00063 if ( provider ) 00064 return provider; 00065 00066 if ( mimeInfo ) { 00067 // check mime type inheritance 00068 const QStringList parentMimeTypes = mimeInfo->allParentMimeTypes(); 00069 Q_FOREACH(const QString& parentMimeType, parentMimeTypes) { 00070 provider = m_previewProviders.value(parentMimeType); 00071 if (provider) 00072 return provider; 00073 } 00074 } 00075 00076 // ### mimetype may be image/* for example, try that 00077 const int index = mimeType.indexOf( '/' ); 00078 if (index > 0) 00079 { 00080 provider = m_previewProviders.value(mimeType.left(index + 1) + '*'); 00081 if (provider) 00082 return provider; 00083 } 00084 00085 return 0; 00086 } 00087 00088 KPreviewWidgetBase * KFileMetaPreview::previewProviderFor( const QString& mimeType ) 00089 { 00090 KMimeType::Ptr mimeInfo = KMimeType::mimeType( mimeType ); 00091 00092 // qDebug("### looking for: %s", mimeType.toLatin1().constData()); 00093 // often the first highlighted item, where we can be sure, there is no plugin 00094 // (this "folders reflect icons" is a konq-specific thing, right?) 00095 if ( mimeInfo && mimeInfo->is("inode/directory") ) 00096 return 0L; 00097 00098 KPreviewWidgetBase *provider = findExistingProvider(mimeType, mimeInfo); 00099 if (provider) 00100 return provider; 00101 00102 //qDebug("#### didn't find anything for: %s", mimeType.toLatin1().constData()); 00103 00104 if ( s_tryAudioPreview && 00105 !mimeType.startsWith(QLatin1String("text/")) && 00106 !mimeType.startsWith(QLatin1String("image/")) ) 00107 { 00108 if ( !haveAudioPreview ) 00109 { 00110 KPreviewWidgetBase *audioPreview = createAudioPreview( m_stack ); 00111 if ( audioPreview ) 00112 { 00113 haveAudioPreview = true; 00114 (void) m_stack->addWidget( audioPreview ); 00115 const QStringList mimeTypes = audioPreview->supportedMimeTypes(); 00116 QStringList::ConstIterator it = mimeTypes.begin(); 00117 for ( ; it != mimeTypes.end(); ++it ) 00118 { 00119 // only add non already handled mimetypes 00120 if ( m_previewProviders.constFind( *it ) == m_previewProviders.constEnd() ) 00121 m_previewProviders.insert( *it, audioPreview ); 00122 } 00123 } 00124 } 00125 } 00126 00127 // with the new mimetypes from the audio-preview, try again 00128 provider = findExistingProvider(mimeType, mimeInfo); 00129 if (provider) 00130 return provider; 00131 00132 // The logic in this code duplicates the logic in PreviewJob. 00133 // But why do we need multiple KPreviewWidgetBase instances anyway? 00134 00135 return 0L; 00136 } 00137 00138 void KFileMetaPreview::showPreview(const KUrl &url) 00139 { 00140 KMimeType::Ptr mt = KMimeType::findByUrl( url ); 00141 KPreviewWidgetBase *provider = previewProviderFor( mt->name() ); 00142 if ( provider ) 00143 { 00144 if ( provider != m_stack->currentWidget() ) // stop the previous preview 00145 clearPreview(); 00146 00147 m_stack->setEnabled( true ); 00148 m_stack->setCurrentWidget( provider ); 00149 provider->showPreview( url ); 00150 } 00151 else 00152 { 00153 clearPreview(); 00154 m_stack->setEnabled( false ); 00155 } 00156 } 00157 00158 void KFileMetaPreview::clearPreview() 00159 { 00160 if ( m_stack->currentWidget() ) 00161 static_cast<KPreviewWidgetBase*>( m_stack->currentWidget() )->clearPreview(); 00162 } 00163 00164 void KFileMetaPreview::addPreviewProvider( const QString& mimeType, 00165 KPreviewWidgetBase *provider ) 00166 { 00167 m_previewProviders.insert( mimeType, provider ); 00168 } 00169 00170 00171 void KFileMetaPreview::clearPreviewProviders() 00172 { 00173 QHash<QString, KPreviewWidgetBase*>::const_iterator i = m_previewProviders.constBegin(); 00174 while (i != m_previewProviders.constEnd()) 00175 { 00176 m_stack->removeWidget(i.value()); 00177 ++i; 00178 } 00179 qDeleteAll(m_previewProviders); 00180 m_previewProviders.clear(); 00181 } 00182 00183 // static 00184 KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( QWidget *parent ) 00185 { 00186 KPluginLoader loader( "kfileaudiopreview" ); 00187 KPluginFactory *factory = loader.factory(); 00188 if ( !factory ) 00189 { 00190 kWarning() << "Couldn't load kfileaudiopreview" << loader.errorString(); 00191 s_tryAudioPreview = false; 00192 return 0L; 00193 } 00194 KPreviewWidgetBase* w = factory->create<KPreviewWidgetBase>( parent ); 00195 if ( w ) 00196 w->setObjectName( "kfileaudiopreview" ); 00197 return w; 00198 } 00199 00200 #include "kfilemetapreview.moc"
KDE 4.6 API Reference