File indexing completed on 2024-05-12 15:54:51

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, [&]() {
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, SLOT(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, SLOT(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 }