• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KIO

  • kio
  • kfile
kfilemetapreview.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the KDE project.
3 * Copyright (C) 2003 Carsten Pfeiffer <pfeiffer@kde.org>
4 *
5 * You can Freely distribute this program under the GNU Library General Public
6 * License. See the file "COPYING" for the exact licensing terms.
7 */
8
9#include "kfilemetapreview.h"
10
11#include <QtGui/QLayout>
12
13#include <kdebug.h>
14#include <kio/previewjob.h>
15#include <kpluginloader.h>
16#include <kpluginfactory.h>
17#include <kimagefilepreview.h>
18
19bool KFileMetaPreview::s_tryAudioPreview = true;
20
21KFileMetaPreview::KFileMetaPreview( QWidget *parent )
22 : KPreviewWidgetBase( parent ),
23 haveAudioPreview( false )
24{
25 QHBoxLayout *layout = new QHBoxLayout( this );
26 layout->setMargin( 0 );
27 m_stack = new QStackedWidget( this );
28 layout->addWidget( m_stack );
29
30 // ###
31// m_previewProviders.setAutoDelete( true );
32 initPreviewProviders();
33}
34
35KFileMetaPreview::~KFileMetaPreview()
36{
37}
38
39void KFileMetaPreview::initPreviewProviders()
40{
41 qDeleteAll(m_previewProviders);
42 m_previewProviders.clear();
43 // hardcoded so far
44
45 // image previews
46 KImageFilePreview *imagePreview = new KImageFilePreview( m_stack );
47 (void) m_stack->addWidget( imagePreview );
48 m_stack->setCurrentWidget ( imagePreview );
49 resize( imagePreview->sizeHint() );
50
51 const QStringList mimeTypes = imagePreview->supportedMimeTypes();
52 QStringList::ConstIterator it = mimeTypes.begin();
53 for ( ; it != mimeTypes.end(); ++it )
54 {
55// qDebug(".... %s", (*it).toLatin1().constData());
56 m_previewProviders.insert( *it, imagePreview );
57 }
58}
59
60KPreviewWidgetBase* KFileMetaPreview::findExistingProvider(const QString& mimeType, const KMimeType::Ptr& mimeInfo) const
61{
62 KPreviewWidgetBase* provider = m_previewProviders.value(mimeType);
63 if ( provider )
64 return provider;
65
66 if ( mimeInfo ) {
67 // check mime type inheritance
68 const QStringList parentMimeTypes = mimeInfo->allParentMimeTypes();
69 Q_FOREACH(const QString& parentMimeType, parentMimeTypes) {
70 provider = m_previewProviders.value(parentMimeType);
71 if (provider)
72 return provider;
73 }
74 }
75
76 // ### mimetype may be image/* for example, try that
77 const int index = mimeType.indexOf( '/' );
78 if (index > 0)
79 {
80 provider = m_previewProviders.value(mimeType.left(index + 1) + '*');
81 if (provider)
82 return provider;
83 }
84
85 return 0;
86}
87
88KPreviewWidgetBase * KFileMetaPreview::previewProviderFor( const QString& mimeType )
89{
90 KMimeType::Ptr mimeInfo = KMimeType::mimeType( mimeType );
91
92 // qDebug("### looking for: %s", mimeType.toLatin1().constData());
93 // often the first highlighted item, where we can be sure, there is no plugin
94 // (this "folders reflect icons" is a konq-specific thing, right?)
95 if ( mimeInfo && mimeInfo->is("inode/directory") )
96 return 0L;
97
98 KPreviewWidgetBase *provider = findExistingProvider(mimeType, mimeInfo);
99 if (provider)
100 return provider;
101
102//qDebug("#### didn't find anything for: %s", mimeType.toLatin1().constData());
103
104 if ( s_tryAudioPreview &&
105 !mimeType.startsWith(QLatin1String("text/")) &&
106 !mimeType.startsWith(QLatin1String("image/")) )
107 {
108 if ( !haveAudioPreview )
109 {
110 KPreviewWidgetBase *audioPreview = createAudioPreview( m_stack );
111 if ( audioPreview )
112 {
113 haveAudioPreview = true;
114 (void) m_stack->addWidget( audioPreview );
115 const QStringList mimeTypes = audioPreview->supportedMimeTypes();
116 QStringList::ConstIterator it = mimeTypes.begin();
117 for ( ; it != mimeTypes.end(); ++it )
118 {
119 // only add non already handled mimetypes
120 if ( m_previewProviders.constFind( *it ) == m_previewProviders.constEnd() )
121 m_previewProviders.insert( *it, audioPreview );
122 }
123 }
124 }
125 }
126
127 // with the new mimetypes from the audio-preview, try again
128 provider = findExistingProvider(mimeType, mimeInfo);
129 if (provider)
130 return provider;
131
132 // The logic in this code duplicates the logic in PreviewJob.
133 // But why do we need multiple KPreviewWidgetBase instances anyway?
134
135 return 0L;
136}
137
138void KFileMetaPreview::showPreview(const KUrl &url)
139{
140 KMimeType::Ptr mt = KMimeType::findByUrl( url );
141 KPreviewWidgetBase *provider = previewProviderFor( mt->name() );
142 if ( provider )
143 {
144 if ( provider != m_stack->currentWidget() ) // stop the previous preview
145 clearPreview();
146
147 m_stack->setEnabled( true );
148 m_stack->setCurrentWidget( provider );
149 provider->showPreview( url );
150 }
151 else
152 {
153 clearPreview();
154 m_stack->setEnabled( false );
155 }
156}
157
158void KFileMetaPreview::clearPreview()
159{
160 if ( m_stack->currentWidget() )
161 static_cast<KPreviewWidgetBase*>( m_stack->currentWidget() )->clearPreview();
162}
163
164void KFileMetaPreview::addPreviewProvider( const QString& mimeType,
165 KPreviewWidgetBase *provider )
166{
167 m_previewProviders.insert( mimeType, provider );
168}
169
170
171void KFileMetaPreview::clearPreviewProviders()
172{
173 QHash<QString, KPreviewWidgetBase*>::const_iterator i = m_previewProviders.constBegin();
174 while (i != m_previewProviders.constEnd())
175 {
176 m_stack->removeWidget(i.value());
177 ++i;
178 }
179 qDeleteAll(m_previewProviders);
180 m_previewProviders.clear();
181}
182
183// static
184KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( QWidget *parent )
185{
186 KPluginLoader loader( "kfileaudiopreview" );
187 KPluginFactory *factory = loader.factory();
188 if ( !factory )
189 {
190 kWarning() << "Couldn't load kfileaudiopreview" << loader.errorString();
191 s_tryAudioPreview = false;
192 return 0L;
193 }
194 KPreviewWidgetBase* w = factory->create<KPreviewWidgetBase>( parent );
195 if ( w )
196 w->setObjectName( "kfileaudiopreview" );
197 return w;
198}
199
200#include "kfilemetapreview.moc"
KFileMetaPreview::previewProviderFor
virtual KPreviewWidgetBase * previewProviderFor(const QString &mimeType)
Definition: kfilemetapreview.cpp:88
KFileMetaPreview::KFileMetaPreview
KFileMetaPreview(QWidget *parent)
Definition: kfilemetapreview.cpp:21
KFileMetaPreview::clearPreviewProviders
virtual void clearPreviewProviders()
Definition: kfilemetapreview.cpp:171
KFileMetaPreview::~KFileMetaPreview
~KFileMetaPreview()
Definition: kfilemetapreview.cpp:35
KFileMetaPreview::showPreview
virtual void showPreview(const KUrl &url)
Definition: kfilemetapreview.cpp:138
KFileMetaPreview::addPreviewProvider
virtual void addPreviewProvider(const QString &mimeType, KPreviewWidgetBase *provider)
Definition: kfilemetapreview.cpp:164
KFileMetaPreview::clearPreview
virtual void clearPreview()
Definition: kfilemetapreview.cpp:158
KImageFilePreview
Image preview widget for the file dialog.
Definition: kimagefilepreview.h:28
KImageFilePreview::sizeHint
virtual QSize sizeHint() const
Returns the size hint for this widget.
Definition: kimagefilepreview.cpp:160
KMimeType::mimeType
static Ptr mimeType(const QString &name, FindByNameOption options=ResolveAliases)
KMimeType::findByUrl
static Ptr findByUrl(const KUrl &url, mode_t mode=0, bool is_local_file=false, bool fast_mode=false, int *accuracy=0)
KPluginFactory::create
T * create(const QString &keyword, QObject *parent=0, const QVariantList &args=QVariantList())
KPluginLoader
KPreviewWidgetBase
Abstract baseclass for all preview widgets which shall be used via KFileDialog::setPreviewWidget(cons...
Definition: kpreviewwidgetbase.h:44
KPreviewWidgetBase::showPreview
virtual void showPreview(const KUrl &url)=0
This slot is called every time the user selects another file in the file dialog.
KPreviewWidgetBase::supportedMimeTypes
QStringList supportedMimeTypes() const
Definition: kpreviewwidgetbase.cpp:32
KSharedPtr< KMimeType >
KUrl
QHash
QWidget
kWarning
#define kWarning
kdebug.h
kfilemetapreview.h
kimagefilepreview.h
kpluginfactory.h
kpluginloader.h
previewjob.h
KPluginFactory
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KIO

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

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • 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
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal