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 m_previewProviders.insert( *it, audioPreview );
00089 }
00090 }
00091 }
00092
00093
00094 provider = m_previewProviders.value( mimeType );
00095 if ( provider )
00096 return provider;
00097
00098
00099 int index = mimeType.indexOf( '/' );
00100 if ( index > 0 )
00101 {
00102 provider = m_previewProviders.value( mimeType.left( index + 1 ) + '*' );
00103 if ( provider )
00104 return provider;
00105 }
00106
00107 KMimeType::Ptr mimeInfo = KMimeType::mimeType( mimeType );
00108 if ( mimeInfo ) {
00109
00110 const QStringList parentMimeTypes = mimeInfo->allParentMimeTypes();
00111 Q_FOREACH(const QString& parentMimeType, parentMimeTypes) {
00112 provider = m_previewProviders.value( parentMimeType );
00113 if ( provider )
00114 return provider;
00115 }
00116 }
00117
00118
00119
00120 return 0L;
00121 }
00122
00123 void KFileMetaPreview::showPreview(const KUrl &url)
00124 {
00125 KMimeType::Ptr mt = KMimeType::findByUrl( url );
00126 KPreviewWidgetBase *provider = previewProviderFor( mt->name() );
00127 if ( provider )
00128 {
00129 if ( provider != m_stack->currentWidget() )
00130 clearPreview();
00131
00132 m_stack->setEnabled( true );
00133 m_stack->setCurrentWidget( provider );
00134 provider->showPreview( url );
00135 }
00136 else
00137 {
00138 clearPreview();
00139 m_stack->setEnabled( false );
00140 }
00141 }
00142
00143 void KFileMetaPreview::clearPreview()
00144 {
00145 if ( m_stack->currentWidget() )
00146 static_cast<KPreviewWidgetBase*>( m_stack->currentWidget() )->clearPreview();
00147 }
00148
00149 void KFileMetaPreview::addPreviewProvider( const QString& mimeType,
00150 KPreviewWidgetBase *provider )
00151 {
00152 m_previewProviders.insert( mimeType, provider );
00153 }
00154
00155
00156 void KFileMetaPreview::clearPreviewProviders()
00157 {
00158 QHash<QString, KPreviewWidgetBase*>::const_iterator i = m_previewProviders.constBegin();
00159 while (i != m_previewProviders.constEnd())
00160 {
00161 m_stack->removeWidget(i.value());
00162 ++i;
00163 }
00164 qDeleteAll(m_previewProviders);
00165 m_previewProviders.clear();
00166 }
00167
00168
00169 KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( QWidget *parent )
00170 {
00171 KPluginFactory *factory = KPluginLoader( "kfileaudiopreview" ).factory();
00172 if ( !factory )
00173 {
00174 s_tryAudioPreview = false;
00175 return 0L;
00176 }
00177 KPreviewWidgetBase* w = factory->create<KPreviewWidgetBase>( parent );
00178 if ( w )
00179 w->setObjectName( "kfileaudiopreview" );
00180 return w;
00181 }
00182
00183 #include "kfilemetapreview.moc"