File indexing completed on 2025-04-20 04:02:16
0001 /* 0002 * SPDX-FileCopyrightText: (C) 2014 Vishesh Handa <me@vhanda.in> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.1-or-later 0005 */ 0006 0007 #include "processor.h" 0008 #include "imageprocessorrunnable.h" 0009 #include "imagestorage.h" 0010 0011 #include <QEventLoop> 0012 #include <QFileInfo> 0013 #include <QThreadPool> 0014 0015 using namespace Koko; 0016 0017 Processor::Processor(QObject *parent) 0018 : QObject(parent) 0019 , m_numFiles(0) 0020 , m_processing(false) 0021 , m_initialScanDone(false) 0022 { 0023 connect(&m_commitTimer, &CommitTimer::timeout, this, [&]() { 0024 ImageStorage::instance()->commit(); 0025 if (m_files.isEmpty()) { 0026 m_geoCoder.deinit(); 0027 if (m_numFiles && m_initialScanDone) 0028 emit finishedChanged(); 0029 } 0030 }); 0031 0032 connect(this, &Processor::numFilesChanged, &m_commitTimer, &CommitTimer::start); 0033 } 0034 0035 void Processor::addFile(const QString &filePath) 0036 { 0037 m_files << filePath; 0038 m_numFiles++; 0039 0040 QTimer::singleShot(0, this, &Processor::process); 0041 emit numFilesChanged(); 0042 } 0043 0044 void Processor::removeFile(const QString &filePath) 0045 { 0046 ImageStorage::instance()->removeImage(filePath); 0047 m_numFiles--; 0048 0049 emit numFilesChanged(); 0050 } 0051 0052 float Processor::initialProgress() const 0053 { 0054 if (m_numFiles) { 0055 return 1.0f - (m_files.size() * 1.0f / m_numFiles); 0056 } 0057 0058 return 0; 0059 } 0060 0061 int Processor::numFiles() const 0062 { 0063 return m_numFiles; 0064 } 0065 0066 void Processor::process() 0067 { 0068 if (m_processing) 0069 return; 0070 0071 if (m_files.isEmpty()) { 0072 return; 0073 } 0074 0075 m_processing = true; 0076 QString path = m_files.takeLast().replace("file://", ""); 0077 0078 ImageProcessorRunnable *runnable = new ImageProcessorRunnable(path, &m_geoCoder); 0079 connect(runnable, &ImageProcessorRunnable::finished, this, &Processor::slotFinished); 0080 0081 QThreadPool::globalInstance()->start(runnable); 0082 } 0083 0084 void Processor::slotFinished() 0085 { 0086 m_processing = false; 0087 QTimer::singleShot(0, this, &Processor::process); 0088 0089 emit initialProgressChanged(); 0090 m_commitTimer.start(); 0091 } 0092 0093 void Processor::initialScanCompleted() 0094 { 0095 m_initialScanDone = true; 0096 if (m_files.isEmpty()) { 0097 emit finishedChanged(); 0098 } 0099 }