• Skip to content
  • Skip to link menu
KDE 4.1 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

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 <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 //     m_previewProviders.setAutoDelete( true );
00033     initPreviewProviders();
00034 }
00035 
00036 KFileMetaPreview::~KFileMetaPreview()
00037 {
00038 }
00039 
00040 void KFileMetaPreview::initPreviewProviders()
00041 {
00042     qDeleteAll(m_previewProviders);
00043     m_previewProviders.clear();
00044     // hardcoded so far
00045 
00046     // image previews
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 //         qDebug(".... %s", (*it).toLatin1().constData());
00057         m_previewProviders.insert( *it, imagePreview );
00058     }
00059 }
00060 
00061 KPreviewWidgetBase * KFileMetaPreview::previewProviderFor( const QString& mimeType )
00062 {
00063 //     qDebug("### looking for: %s", mimeType.toLatin1().constData());
00064     // often the first highlighted item, where we can be sure, there is no plugin
00065     // (this "folders reflect icons" is a konq-specific thing, right?)
00066     if ( mimeType == "inode/directory" )
00067         return 0L;
00068 
00069     KPreviewWidgetBase *provider = m_previewProviders.value( mimeType );
00070     if ( provider )
00071         return provider;
00072 
00073 //qDebug("#### didn't find anything for: %s", mimeType.toLatin1().constData());
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                     // only add non already handled mimetypes
00090                     if ( m_previewProviders.constFind( *it ) == m_previewProviders.constEnd() )
00091                         m_previewProviders.insert( *it, audioPreview );
00092                 }
00093             }
00094         }
00095     }
00096 
00097     // with the new mimetypes from the audio-preview, try again
00098     provider = m_previewProviders.value( mimeType );
00099     if ( provider )
00100         return provider;
00101 
00102     // ### mimetype may be image/* for example, try that
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         // check mime type inheritance
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     // The logic in this code duplicates the logic in PreviewJob.
00122     // But why do we need multiple KPreviewWidgetBase instances anyway?
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() ) // stop the previous preview
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 // static
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"

KIO

Skip menu "KIO"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • KIO
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.6
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal