File indexing completed on 2025-03-09 03:50:51

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2009-11-13
0007  * Description : a tool to blend bracketed images.
0008  *
0009  * SPDX-FileCopyrightText: 2009-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0010  * SPDX-FileCopyrightText: 2012-2015 by Benjamin Girault <benjamin dot girault at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "expoblendingmanager.h"
0017 
0018 // Local includes
0019 
0020 #include "expoblendingwizard.h"
0021 #include "expoblendingdlg.h"
0022 #include "expoblendingthread.h"
0023 #include "alignbinary.h"
0024 #include "enfusebinary.h"
0025 
0026 namespace DigikamGenericExpoBlendingPlugin
0027 {
0028 
0029 class Q_DECL_HIDDEN ExpoBlendingManager::Private
0030 {
0031 public:
0032 
0033     explicit Private()
0034       : thread(nullptr),
0035         plugin(nullptr),
0036         wizard(nullptr),
0037         dlg(nullptr)
0038     {
0039     }
0040 
0041     QList<QUrl>             inputUrls;
0042 
0043     ExpoBlendingItemUrlsMap preProcessedUrlsMap;
0044 
0045     ExpoBlendingThread*     thread;
0046 
0047     DPlugin*                plugin;
0048 
0049     AlignBinary             alignBinary;
0050     EnfuseBinary            enfuseBinary;
0051 
0052     ExpoBlendingWizard*     wizard;
0053     ExpoBlendingDlg*        dlg;
0054 };
0055 
0056 QPointer<ExpoBlendingManager> ExpoBlendingManager::internalPtr = QPointer<ExpoBlendingManager>();
0057 
0058 ExpoBlendingManager::ExpoBlendingManager(QObject* const parent)
0059     : QObject(parent),
0060       d(new Private)
0061 {
0062     d->thread = new ExpoBlendingThread(this);
0063 
0064     connect(&d->enfuseBinary, SIGNAL(signalEnfuseVersion(double)),
0065             this, SLOT(slotSetEnfuseVersion(double)));
0066 
0067     if (d->enfuseBinary.isValid())
0068     {
0069         slotSetEnfuseVersion(d->enfuseBinary.getVersion());
0070     }
0071 }
0072 
0073 ExpoBlendingManager::~ExpoBlendingManager()
0074 {
0075     delete d->thread;
0076     delete d->wizard;
0077     delete d->dlg;
0078     delete d;
0079 }
0080 
0081 ExpoBlendingManager* ExpoBlendingManager::instance()
0082 {
0083     if (ExpoBlendingManager::internalPtr.isNull())
0084     {
0085         ExpoBlendingManager::internalPtr = new ExpoBlendingManager();
0086     }
0087 
0088     return ExpoBlendingManager::internalPtr;
0089 }
0090 
0091 bool ExpoBlendingManager::isCreated()
0092 {
0093     return (!internalPtr.isNull());
0094 }
0095 
0096 bool ExpoBlendingManager::checkBinaries()
0097 {
0098     if (!d->alignBinary.recheckDirectories())
0099     {
0100         return false;
0101     }
0102 
0103     if (!d->enfuseBinary.recheckDirectories())
0104     {
0105         return false;
0106     }
0107 
0108     return true;
0109 }
0110 
0111 AlignBinary& ExpoBlendingManager::alignBinary() const
0112 {
0113     return d->alignBinary;
0114 }
0115 
0116 EnfuseBinary& ExpoBlendingManager::enfuseBinary() const
0117 {
0118     return d->enfuseBinary;
0119 }
0120 
0121 void ExpoBlendingManager::setItemsList(const QList<QUrl>& urls)
0122 {
0123     d->inputUrls = urls;
0124 }
0125 
0126 QList<QUrl>& ExpoBlendingManager::itemsList() const
0127 {
0128     return d->inputUrls;
0129 }
0130 
0131 void ExpoBlendingManager::setPlugin(DPlugin* const plugin)
0132 {
0133     d->plugin = plugin;
0134 }
0135 
0136 void ExpoBlendingManager::setPreProcessedMap(const ExpoBlendingItemUrlsMap& urls)
0137 {
0138     d->preProcessedUrlsMap = urls;
0139 }
0140 
0141 ExpoBlendingItemUrlsMap& ExpoBlendingManager::preProcessedMap() const
0142 {
0143     return d->preProcessedUrlsMap;
0144 }
0145 
0146 ExpoBlendingThread* ExpoBlendingManager::thread() const
0147 {
0148     return d->thread;
0149 }
0150 
0151 void ExpoBlendingManager::run()
0152 {
0153     startWizard();
0154 }
0155 
0156 void ExpoBlendingManager::cleanUp()
0157 {
0158     d->thread->cleanUpResultFiles();
0159 }
0160 
0161 void ExpoBlendingManager::startWizard()
0162 {
0163     if (d->wizard && (d->wizard->isMinimized() || !d->wizard->isHidden()))
0164     {
0165         d->wizard->showNormal();       // krazy:exclude=qmethods
0166         d->wizard->activateWindow();
0167         d->wizard->raise();
0168     }
0169     else if (d->dlg && (d->dlg->isMinimized() || !d->dlg->isHidden()))
0170     {
0171         d->dlg->showNormal();          // krazy:exclude=qmethods
0172         d->dlg->activateWindow();
0173         d->dlg->raise();
0174     }
0175     else
0176     {
0177         delete d->wizard;
0178         delete d->dlg;
0179         d->dlg = nullptr;
0180 
0181         d->wizard = new ExpoBlendingWizard(this);
0182         d->wizard->setPlugin(d->plugin);
0183 
0184         connect(d->wizard, SIGNAL(accepted()),
0185                 this, SLOT(slotStartDialog()));
0186 
0187         d->wizard->show();
0188     }
0189 }
0190 
0191 void ExpoBlendingManager::slotStartDialog()
0192 {
0193     d->inputUrls = d->wizard->itemUrls();
0194 
0195     d->dlg = new ExpoBlendingDlg(this);
0196     d->dlg->show();
0197 }
0198 
0199 void ExpoBlendingManager::slotSetEnfuseVersion(double version)
0200 {
0201     d->thread->setEnfuseVersion(version);
0202 }
0203 
0204 } // namespace DigikamGenericExpoBlendingPlugin
0205 
0206 #include "moc_expoblendingmanager.cpp"