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"