• 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                     m_previewProviders.insert( *it, audioPreview );
00089             }
00090         }
00091     }
00092 
00093     // with the new mimetypes from the audio-preview, try again
00094     provider = m_previewProviders.value( mimeType );
00095     if ( provider )
00096         return provider;
00097 
00098     // ### mimetype may be image/* for example, try that
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         // check mime type inheritance
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     // The logic in this code duplicates the logic in PreviewJob.
00118     // But why do we need multiple KPreviewWidgetBase instances anyway?
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() ) // stop the previous preview
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 // static
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"

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.4
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