|
|
|
/* ============================================================
|
|
|
|
*
|
|
|
|
* This file is a part of digiKam project
|
|
|
|
* http://www.digikam.org
|
|
|
|
*
|
|
|
|
* Date : 2008-08-20
|
|
|
|
* Description : Raw import tool
|
|
|
|
*
|
|
|
|
* Copyright (C) 2008 by Gilles Caulier <caulier dot gilles at gmail dot com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it
|
|
|
|
* and/or modify it under the terms of the GNU General
|
|
|
|
* Public License as published by the Free Software Foundation;
|
|
|
|
* either version 2, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* ============================================================ */
|
|
|
|
|
|
|
|
// TQt includes.
|
|
|
|
|
|
|
|
#include <tqstring.h>
|
|
|
|
#include <tqlayout.h>
|
|
|
|
#include <tqtooltip.h>
|
|
|
|
#include <tqwhatsthis.h>
|
|
|
|
|
|
|
|
// KDE includes.
|
|
|
|
|
|
|
|
#include <kcursor.h>
|
|
|
|
#include <tdelocale.h>
|
|
|
|
#include <tdeconfig.h>
|
|
|
|
#include <tdeapplication.h>
|
|
|
|
#include <kiconloader.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
|
|
|
|
|
|
// Local includes.
|
|
|
|
|
|
|
|
#include "ddebug.h"
|
|
|
|
#include "drawdecoding.h"
|
|
|
|
#include "histogramwidget.h"
|
|
|
|
#include "curveswidget.h"
|
|
|
|
#include "imagehistogram.h"
|
|
|
|
#include "rawsettingsbox.h"
|
|
|
|
#include "rawpostprocessing.h"
|
|
|
|
#include "editortooliface.h"
|
|
|
|
#include "rawpreview.h"
|
|
|
|
#include "rawimport.h"
|
|
|
|
#include "rawimport.moc"
|
|
|
|
|
|
|
|
namespace Digikam
|
|
|
|
{
|
|
|
|
|
|
|
|
class RawImportPriv
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
RawImportPriv()
|
|
|
|
{
|
|
|
|
previewWidget = 0;
|
|
|
|
settingsBox = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
RawSettingsBox *settingsBox;
|
|
|
|
|
|
|
|
RawPreview *previewWidget;
|
|
|
|
};
|
|
|
|
|
|
|
|
RawImport::RawImport(const KURL& url, TQObject *parent)
|
|
|
|
: EditorToolThreaded(parent)
|
|
|
|
{
|
|
|
|
d = new RawImportPriv;
|
|
|
|
d->previewWidget = new RawPreview(url, 0);
|
|
|
|
d->settingsBox = new RawSettingsBox(url, 0);
|
|
|
|
|
|
|
|
setToolName(i18n("Raw Import"));
|
|
|
|
setToolIcon(SmallIcon("kdcraw"));
|
|
|
|
setProgressMessage(i18n("Post Processing"));
|
|
|
|
setToolView(d->previewWidget);
|
|
|
|
setToolSettings(d->settingsBox);
|
|
|
|
|
|
|
|
init();
|
|
|
|
}
|
|
|
|
|
|
|
|
RawImport::~RawImport()
|
|
|
|
{
|
|
|
|
delete d;
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotInit()
|
|
|
|
{
|
|
|
|
EditorToolThreaded::slotInit();
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------
|
|
|
|
|
|
|
|
connect(d->previewWidget, TQT_SIGNAL(signalLoadingStarted()),
|
|
|
|
this, TQT_SLOT(slotLoadingStarted()));
|
|
|
|
|
|
|
|
connect(d->previewWidget, TQT_SIGNAL(signalDemosaicedImage()),
|
|
|
|
this, TQT_SLOT(slotDemosaicedImage()));
|
|
|
|
|
|
|
|
connect(d->previewWidget, TQT_SIGNAL(signalLoadingStarted()),
|
|
|
|
this, TQT_SLOT(slotLoadingStarted()));
|
|
|
|
|
|
|
|
connect(d->previewWidget, TQT_SIGNAL(signalLoadingProgress(float)),
|
|
|
|
this, TQT_SLOT(slotLoadingProgress(float)));
|
|
|
|
|
|
|
|
connect(d->previewWidget, TQT_SIGNAL(signalLoadingFailed()),
|
|
|
|
this, TQT_SLOT(slotLoadingFailed()));
|
|
|
|
|
|
|
|
connect(d->settingsBox, TQT_SIGNAL(signalDemosaicingChanged()),
|
|
|
|
this, TQT_SLOT(slotDemosaicingChanged()));
|
|
|
|
|
|
|
|
connect(d->settingsBox, TQT_SIGNAL(signalPostProcessingChanged()),
|
|
|
|
this, TQT_SLOT(slotTimer()));
|
|
|
|
|
|
|
|
connect(d->settingsBox, TQT_SIGNAL(signalUpdatePreview()),
|
|
|
|
this, TQT_SLOT(slotUpdatePreview()));
|
|
|
|
|
|
|
|
connect(d->settingsBox, TQT_SIGNAL(signalAbortPreview()),
|
|
|
|
this, TQT_SLOT(slotAbort()));
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------
|
|
|
|
|
|
|
|
setBusy(true);
|
|
|
|
slotUpdatePreview();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::setBusy(bool val)
|
|
|
|
{
|
|
|
|
if (val) d->previewWidget->setCursor(KCursor::waitCursor());
|
|
|
|
else d->previewWidget->unsetCursor();
|
|
|
|
d->settingsBox->setBusy(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
DRawDecoding RawImport::rawDecodingSettings()
|
|
|
|
{
|
|
|
|
return d->settingsBox->settings();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotUpdatePreview()
|
|
|
|
{
|
|
|
|
DRawDecoding settings = rawDecodingSettings();
|
|
|
|
// We will load an half size image to speed up preview computing.
|
|
|
|
settings.halfSizeColorImage = true;
|
|
|
|
|
|
|
|
d->previewWidget->setDecodingSettings(settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotAbort()
|
|
|
|
{
|
|
|
|
// If preview loading, don't play with threaded filter interface.
|
|
|
|
if (renderingMode() == EditorToolThreaded::NoneRendering)
|
|
|
|
{
|
|
|
|
d->previewWidget->cancelLoading();
|
|
|
|
d->settingsBox->histogram()->stopHistogramComputation();
|
|
|
|
EditorToolIface::editorToolIface()->setToolStopProgress();
|
|
|
|
setBusy(false);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
EditorToolThreaded::slotAbort();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotLoadingStarted()
|
|
|
|
{
|
|
|
|
d->settingsBox->enableUpdateBtn(false);
|
|
|
|
d->settingsBox->histogram()->setDataLoading();
|
|
|
|
d->settingsBox->curve()->setDataLoading();
|
|
|
|
EditorToolIface::editorToolIface()->setToolStartProgress(i18n("Raw Decoding"));
|
|
|
|
setBusy(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotDemosaicedImage()
|
|
|
|
{
|
|
|
|
d->settingsBox->setDemosaicedImage(d->previewWidget->demosaicedImage());
|
|
|
|
slotEffect();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::prepareEffect()
|
|
|
|
{
|
|
|
|
DImg postImg = d->previewWidget->demosaicedImage();
|
|
|
|
setFilter(dynamic_cast<DImgThreadedFilter*>(new RawPostProcessing(&postImg, this, rawDecodingSettings())));
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::putPreviewData()
|
|
|
|
{
|
|
|
|
d->previewWidget->setPostProcessedImage(filter()->getTargetImage());
|
|
|
|
d->settingsBox->setPostProcessedImage(d->previewWidget->postProcessedImage());
|
|
|
|
EditorToolIface::editorToolIface()->setToolStopProgress();
|
|
|
|
setBusy(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotLoadingFailed()
|
|
|
|
{
|
|
|
|
d->settingsBox->histogram()->setLoadingFailed();
|
|
|
|
EditorToolIface::editorToolIface()->setToolStopProgress();
|
|
|
|
setBusy(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotDemosaicingChanged()
|
|
|
|
{
|
|
|
|
d->settingsBox->enableUpdateBtn(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotLoadingProgress(float v)
|
|
|
|
{
|
|
|
|
EditorToolIface::editorToolIface()->setToolProgress((int)(v*100));
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotOk()
|
|
|
|
{
|
|
|
|
EditorTool::slotOk();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RawImport::slotCancel()
|
|
|
|
{
|
|
|
|
EditorTool::slotCancel();
|
|
|
|
}
|
|
|
|
|
|
|
|
} // NameSpace Digikam
|