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 layout->setSpacing( 0 );
00027 m_stack = new QStackedWidget( this );
00028 layout->addWidget( m_stack );
00029
00030
00031
00032 initPreviewProviders();
00033 }
00034
00035 KFileMetaPreview::~KFileMetaPreview()
00036 {
00037 }
00038
00039 void KFileMetaPreview::initPreviewProviders()
00040 {
00041 qDeleteAll(m_previewProviders);
00042 m_previewProviders.clear();
00043
00044
00045
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
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
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
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
00093
00094
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
00103
00104 if ( s_tryAudioPreview &&
00105 !mimeType.startsWith("text/") && !mimeType.startsWith("image/") )
00106 {
00107 if ( !haveAudioPreview )
00108 {
00109 KPreviewWidgetBase *audioPreview = createAudioPreview( m_stack );
00110 if ( audioPreview )
00111 {
00112 haveAudioPreview = true;
00113 (void) m_stack->addWidget( audioPreview );
00114 const QStringList mimeTypes = audioPreview->supportedMimeTypes();
00115 QStringList::ConstIterator it = mimeTypes.begin();
00116 for ( ; it != mimeTypes.end(); ++it )
00117 {
00118
00119 if ( m_previewProviders.constFind( *it ) == m_previewProviders.constEnd() )
00120 m_previewProviders.insert( *it, audioPreview );
00121 }
00122 }
00123 }
00124 }
00125
00126
00127 provider = findExistingProvider(mimeType, mimeInfo);
00128 if (provider)
00129 return provider;
00130
00131
00132
00133
00134 return 0L;
00135 }
00136
00137 void KFileMetaPreview::showPreview(const KUrl &url)
00138 {
00139 KMimeType::Ptr mt = KMimeType::findByUrl( url );
00140 KPreviewWidgetBase *provider = previewProviderFor( mt->name() );
00141 if ( provider )
00142 {
00143 if ( provider != m_stack->currentWidget() )
00144 clearPreview();
00145
00146 m_stack->setEnabled( true );
00147 m_stack->setCurrentWidget( provider );
00148 provider->showPreview( url );
00149 }
00150 else
00151 {
00152 clearPreview();
00153 m_stack->setEnabled( false );
00154 }
00155 }
00156
00157 void KFileMetaPreview::clearPreview()
00158 {
00159 if ( m_stack->currentWidget() )
00160 static_cast<KPreviewWidgetBase*>( m_stack->currentWidget() )->clearPreview();
00161 }
00162
00163 void KFileMetaPreview::addPreviewProvider( const QString& mimeType,
00164 KPreviewWidgetBase *provider )
00165 {
00166 m_previewProviders.insert( mimeType, provider );
00167 }
00168
00169
00170 void KFileMetaPreview::clearPreviewProviders()
00171 {
00172 QHash<QString, KPreviewWidgetBase*>::const_iterator i = m_previewProviders.constBegin();
00173 while (i != m_previewProviders.constEnd())
00174 {
00175 m_stack->removeWidget(i.value());
00176 ++i;
00177 }
00178 qDeleteAll(m_previewProviders);
00179 m_previewProviders.clear();
00180 }
00181
00182
00183 KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( QWidget *parent )
00184 {
00185 KPluginFactory *factory = KPluginLoader( "kfileaudiopreview" ).factory();
00186 if ( !factory )
00187 {
00188 s_tryAudioPreview = false;
00189 return 0L;
00190 }
00191 KPreviewWidgetBase* w = factory->create<KPreviewWidgetBase>( parent );
00192 if ( w )
00193 w->setObjectName( "kfileaudiopreview" );
00194 return w;
00195 }
00196
00197 #include "kfilemetapreview.moc"