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>
35class KImageFilePreview::KImageFilePreviewPrivate
38 KImageFilePreviewPrivate()
42 m_timeLine =
new QTimeLine(150);
43 m_timeLine->setCurveShape(QTimeLine::EaseInCurve);
44 m_timeLine->setDirection(QTimeLine::Forward);
45 m_timeLine->setFrameRange(0, 100);
48 ~KImageFilePreviewPrivate()
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( );
62 KIO::PreviewJob *m_job;
63 QTimeLine *m_timeLine;
65 QPixmap m_pmTransition;
66 float m_pmCurrentOpacity;
67 float m_pmTransitionOpacity;
74 QVBoxLayout *vb =
new QVBoxLayout(
this );
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);
83 setMinimumWidth( 50 );
85 connect(d->m_timeLine, SIGNAL(frameChanged(
int)),
this, SLOT(_k_slotStepAnimation(
int)));
86 connect(d->m_timeLine, SIGNAL(finished()),
this, SLOT(_k_slotFinished()));
101 KUrl url = d->currentURL;
113 if (!url.isValid() ||
114 (d->lastShownURL.isValid() &&
116 d->currentURL.isValid()))
121 d->lastShownURL = url;
123 int w = d->imageLabel->contentsRect().width() - 4;
124 int h = d->imageLabel->contentsRect().height() - 4;
127 disconnect(d->m_job, SIGNAL(result(
KJob*)),
128 this, SLOT(_k_slotResult(
KJob*)));
130 const QPixmap& )),
this,
133 disconnect(d->m_job, SIGNAL(failed(
KFileItem)),
141 d->m_job->setIgnoreMaximumSize(
true);
143 connect(d->m_job, SIGNAL(result(
KJob*)),
144 this, SLOT(_k_slotResult(
KJob*)));
149 connect(d->m_job, SIGNAL(failed(
KFileItem)),
156 d->currentURL =
KUrl();
162 return QSize( 100, 200 );
183 if (item.
url() == d->currentURL) {
185 if (d->m_timeLine->state() == QTimeLine::Running) {
186 d->m_timeLine->setCurrentTime(0);
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();
197 d->imageLabel->setPixmap(pm);
202void KImageFilePreview::KImageFilePreviewPrivate::_k_slotFailed(
const KFileItem& item )
206 else if (item.
url() == currentURL)
211void KImageFilePreview::KImageFilePreviewPrivate::_k_slotResult( KJob *job )
218void KImageFilePreview::KImageFilePreviewPrivate::_k_slotStepAnimation(
int frame )
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);
227 p.setOpacity(m_pmCurrentOpacity);
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);
240 imageLabel->setPixmap(pm);
242 m_pmCurrentOpacity = qMax(m_pmCurrentOpacity - 0.4, 0.0);
243 m_pmTransitionOpacity = qMin(m_pmTransitionOpacity + 0.4, 1.0);
246void KImageFilePreview::KImageFilePreviewPrivate::_k_slotFinished()
248 m_pmCurrent = m_pmTransition;
249 m_pmTransitionOpacity = 0;
250 m_pmCurrentOpacity = 1;
251 m_pmTransition = QPixmap();
254 imageLabel->setPixmap(m_pmCurrent);
265 if (d->clear || d->m_timeLine->state() == QTimeLine::Running) {
270 d->m_pmTransition = QPixmap();
272 if (!d->m_pmCurrent.isNull()) {
273 d->m_timeLine->setCurrentTime(0);
274 d->m_timeLine->setDirection(QTimeLine::Backward);
275 d->m_timeLine->start();
277 d->currentURL =
KUrl();
282 d->imageLabel->clear();
286#include "kimagefilepreview.moc"
List of KFileItems, which adds a few helper methods to QList<KFileItem>.
A KFileItem is a generic class to handle a file, local or remote.
bool isDir() const
Returns true if this item represents a directory.
KUrl url() const
Returns the url of the file.
static GraphicEffects graphicEffectsLevel()
KIO Job to get a thumbnail picture.
void setScaleType(ScaleType type)
Sets the scale type for the generated preview.
static QStringList supportedMimeTypes()
Returns a list of all supported MIME types.
static QStringList availablePlugins()
Returns a list of all available preview plugins.
@ Scaled
The preview will be scaled to the size specified when constructing the PreviewJob.
void setOverlayIconAlpha(int alpha)
Sets the alpha-value for the MIME-type icon which overlays the preview.
KImageFilePreview(QWidget *parent=0)
Creates a new image file preview.
virtual QSize sizeHint() const
Returns the size hint for this widget.
virtual void clearPreview()
Clears the preview.
virtual void resizeEvent(QResizeEvent *event)
~KImageFilePreview()
Destroys the image file preview.
virtual void gotPreview(const KFileItem &, const QPixmap &)
virtual KIO::PreviewJob * createJob(const KUrl &url, int width, int height)
bool equals(const KUrl &u, const EqualsOptions &options=0) const
CompareWithoutTrailingSlash
QPixmap SmallIcon(const QString &name, int force_size, int state, const QStringList &overlays)
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.
KAction * clear(const QObject *recvr, const char *slot, QObject *parent)