File indexing completed on 2024-04-28 04:21:24

0001 // SPDX-FileCopyrightText: 2012 Jesper K. Pedersen <blackie@kde.org>
0002 // SPDX-FileCopyrightText: 2023 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0003 
0004 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 
0006 #include "VideoThumbnailCycler.h"
0007 
0008 #include "CellGeometry.h"
0009 #include "ThumbnailModel.h"
0010 
0011 #include <DB/ImageInfo.h>
0012 #include <DB/ImageInfoPtr.h>
0013 #include <ImageManager/VideoThumbnails.h>
0014 #include <kpabase/FileExtensions.h>
0015 
0016 #include <QTimer>
0017 
0018 ThumbnailView::VideoThumbnailCycler *ThumbnailView::VideoThumbnailCycler::s_instance = nullptr;
0019 
0020 ThumbnailView::VideoThumbnailCycler::VideoThumbnailCycler(ThumbnailModel *model, QObject *parent)
0021     : QObject(parent)
0022     , m_thumbnails(new ImageManager::VideoThumbnails(this))
0023     , m_model(model)
0024 {
0025     m_timer = new QTimer(this);
0026     connect(m_timer, &QTimer::timeout, m_thumbnails, &ImageManager::VideoThumbnails::requestNext);
0027     connect(m_thumbnails, &ImageManager::VideoThumbnails::frameLoaded, this, &VideoThumbnailCycler::gotFrame);
0028     Q_ASSERT(!s_instance);
0029     s_instance = this;
0030 }
0031 
0032 ThumbnailView::VideoThumbnailCycler *ThumbnailView::VideoThumbnailCycler::instance()
0033 {
0034     Q_ASSERT(s_instance);
0035     return s_instance;
0036 }
0037 
0038 void ThumbnailView::VideoThumbnailCycler::setActive(const DB::FileName &fileName)
0039 {
0040     if (m_fileName == fileName)
0041         return;
0042 
0043     stopCycle();
0044 
0045     m_fileName = fileName;
0046     if (!m_fileName.isNull() && isVideo(m_fileName))
0047         startCycle();
0048 }
0049 
0050 void ThumbnailView::VideoThumbnailCycler::gotFrame(const QImage &image)
0051 {
0052     QImage img = image.scaled(ThumbnailView::CellGeometry::preferredIconSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
0053     m_model->setOverrideImage(m_fileName, QPixmap::fromImage(img));
0054 }
0055 
0056 void ThumbnailView::VideoThumbnailCycler::resetPreviousThumbail()
0057 {
0058     if (m_fileName.isNull() || !isVideo(m_fileName))
0059         return;
0060 
0061     m_model->setOverrideImage(m_fileName, QPixmap());
0062 }
0063 
0064 bool ThumbnailView::VideoThumbnailCycler::isVideo(const DB::FileName &fileName) const
0065 {
0066     if (!fileName.isNull())
0067         return KPABase::isVideo(fileName);
0068     else
0069         return false;
0070 }
0071 
0072 void ThumbnailView::VideoThumbnailCycler::startCycle()
0073 {
0074     m_thumbnails->setVideoFile(m_fileName);
0075     m_timer->start(500);
0076     m_thumbnails->requestNext(); // We want it to cycle right away.
0077 }
0078 
0079 void ThumbnailView::VideoThumbnailCycler::stopCycle()
0080 {
0081     resetPreviousThumbail();
0082     m_fileName = DB::FileName();
0083     m_timer->stop();
0084 }
0085 // vi:expandtab:tabstop=4 shiftwidth=4:
0086 
0087 #include "moc_VideoThumbnailCycler.cpp"