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

KIO

  • sources
  • kde-4.14
  • kdelibs
  • 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 
19 bool KFileMetaPreview::s_tryAudioPreview = true;
20 
21 KFileMetaPreview::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 
35 KFileMetaPreview::~KFileMetaPreview()
36 {
37 }
38 
39 void 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 
60 KPreviewWidgetBase* 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 
88 KPreviewWidgetBase * 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 
138 void 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 
158 void KFileMetaPreview::clearPreview()
159 {
160  if ( m_stack->currentWidget() )
161  static_cast<KPreviewWidgetBase*>( m_stack->currentWidget() )->clearPreview();
162 }
163 
164 void KFileMetaPreview::addPreviewProvider( const QString& mimeType,
165  KPreviewWidgetBase *provider )
166 {
167  m_previewProviders.insert( mimeType, provider );
168 }
169 
170 
171 void 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
184 KPreviewWidgetBase * 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"
QWidget::layout
QLayout * layout() const
QString::indexOf
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
QWidget
KPreviewWidgetBase::showPreview
virtual void showPreview(const KUrl &url)=0
This slot is called every time the user selects another file in the file dialog.
QHash::insert
iterator insert(const Key &key, const T &value)
kdebug.h
QStackedWidget::currentWidget
QWidget * currentWidget() const
KFileMetaPreview::~KFileMetaPreview
~KFileMetaPreview()
Definition: kfilemetapreview.cpp:35
KFileMetaPreview::previewProviderFor
virtual KPreviewWidgetBase * previewProviderFor(const QString &mimeType)
Definition: kfilemetapreview.cpp:88
kfilemetapreview.h
KPreviewWidgetBase::supportedMimeTypes
QStringList supportedMimeTypes() const
Definition: kpreviewwidgetbase.cpp:32
QHBoxLayout
QHash::constFind
const_iterator constFind(const Key &key) const
KUrl
QWidget::resize
void resize(int w, int h)
kimagefilepreview.h
QWidget::setEnabled
void setEnabled(bool)
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QStackedWidget::setCurrentWidget
void setCurrentWidget(QWidget *widget)
QHash::constEnd
const_iterator constEnd() const
KPluginLoader
QHash
kpluginloader.h
KFileMetaPreview::clearPreview
virtual void clearPreview()
Definition: kfilemetapreview.cpp:158
QObject::setObjectName
void setObjectName(const QString &name)
previewjob.h
QString::startsWith
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const
QStackedWidget
QString
KImageFilePreview::sizeHint
virtual QSize sizeHint() const
Returns the size hint for this widget.
Definition: kimagefilepreview.cpp:160
QLayout::setMargin
void setMargin(int margin)
QStringList
KImageIO::mimeTypes
QStringList mimeTypes(Mode mode=Writing)
Returns a list of MIME types for all KImageIO supported formats.
Definition: kimageio.cpp:64
KImageFilePreview
Image preview widget for the file dialog.
Definition: kimagefilepreview.h:27
QHash::clear
void clear()
QList::end
iterator end()
QHash::value
const T value(const Key &key) const
QStackedWidget::removeWidget
void removeWidget(QWidget *widget)
QHash::constBegin
const_iterator constBegin() const
KFileMetaPreview::showPreview
virtual void showPreview(const KUrl &url)
Definition: kfilemetapreview.cpp:138
QLatin1String
kpluginfactory.h
QList::ConstIterator
typedef ConstIterator
KPreviewWidgetBase
Abstract baseclass for all preview widgets which shall be used via KFileDialog::setPreviewWidget(cons...
Definition: kpreviewwidgetbase.h:43
KFileMetaPreview::KFileMetaPreview
KFileMetaPreview(QWidget *parent)
Definition: kfilemetapreview.cpp:21
kWarning
static QDebug kWarning(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
QString::left
QString left(int n) const
KFileMetaPreview::clearPreviewProviders
virtual void clearPreviewProviders()
Definition: kfilemetapreview.cpp:171
QStackedWidget::addWidget
int addWidget(QWidget *widget)
QObject::parent
QObject * parent() const
KPluginFactory
QList::begin
iterator begin()
KFileMetaPreview::addPreviewProvider
virtual void addPreviewProvider(const QString &mimeType, KPreviewWidgetBase *provider)
Definition: kfilemetapreview.cpp:164
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:24:53 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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

Search



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