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