File indexing completed on 2024-04-28 04:20:04

0001 /*
0002     SPDX-FileCopyrightText: 2022 Friedrich W. H. Kossebau <kossebau@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "tool.hpp"
0008 
0009 // own
0010 #include "loadimagejob.hpp"
0011 #include "imageselecttool.hpp"
0012 #include "widget.hpp"
0013 // core
0014 #include <scanimagerunner.hpp>
0015 #include <scanresult.hpp>
0016 // Qt
0017 #include <QImage>
0018 #include <QThreadPool>
0019 
0020 namespace Kodaskanna
0021 {
0022 namespace ImageSource
0023 {
0024 
0025 Tool::Tool(QObject *parent)
0026     : AbstractSourceTool(parent)
0027     , m_widget(new Widget)
0028 {
0029 }
0030 
0031 Tool::~Tool() = default;
0032 
0033 QWidget *Tool::widget()
0034 {
0035     return m_widget;
0036 }
0037 
0038 void Tool::setOrigin(const QUrl &origin)
0039 {
0040     if (origin.isEmpty()) {
0041         if (!m_imageSelectTool) {
0042             m_imageSelectTool.reset(new ImageSelectTool(this));
0043             m_widget->showImageSelect(m_imageSelectTool.get());
0044         }
0045         return;
0046     }
0047 
0048     m_widget->setEnabled(false);
0049 
0050     auto *loadImageJob = new LoadImageJob(origin);
0051     connect(loadImageJob, &LoadImageJob::result, this, &Tool::handleImageLoadResult);
0052 
0053     loadImageJob->start();
0054 }
0055 
0056 void Tool::setImage(const QImage &image)
0057 {
0058     m_widget->setImage(image);
0059 
0060     auto *scanImageRunner = new ScanImageRunner(image);
0061     qRegisterMetaType<Kodaskanna::ScanResult>();
0062     connect(scanImageRunner, &ScanImageRunner::scanFinished, this, &Tool::handleScanFinished);
0063 
0064     QThreadPool::globalInstance()->start(scanImageRunner);
0065 }
0066 
0067 void Tool::handleImageLoadResult(KJob *job)
0068 {
0069     m_widget->setEnabled(true);
0070 
0071     auto *loadImageJob = static_cast<LoadImageJob*>(job);
0072     if (loadImageJob->error() != 0) {
0073         m_widget->showError(loadImageJob->errorString());
0074         return;
0075     }
0076 
0077     setImage(loadImageJob->image());
0078 }
0079 
0080 void Tool::handleScanFinished(const ScanResult &scanResult)
0081 {
0082     if (!scanResult.isSuccess()) {
0083         m_widget->showError(i18n("Could not scan code in the image."));
0084     } else {
0085         m_widget->showSuccess(i18n("Code in the image successfully scanned."));
0086     }
0087 
0088     Q_EMIT scanFinished(scanResult);
0089 }
0090 
0091 }
0092 }