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

KIO

  • 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
35class KImageFilePreview::KImageFilePreviewPrivate
36{
37public:
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
71KImageFilePreview::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
89KImageFilePreview::~KImageFilePreview()
90{
91 if (d->m_job) {
92 d->m_job->kill();
93 }
94
95 delete d;
96}
97
98void 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
106void KImageFilePreview::showPreview( const KUrl& url )
107{
108 showPreview( url, false );
109}
110
111void 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
153void KImageFilePreview::resizeEvent( QResizeEvent * )
154{
155 clearPreview();
156 d->currentURL = KUrl(); // force this to actually happen
157 showPreview( d->lastShownURL );
158}
159
160QSize KImageFilePreview::sizeHint() const
161{
162 return QSize( 100, 200 );
163}
164
165KIO::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
181void 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
202void 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
211void KImageFilePreview::KImageFilePreviewPrivate::_k_slotResult( KJob *job )
212{
213 if (job == m_job) {
214 m_job = 0L;
215 }
216}
217
218void 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
246void 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
258void 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"
KFileItemList
List of KFileItems, which adds a few helper methods to QList<KFileItem>.
Definition: kfileitem.h:675
KFileItem
A KFileItem is a generic class to handle a file, local or remote.
Definition: kfileitem.h:46
KFileItem::isDir
bool isDir() const
Returns true if this item represents a directory.
Definition: kfileitem.cpp:1141
KFileItem::url
KUrl url() const
Returns the url of the file.
Definition: kfileitem.cpp:1543
KFileItem::Unknown
@ Unknown
Definition: kfileitem.h:48
KGlobalSettings::SimpleAnimationEffects
SimpleAnimationEffects
KGlobalSettings::graphicEffectsLevel
static GraphicEffects graphicEffectsLevel()
KIO::PreviewJob
KIO Job to get a thumbnail picture.
Definition: previewjob.h:39
KIO::PreviewJob::setScaleType
void setScaleType(ScaleType type)
Sets the scale type for the generated preview.
Definition: previewjob.cpp:238
KIO::PreviewJob::supportedMimeTypes
static QStringList supportedMimeTypes()
Returns a list of all supported MIME types.
Definition: previewjob.cpp:745
KIO::PreviewJob::availablePlugins
static QStringList availablePlugins()
Returns a list of all available preview plugins.
Definition: previewjob.cpp:735
KIO::PreviewJob::Scaled
@ Scaled
The preview will be scaled to the size specified when constructing the PreviewJob.
Definition: previewjob.h:56
KIO::PreviewJob::setOverlayIconAlpha
void setOverlayIconAlpha(int alpha)
Sets the alpha-value for the MIME-type icon which overlays the preview.
Definition: previewjob.cpp:226
KIconLoader::DisabledState
DisabledState
KIconLoader::SizeLarge
SizeLarge
KImageFilePreview::KImageFilePreview
KImageFilePreview(QWidget *parent=0)
Creates a new image file preview.
Definition: kimagefilepreview.cpp:71
KImageFilePreview::sizeHint
virtual QSize sizeHint() const
Returns the size hint for this widget.
Definition: kimagefilepreview.cpp:160
KImageFilePreview::clearPreview
virtual void clearPreview()
Clears the preview.
Definition: kimagefilepreview.cpp:258
KImageFilePreview::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
Definition: kimagefilepreview.cpp:153
KImageFilePreview::~KImageFilePreview
~KImageFilePreview()
Destroys the image file preview.
Definition: kimagefilepreview.cpp:89
KImageFilePreview::gotPreview
virtual void gotPreview(const KFileItem &, const QPixmap &)
Definition: kimagefilepreview.cpp:181
KImageFilePreview::showPreview
virtual void showPreview(const KUrl &url)
Shows a preview for the given url.
Definition: kimagefilepreview.cpp:106
KImageFilePreview::createJob
virtual KIO::PreviewJob * createJob(const KUrl &url, int width, int height)
Definition: kimagefilepreview.cpp:165
KJob
KPreviewWidgetBase
Abstract baseclass for all preview widgets which shall be used via KFileDialog::setPreviewWidget(cons...
Definition: kpreviewwidgetbase.h:44
KPreviewWidgetBase::setSupportedMimeTypes
void setSupportedMimeTypes(const QStringList &mimeTypes)
Definition: kpreviewwidgetbase.cpp:27
KUrl
KUrl::equals
bool equals(const KUrl &u, const EqualsOptions &options=0) const
KUrl::CompareWithoutTrailingSlash
CompareWithoutTrailingSlash
QLabel
QWidget
config-kfile.h
kconfig.h
kconfiggroup.h
kdebug.h
kfileitem.h
kglobalsettings.h
SmallIcon
QPixmap SmallIcon(const QString &name, int force_size, int state, const QStringList &overlays)
kiconloader.h
kimagefilepreview.h
klocale.h
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
clear
KAction * clear(const QObject *recvr, const char *slot, QObject *parent)
previewjob.h
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