• 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
kimagefilepreview.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the KDE project
3  * Copyright (C) 2001 Martin R. Jones <mjones@kde.org>
4  * 2001 Carsten Pfeiffer <pfeiffer@kde.org>
5  * 2008 Rafael Fernández López <ereslibre@kde.org>
6  *
7  * You can Freely distribute this program under the GNU Library General Public
8  * License. See the file "COPYING" for the exact licensing terms.
9  */
10 
11 #include "kimagefilepreview.h"
12 
13 #include <QtGui/QLayout>
14 #include <QtGui/QLabel>
15 #include <QtGui/QPainter>
16 #include <QtGui/QComboBox>
17 #include <QtGui/QCheckBox>
18 #include <QtGui/QResizeEvent>
19 #include <QtCore/QTimer>
20 #include <QtCore/QTimeLine>
21 
22 #include <kglobalsettings.h>
23 #include <kconfig.h>
24 #include <kiconloader.h>
25 #include <kdebug.h>
26 #include <klocale.h>
27 #include <kfileitem.h>
28 #include <kio/previewjob.h>
29 #include <kconfiggroup.h>
30 
31 #include <config-kfile.h>
32 
33 /**** KImageFilePreview ****/
34 
35 class KImageFilePreview::KImageFilePreviewPrivate
36 {
37 public:
38  KImageFilePreviewPrivate()
39  : m_job(0)
40  , clear(true)
41  {
42  m_timeLine = new QTimeLine(150);
43  m_timeLine->setCurveShape(QTimeLine::EaseInCurve);
44  m_timeLine->setDirection(QTimeLine::Forward);
45  m_timeLine->setFrameRange(0, 100);
46  }
47 
48  ~KImageFilePreviewPrivate()
49  {
50  delete m_timeLine;
51  }
52 
53  void _k_slotResult( KJob* );
54  void _k_slotFailed( const KFileItem& );
55  void _k_slotStepAnimation( int frame );
56  void _k_slotFinished( );
57  void _k_slotActuallyClear( );
58 
59  KUrl currentURL;
60  KUrl lastShownURL;
61  QLabel *imageLabel;
62  KIO::PreviewJob *m_job;
63  QTimeLine *m_timeLine;
64  QPixmap m_pmCurrent;
65  QPixmap m_pmTransition;
66  float m_pmCurrentOpacity;
67  float m_pmTransitionOpacity;
68  bool clear;
69 };
70 
71 KImageFilePreview::KImageFilePreview( QWidget *parent )
72  : KPreviewWidgetBase(parent), d(new KImageFilePreviewPrivate)
73 {
74  QVBoxLayout *vb = new QVBoxLayout( this );
75  vb->setMargin( 0 );
76 
77  d->imageLabel = new QLabel(this);
78  d->imageLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
79  d->imageLabel->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
80  vb->addWidget(d->imageLabel);
81 
82  setSupportedMimeTypes( KIO::PreviewJob::supportedMimeTypes() );
83  setMinimumWidth( 50 );
84 
85  connect(d->m_timeLine, SIGNAL(frameChanged(int)), this, SLOT(_k_slotStepAnimation(int)));
86  connect(d->m_timeLine, SIGNAL(finished()), this, SLOT(_k_slotFinished()));
87 }
88 
89 KImageFilePreview::~KImageFilePreview()
90 {
91  if (d->m_job) {
92  d->m_job->kill();
93  }
94 
95  delete d;
96 }
97 
98 void KImageFilePreview::showPreview()
99 {
100  // Pass a copy since clearPreview() will clear currentURL
101  KUrl url = d->currentURL;
102  showPreview( url, true );
103 }
104 
105 // called via KPreviewWidgetBase interface
106 void KImageFilePreview::showPreview( const KUrl& url )
107 {
108  showPreview( url, false );
109 }
110 
111 void KImageFilePreview::showPreview( const KUrl &url, bool force )
112 {
113  if (!url.isValid() ||
114  (d->lastShownURL.isValid() &&
115  url.equals(d->lastShownURL, KUrl::CompareWithoutTrailingSlash) &&
116  d->currentURL.isValid()))
117  return;
118 
119  d->clear = false;
120  d->currentURL = url;
121  d->lastShownURL = url;
122 
123  int w = d->imageLabel->contentsRect().width() - 4;
124  int h = d->imageLabel->contentsRect().height() - 4;
125 
126  if (d->m_job) {
127  disconnect(d->m_job, SIGNAL(result(KJob*)),
128  this, SLOT(_k_slotResult(KJob*)));
129  disconnect(d->m_job, SIGNAL(gotPreview(const KFileItem&,
130  const QPixmap& )), this,
131  SLOT(gotPreview(KFileItem,QPixmap)));
132 
133  disconnect(d->m_job, SIGNAL(failed(KFileItem)),
134  this, SLOT(_k_slotFailed(KFileItem)));
135 
136  d->m_job->kill();
137  }
138 
139  d->m_job = createJob(url, w, h);
140  if ( force ) // explicitly requested previews shall always be generated!
141  d->m_job->setIgnoreMaximumSize(true);
142 
143  connect(d->m_job, SIGNAL(result(KJob*)),
144  this, SLOT(_k_slotResult(KJob*)));
145  connect(d->m_job, SIGNAL(gotPreview(const KFileItem&,
146  const QPixmap& )),
147  SLOT(gotPreview(KFileItem,QPixmap)));
148 
149  connect(d->m_job, SIGNAL(failed(KFileItem)),
150  this, SLOT(_k_slotFailed(KFileItem)));
151 }
152 
153 void KImageFilePreview::resizeEvent( QResizeEvent * )
154 {
155  clearPreview();
156  d->currentURL = KUrl(); // force this to actually happen
157  showPreview( d->lastShownURL );
158 }
159 
160 QSize KImageFilePreview::sizeHint() const
161 {
162  return QSize( 100, 200 );
163 }
164 
165 KIO::PreviewJob * KImageFilePreview::createJob( const KUrl& url, int w, int h )
166 {
167  if (url.isValid()) {
168  KFileItemList items;
169  items.append(KFileItem(KFileItem::Unknown, KFileItem::Unknown, url, true));
170  QStringList plugins = KIO::PreviewJob::availablePlugins();
171 
172  KIO::PreviewJob *previewJob = KIO::filePreview(items, QSize(w, h), &plugins);
173  previewJob->setOverlayIconAlpha(0);
174  previewJob->setScaleType(KIO::PreviewJob::Scaled);
175  return previewJob;
176  } else {
177  return 0;
178  }
179 }
180 
181 void KImageFilePreview::gotPreview( const KFileItem& item, const QPixmap& pm )
182 {
183  if (item.url() == d->currentURL) { // should always be the case
184  if (KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects) {
185  if (d->m_timeLine->state() == QTimeLine::Running) {
186  d->m_timeLine->setCurrentTime(0);
187  }
188 
189  d->m_pmTransition = pm;
190  d->m_pmTransitionOpacity = 0;
191  d->m_pmCurrentOpacity = 1;
192  d->m_timeLine->setDirection(QTimeLine::Forward);
193  d->m_timeLine->start();
194  }
195  else
196  {
197  d->imageLabel->setPixmap(pm);
198  }
199  }
200 }
201 
202 void KImageFilePreview::KImageFilePreviewPrivate::_k_slotFailed( const KFileItem& item )
203 {
204  if ( item.isDir() )
205  imageLabel->clear();
206  else if (item.url() == currentURL) // should always be the case
207  imageLabel->setPixmap(SmallIcon( "image-missing", KIconLoader::SizeLarge,
208  KIconLoader::DisabledState ));
209 }
210 
211 void KImageFilePreview::KImageFilePreviewPrivate::_k_slotResult( KJob *job )
212 {
213  if (job == m_job) {
214  m_job = 0L;
215  }
216 }
217 
218 void KImageFilePreview::KImageFilePreviewPrivate::_k_slotStepAnimation( int frame )
219 {
220  Q_UNUSED(frame)
221 
222  QPixmap pm(QSize(qMax(m_pmCurrent.size().width(), m_pmTransition.size().width()),
223  qMax(m_pmCurrent.size().height(), m_pmTransition.size().height())));
224  pm.fill(Qt::transparent);
225 
226  QPainter p(&pm);
227  p.setOpacity(m_pmCurrentOpacity);
228 
229  //If we have a current pixmap
230  if (!m_pmCurrent.isNull())
231  p.drawPixmap(QPoint(((float) pm.size().width() - m_pmCurrent.size().width()) / 2.0,
232  ((float) pm.size().height() - m_pmCurrent.size().height()) / 2.0), m_pmCurrent);
233  if (!m_pmTransition.isNull()) {
234  p.setOpacity(m_pmTransitionOpacity);
235  p.drawPixmap(QPoint(((float) pm.size().width() - m_pmTransition.size().width()) / 2.0,
236  ((float) pm.size().height() - m_pmTransition.size().height()) / 2.0), m_pmTransition);
237  }
238  p.end();
239 
240  imageLabel->setPixmap(pm);
241 
242  m_pmCurrentOpacity = qMax(m_pmCurrentOpacity - 0.4, 0.0); // krazy:exclude=qminmax
243  m_pmTransitionOpacity = qMin(m_pmTransitionOpacity + 0.4, 1.0); //krazy:exclude=qminmax
244 }
245 
246 void KImageFilePreview::KImageFilePreviewPrivate::_k_slotFinished()
247 {
248  m_pmCurrent = m_pmTransition;
249  m_pmTransitionOpacity = 0;
250  m_pmCurrentOpacity = 1;
251  m_pmTransition = QPixmap();
252  // The animation might have lost some frames. Be sure that if the last one
253  // was dropped, the last image shown is the opaque one.
254  imageLabel->setPixmap(m_pmCurrent);
255  clear = false;
256 }
257 
258 void KImageFilePreview::clearPreview()
259 {
260  if (d->m_job) {
261  d->m_job->kill();
262  d->m_job = 0L;
263  }
264 
265  if (d->clear || d->m_timeLine->state() == QTimeLine::Running) {
266  return;
267  }
268 
269  if (KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects) {
270  d->m_pmTransition = QPixmap();
271  //If we add a previous preview then we run the animation
272  if (!d->m_pmCurrent.isNull()) {
273  d->m_timeLine->setCurrentTime(0);
274  d->m_timeLine->setDirection(QTimeLine::Backward);
275  d->m_timeLine->start();
276  }
277  d->currentURL = KUrl();
278  d->clear = true;
279  }
280  else
281  {
282  d->imageLabel->clear();
283  }
284 }
285 
286 #include "kimagefilepreview.moc"
QPainter::setOpacity
void setOpacity(qreal opacity)
KIO::PreviewJob::availablePlugins
static QStringList availablePlugins()
Returns a list of all available preview plugins.
Definition: previewjob.cpp:735
KImageFilePreview::clearPreview
virtual void clearPreview()
Clears the preview.
Definition: kimagefilepreview.cpp:258
KIconLoader::SizeLarge
QResizeEvent
QWidget
KFileItem::isDir
bool isDir() const
Returns true if this item represents a directory.
Definition: kfileitem.cpp:1141
kdebug.h
KImageFilePreview::~KImageFilePreview
~KImageFilePreview()
Destroys the image file preview.
Definition: kimagefilepreview.cpp:89
kglobalsettings.h
KPreviewWidgetBase::setSupportedMimeTypes
void setSupportedMimeTypes(const QStringList &mimeTypes)
Definition: kpreviewwidgetbase.cpp:27
kconfig.h
KIO::PreviewJob::setScaleType
void setScaleType(ScaleType type)
Sets the scale type for the generated preview.
Definition: previewjob.cpp:238
QWidget::setMinimumWidth
void setMinimumWidth(int minw)
QSizePolicy
kiconloader.h
QPoint
KUrl::CompareWithoutTrailingSlash
klocale.h
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
KImageFilePreview::createJob
virtual KIO::PreviewJob * createJob(const KUrl &url, int width, int height)
Definition: kimagefilepreview.cpp:165
KUrl
config-kfile.h
KFileItem::Unknown
Definition: kfileitem.h:48
kimagefilepreview.h
KIconLoader::DisabledState
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QList::append
void append(const T &value)
KImageFilePreview::KImageFilePreview
KImageFilePreview(QWidget *parent=0)
Creates a new image file preview.
Definition: kimagefilepreview.cpp:71
KImageFilePreview::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
Definition: kimagefilepreview.cpp:153
QPainter
previewjob.h
KFileItemList
List of KFileItems, which adds a few helper methods to QList.
Definition: kfileitem.h:674
clear
KAction * clear(const QObject *recvr, const char *slot, QObject *parent)
QVBoxLayout
KImageFilePreview::gotPreview
virtual void gotPreview(const KFileItem &, const QPixmap &)
Definition: kimagefilepreview.cpp:181
KImageFilePreview::sizeHint
virtual QSize sizeHint() const
Returns the size hint for this widget.
Definition: kimagefilepreview.cpp:160
QLayout::setMargin
void setMargin(int margin)
QStringList
QPixmap
KIO::PreviewJob
KIO Job to get a thumbnail picture.
Definition: previewjob.h:38
QSize
QUrl::isValid
bool isValid() const
KIO::PreviewJob::setOverlayIconAlpha
void setOverlayIconAlpha(int alpha)
Sets the alpha-value for the MIME-type icon which overlays the preview.
Definition: previewjob.cpp:226
KPreviewWidgetBase
Abstract baseclass for all preview widgets which shall be used via KFileDialog::setPreviewWidget(cons...
Definition: kpreviewwidgetbase.h:43
SmallIcon
QPixmap SmallIcon(const QString &name, int force_size, int state, const QStringList &overlays)
QTimeLine
KIO::filePreview
PreviewJob * filePreview(const KFileItemList &items, int width, int height=0, int iconSize=0, int iconAlpha=70, bool scale=true, bool save=true, const QStringList *enabledPlugins=0)
Creates a PreviewJob to generate or retrieve a preview image for the given URL.
Definition: previewjob.cpp:755
KGlobalSettings::graphicEffectsLevel
static GraphicEffects graphicEffectsLevel()
KIO::PreviewJob::supportedMimeTypes
static QStringList supportedMimeTypes()
Returns a list of all supported MIME types.
Definition: previewjob.cpp:745
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QLabel
KImageFilePreview::showPreview
void showPreview()
Definition: kimagefilepreview.cpp:98
KUrl::equals
bool equals(const KUrl &u, const EqualsOptions &options=0) const
KJob
KGlobalSettings::SimpleAnimationEffects
kfileitem.h
KIO::PreviewJob::Scaled
The preview will be scaled to the size specified when constructing the PreviewJob.
Definition: previewjob.h:56
KFileItem::url
KUrl url() const
Returns the url of the file.
Definition: kfileitem.cpp:1543
KFileItem
A KFileItem is a generic class to handle a file, local or remote.
Definition: kfileitem.h:45
kconfiggroup.h
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