KIO
kfilemetapreview.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "kfilemetapreview.h"
00010
00011 #include <QtGui/QLayout>
00012
00013 #include <kio/previewjob.h>
00014 #include <kpluginloader.h>
00015 #include <kpluginfactory.h>
00016 #include <kimagefilepreview.h>
00017
00018 bool KFileMetaPreview::s_tryAudioPreview = true;
00019
00020 KFileMetaPreview::KFileMetaPreview( QWidget *parent )
00021 : KPreviewWidgetBase( parent ),
00022 haveAudioPreview( false )
00023 {
00024 QHBoxLayout *layout = new QHBoxLayout( this );
00025 layout->setMargin( 0 );
00026 m_stack = new QStackedWidget( this );
00027 layout->addWidget( m_stack );
00028
00029
00030
00031 initPreviewProviders();
00032 }
00033
00034 KFileMetaPreview::~KFileMetaPreview()
00035 {
00036 }
00037
00038 void KFileMetaPreview::initPreviewProviders()
00039 {
00040 qDeleteAll(m_previewProviders);
00041 m_previewProviders.clear();
00042
00043
00044
00045 KImageFilePreview *imagePreview = new KImageFilePreview( m_stack );
00046 (void) m_stack->addWidget( imagePreview );
00047 m_stack->setCurrentWidget ( imagePreview );
00048 resize( imagePreview->sizeHint() );
00049
00050 const QStringList mimeTypes = imagePreview->supportedMimeTypes();
00051 QStringList::ConstIterator it = mimeTypes.begin();
00052 for ( ; it != mimeTypes.end(); ++it )
00053 {
00054
00055 m_previewProviders.insert( *it, imagePreview );
00056 }
00057 }
00058
00059 KPreviewWidgetBase* KFileMetaPreview::findExistingProvider(const QString& mimeType, const KMimeType::Ptr& mimeInfo) const
00060 {
00061 KPreviewWidgetBase* provider = m_previewProviders.value(mimeType);
00062 if ( provider )
00063 return provider;
00064
00065 if ( mimeInfo ) {
00066
00067 const QStringList parentMimeTypes = mimeInfo->allParentMimeTypes();
00068 Q_FOREACH(const QString& parentMimeType, parentMimeTypes) {
00069 provider = m_previewProviders.value(parentMimeType);
00070 if (provider)
00071 return provider;
00072 }
00073 }
00074
00075
00076 const int index = mimeType.indexOf( '/' );
00077 if (index > 0)
00078 {
00079 provider = m_previewProviders.value(mimeType.left(index + 1) + '*');
00080 if (provider)
00081 return provider;
00082 }
00083
00084 return 0;
00085 }
00086
00087 KPreviewWidgetBase * KFileMetaPreview::previewProviderFor( const QString& mimeType )
00088 {
00089 KMimeType::Ptr mimeInfo = KMimeType::mimeType( mimeType );
00090
00091
00092
00093
00094 if ( mimeInfo && mimeInfo->is("inode/directory") )
00095 return 0L;
00096
00097 KPreviewWidgetBase *provider = findExistingProvider(mimeType, mimeInfo);
00098 if (provider)
00099 return provider;
00100
00101
00102
00103 if ( s_tryAudioPreview &&
00104 !mimeType.startsWith("text/") && !mimeType.startsWith("image/") )
00105 {
00106 if ( !haveAudioPreview )
00107 {
00108 KPreviewWidgetBase *audioPreview = createAudioPreview( m_stack );
00109 if ( audioPreview )
00110 {
00111 haveAudioPreview = true;
00112 (void) m_stack->addWidget( audioPreview );
00113 const QStringList mimeTypes = audioPreview->supportedMimeTypes();
00114 QStringList::ConstIterator it = mimeTypes.begin();
00115 for ( ; it != mimeTypes.end(); ++it )
00116 {
00117
00118 if ( m_previewProviders.constFind( *it ) == m_previewProviders.constEnd() )
00119 m_previewProviders.insert( *it, audioPreview );
00120 }
00121 }
00122 }
00123 }
00124
00125
00126 provider = findExistingProvider(mimeType, mimeInfo);
00127 if (provider)
00128 return provider;
00129
00130
00131
00132
00133 return 0L;
00134 }
00135
00136 void KFileMetaPreview::showPreview(const KUrl &url)
00137 {
00138 KMimeType::Ptr mt = KMimeType::findByUrl( url );
00139 KPreviewWidgetBase *provider = previewProviderFor( mt->name() );
00140 if ( provider )
00141 {
00142 if ( provider != m_stack->currentWidget() )
00143 clearPreview();
00144
00145 m_stack->setEnabled( true );
00146 m_stack->setCurrentWidget( provider );
00147 provider->showPreview( url );
00148 }
00149 else
00150 {
00151 clearPreview();
00152 m_stack->setEnabled( false );
00153 }
00154 }
00155
00156 void KFileMetaPreview::clearPreview()
00157 {
00158 if ( m_stack->currentWidget() )
00159 static_cast<KPreviewWidgetBase*>( m_stack->currentWidget() )->clearPreview();
00160 }
00161
00162 void KFileMetaPreview::addPreviewProvider( const QString& mimeType,
00163 KPreviewWidgetBase *provider )
00164 {
00165 m_previewProviders.insert( mimeType, provider );
00166 }
00167
00168
00169 void KFileMetaPreview::clearPreviewProviders()
00170 {
00171 QHash<QString, KPreviewWidgetBase*>::const_iterator i = m_previewProviders.constBegin();
00172 while (i != m_previewProviders.constEnd())
00173 {
00174 m_stack->removeWidget(i.value());
00175 ++i;
00176 }
00177 qDeleteAll(m_previewProviders);
00178 m_previewProviders.clear();
00179 }
00180
00181
00182 KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( QWidget *parent )
00183 {
00184 KPluginFactory *factory = KPluginLoader( "kfileaudiopreview" ).factory();
00185 if ( !factory )
00186 {
00187 s_tryAudioPreview = false;
00188 return 0L;
00189 }
00190 KPreviewWidgetBase* w = factory->create<KPreviewWidgetBase>( parent );
00191 if ( w )
00192 w->setObjectName( "kfileaudiopreview" );
00193 return w;
00194 }
00195
00196 #include "kfilemetapreview.moc"