• Skip to content
  • Skip to link menu
KDE 4.6 API Reference
  • KDE API Reference
  • kdelibs
  • KDE Home
  • 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 <kdebug.h>
00014 #include <kio/previewjob.h>
00015 #include <kpluginloader.h>
00016 #include <kpluginfactory.h>
00017 #include <kimagefilepreview.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     m_stack = new QStackedWidget( this );
00028     layout->addWidget( m_stack );
00029 
00030     // ###
00031 //     m_previewProviders.setAutoDelete( true );
00032     initPreviewProviders();
00033 }
00034 
00035 KFileMetaPreview::~KFileMetaPreview()
00036 {
00037 }
00038 
00039 void KFileMetaPreview::initPreviewProviders()
00040 {
00041     qDeleteAll(m_previewProviders);
00042     m_previewProviders.clear();
00043     // hardcoded so far
00044 
00045     // image previews
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 //         qDebug(".... %s", (*it).toLatin1().constData());
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         // check mime type inheritance
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     // ### mimetype may be image/* for example, try that
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     //     qDebug("### looking for: %s", mimeType.toLatin1().constData());
00093     // often the first highlighted item, where we can be sure, there is no plugin
00094     // (this "folders reflect icons" is a konq-specific thing, right?)
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 //qDebug("#### didn't find anything for: %s", mimeType.toLatin1().constData());
00103 
00104     if ( s_tryAudioPreview &&
00105         !mimeType.startsWith(QLatin1String("text/")) &&
00106         !mimeType.startsWith(QLatin1String("image/")) )
00107     {
00108         if ( !haveAudioPreview )
00109         {
00110             KPreviewWidgetBase *audioPreview = createAudioPreview( m_stack );
00111             if ( audioPreview )
00112             {
00113                 haveAudioPreview = true;
00114                 (void) m_stack->addWidget( audioPreview );
00115                 const QStringList mimeTypes = audioPreview->supportedMimeTypes();
00116                 QStringList::ConstIterator it = mimeTypes.begin();
00117                 for ( ; it != mimeTypes.end(); ++it )
00118                 {
00119                     // only add non already handled mimetypes
00120                     if ( m_previewProviders.constFind( *it ) == m_previewProviders.constEnd() )
00121                         m_previewProviders.insert( *it, audioPreview );
00122                 }
00123             }
00124         }
00125     }
00126 
00127     // with the new mimetypes from the audio-preview, try again
00128     provider = findExistingProvider(mimeType, mimeInfo);
00129     if (provider)
00130         return provider;
00131 
00132     // The logic in this code duplicates the logic in PreviewJob.
00133     // But why do we need multiple KPreviewWidgetBase instances anyway?
00134 
00135     return 0L;
00136 }
00137 
00138 void KFileMetaPreview::showPreview(const KUrl &url)
00139 {
00140     KMimeType::Ptr mt = KMimeType::findByUrl( url );
00141     KPreviewWidgetBase *provider = previewProviderFor( mt->name() );
00142     if ( provider )
00143     {
00144         if ( provider != m_stack->currentWidget() ) // stop the previous preview
00145             clearPreview();
00146 
00147         m_stack->setEnabled( true );
00148         m_stack->setCurrentWidget( provider );
00149         provider->showPreview( url );
00150     }
00151     else
00152     {
00153         clearPreview();
00154         m_stack->setEnabled( false );
00155     }
00156 }
00157 
00158 void KFileMetaPreview::clearPreview()
00159 {
00160     if ( m_stack->currentWidget() )
00161         static_cast<KPreviewWidgetBase*>( m_stack->currentWidget() )->clearPreview();
00162 }
00163 
00164 void KFileMetaPreview::addPreviewProvider( const QString& mimeType,
00165                                            KPreviewWidgetBase *provider )
00166 {
00167     m_previewProviders.insert( mimeType, provider );
00168 }
00169 
00170 
00171 void KFileMetaPreview::clearPreviewProviders()
00172 {
00173     QHash<QString, KPreviewWidgetBase*>::const_iterator i = m_previewProviders.constBegin();
00174     while (i != m_previewProviders.constEnd())
00175     {
00176         m_stack->removeWidget(i.value());
00177         ++i;
00178     }
00179     qDeleteAll(m_previewProviders);
00180     m_previewProviders.clear();
00181 }
00182 
00183 // static
00184 KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( QWidget *parent )
00185 {
00186     KPluginLoader loader( "kfileaudiopreview" );
00187     KPluginFactory *factory = loader.factory();
00188     if ( !factory )
00189     {
00190         kWarning() << "Couldn't load kfileaudiopreview" << loader.errorString();
00191         s_tryAudioPreview = false;
00192         return 0L;
00193     }
00194     KPreviewWidgetBase* w = factory->create<KPreviewWidgetBase>( parent );
00195     if ( w )
00196         w->setObjectName( "kfileaudiopreview" );
00197     return w;
00198 }
00199 
00200 #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
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.7.3
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