diff --git a/core/libs/dimg/filters/bw/bwsepiasettings.cpp b/core/libs/dimg/filters/bw/bwsepiasettings.cpp index 08a11943d6..d2c64b3fe6 100644 --- a/core/libs/dimg/filters/bw/bwsepiasettings.cpp +++ b/core/libs/dimg/filters/bw/bwsepiasettings.cpp @@ -1,651 +1,654 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2010-02-23 * Description : black and white settings view. * * Copyright (C) 2010-2019 by Gilles Caulier * * 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. * * ============================================================ */ #include "bwsepiasettings.h" // Qt includes #include #include #include #include #include #include #include #include #include #include #include #include // KDE includes #include // Local includes #include "dlayoutbox.h" #include "dexpanderbox.h" #include "dfiledialog.h" #include "dnuminput.h" #include "digikam_debug.h" #include "previewlist.h" #include "curvesbox.h" #include "curveswidget.h" #include "imagecurves.h" namespace Digikam { class Q_DECL_HIDDEN BWSepiaSettings::Private { public: enum SettingsTab { FilmTab = 0, BWFiltersTab, ToneTab, LuminosityTab }; public: explicit Private() : bwFilters(0), bwFilm(0), bwTone(0), tab(0), cInput(0), strengthInput(0), curvesBox(0) { } static const QString configSettingsTabEntry; static const QString configBWFilterEntry; static const QString configBWFilmEntry; static const QString configBWToneEntry; static const QString configContrastAdjustmentEntry; static const QString configStrengthAdjustmentEntry; static const QString configCurveEntry; PreviewList* bwFilters; PreviewList* bwFilm; PreviewList* bwTone; DExpanderBoxExclusive* tab; DIntNumInput* cInput; DIntNumInput* strengthInput; CurvesBox* curvesBox; DImg thumbImage; public: PreviewListItem* addItem(PreviewList* const list, const QString& name, BWSepiaContainer::BlackWhiteConversionType type); }; const QString BWSepiaSettings::Private::configSettingsTabEntry(QLatin1String("Settings Tab")); const QString BWSepiaSettings::Private::configBWFilterEntry(QLatin1String("BW Filter")); const QString BWSepiaSettings::Private::configBWFilmEntry(QLatin1String("BW Film")); const QString BWSepiaSettings::Private::configBWToneEntry(QLatin1String("BW Tone")); const QString BWSepiaSettings::Private::configContrastAdjustmentEntry(QLatin1String("ContrastValueAdjustment")); const QString BWSepiaSettings::Private::configStrengthAdjustmentEntry(QLatin1String("StrengthAdjustment")); const QString BWSepiaSettings::Private::configCurveEntry(QLatin1String("BWSepiaCurve")); PreviewListItem* BWSepiaSettings::Private::addItem(PreviewList* const list, const QString& name, BWSepiaContainer::BlackWhiteConversionType type) { BWSepiaFilter* const filter = new BWSepiaFilter(&thumbImage, 0, BWSepiaContainer(type)); PreviewListItem* const item = list->addItem(filter, name, type); return item; } // -------------------------------------------------------- BWSepiaSettings::BWSepiaSettings(QWidget* const parent, DImg* const img) : QWidget(parent), d(new Private) { if (!img->isNull()) { d->thumbImage = img->smoothScale(128, 128, Qt::KeepAspectRatio); } else { - d->thumbImage = DImg(QIcon::fromTheme(QLatin1String("view-preview")).pixmap(128).toImage()); + QString backGround = QStandardPaths::locate(QStandardPaths::GenericDataLocation, + QLatin1String("digikam/about/images/body-background.jpg")); + + d->thumbImage = DImg(backGround).smoothScale(128, 128); } const int spacing = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing); QGridLayout* const grid = new QGridLayout(parent); d->tab = new DExpanderBoxExclusive(this); PreviewListItem* item; d->bwFilm = new PreviewList; item = d->addItem(d->bwFilm, i18nc("generic black and white film", "Generic"), BWSepiaContainer::BWGeneric); item->setWhatsThis(i18n("Generic:" "

Simulate a generic black and white film.

")); item = d->addItem(d->bwFilm, i18n("Agfa 200X"), BWSepiaContainer::BWAgfa200X); item->setWhatsThis(i18n("Agfa 200X:" "

Simulate the Agfa 200X black and white film at 200 ISO.

")); item = d->addItem(d->bwFilm, i18n("Agfa Pan 25"), BWSepiaContainer::BWAgfapan25); item->setWhatsThis(i18n("Agfa Pan 25:" "

Simulate the Agfa Pan black and white film at 25 ISO.

")); item = d->addItem(d->bwFilm, i18n("Agfa Pan 100"), BWSepiaContainer::BWAgfapan100); item->setWhatsThis(i18n("Agfa Pan 100:" "

Simulate the Agfa Pan black and white film at 100 ISO.

")); item = d->addItem(d->bwFilm, i18n("Agfa Pan 400"), BWSepiaContainer::BWAgfapan400); item->setWhatsThis(i18n("Agfa Pan 400:" "

Simulate the Agfa Pan black and white film at 400 ISO.

")); item = d->addItem(d->bwFilm, i18n("Ilford Delta 100"), BWSepiaContainer::BWIlfordDelta100); item->setWhatsThis(i18n("Ilford Delta 100:" "

Simulate the Ilford Delta black and white film at 100 ISO.

")); item = d->addItem(d->bwFilm, i18n("Ilford Delta 400"), BWSepiaContainer::BWIlfordDelta400); item->setWhatsThis(i18n("Ilford Delta 400:" "

Simulate the Ilford Delta black and white film at 400 ISO.

")); item = d->addItem(d->bwFilm, i18n("Ilford Delta 400 Pro 3200"), BWSepiaContainer::BWIlfordDelta400Pro3200); item->setWhatsThis(i18n("Ilford Delta 400 Pro 3200:" "

Simulate the Ilford Delta 400 Pro black and white film at 3200 ISO.

")); item = d->addItem(d->bwFilm, i18n("Ilford FP4 Plus"), BWSepiaContainer::BWIlfordFP4); item->setWhatsThis(i18n("Ilford FP4 Plus:" "

Simulate the Ilford FP4 Plus black and white film at 125 ISO.

")); item = d->addItem(d->bwFilm, i18n("Ilford HP5 Plus"), BWSepiaContainer::BWIlfordHP5); item->setWhatsThis(i18n("Ilford HP5 Plus:" "

Simulate the Ilford HP5 Plus black and white film at 400 ISO.

")); item = d->addItem(d->bwFilm, i18n("Ilford PanF Plus"), BWSepiaContainer::BWIlfordPanF); item->setWhatsThis(i18n("Ilford PanF Plus:" "

Simulate the Ilford PanF Plus black and white film at 50 ISO.

")); item = d->addItem(d->bwFilm, i18n("Ilford XP2 Super"), BWSepiaContainer::BWIlfordXP2Super); item->setWhatsThis(i18n("Ilford XP2 Super:" "

Simulate the Ilford XP2 Super black and white film at 400 ISO.

")); item = d->addItem(d->bwFilm, i18n("Kodak Tmax 100"), BWSepiaContainer::BWKodakTmax100); item->setWhatsThis(i18n("Kodak Tmax 100:" "

Simulate the Kodak Tmax black and white film at 100 ISO.

")); item = d->addItem(d->bwFilm, i18n("Kodak Tmax 400"), BWSepiaContainer::BWKodakTmax400); item->setWhatsThis(i18n("Kodak Tmax 400:" "

Simulate the Kodak Tmax black and white film at 400 ISO.

")); item = d->addItem(d->bwFilm, i18n("Kodak TriX"), BWSepiaContainer::BWKodakTriX); item->setWhatsThis(i18n("Kodak TriX:" "

Simulate the Kodak TriX black and white film at 400 ISO.

")); // ------------------------------------------------------------- item = d->addItem(d->bwFilm, i18n("Ilford SPX 200 (Infrared)"), BWSepiaContainer::BWIlfordSFX200); item->setWhatsThis(i18n("Ilford SPX 200:" "

Simulate the Ilford SPX infrared film at 200 ISO.

")); item = d->addItem(d->bwFilm, i18n("Ilford SPX 400 (Infrared)"), BWSepiaContainer::BWIlfordSFX400); item->setWhatsThis(i18n("Ilford SPX 400:" "

Simulate the Ilford SPX infrared film at 400 ISO.

")); item = d->addItem(d->bwFilm, i18n("Ilford SPX 800 (Infrared)"), BWSepiaContainer::BWIlfordSFX800); item->setWhatsThis(i18n("Ilford SPX 800:" "

Simulate the Ilford SPX infrared film at 800 ISO.

")); item = d->addItem(d->bwFilm, i18n("Kodak HIE (Infrared)"), BWSepiaContainer::BWKodakHIE); item->setWhatsThis(i18n("Kodak HIE:" "

Simulate the Kodak HIE infrared film.

")); // ------------------------------------------------------------- QWidget* vbox = new QWidget(); QVBoxLayout* vlay = new QVBoxLayout(vbox); d->bwFilters = new PreviewList(vbox); item = d->addItem(d->bwFilters, i18n("No Lens Filter"), BWSepiaContainer::BWNoFilter); item->setWhatsThis(i18n("No Lens Filter:" "

Do not apply a lens filter when rendering the image.

")); item = d->addItem(d->bwFilters, i18n("Green Filter"), BWSepiaContainer::BWGreenFilter); item->setWhatsThis(i18n("Black & White with Green Filter:" "

Simulate black and white film exposure using a green filter. " "This is useful for all scenic shoots, especially " "portraits photographed against the sky.

")); item = d->addItem(d->bwFilters, i18n("Orange Filter"), BWSepiaContainer::BWOrangeFilter); item->setWhatsThis(i18n("Black & White with Orange Filter:" "

Simulate black and white film exposure using an orange filter. " "This will enhance landscapes, marine scenes and aerial " "photography.

")); item = d->addItem(d->bwFilters, i18n("Red Filter"), BWSepiaContainer::BWRedFilter); item->setWhatsThis(i18n("Black & White with Red Filter:" "

Simulate black and white film exposure using a red filter. " "This creates dramatic sky effects, and simulates moonlight scenes " "in the daytime.

")); item = d->addItem(d->bwFilters, i18n("Yellow Filter"), BWSepiaContainer::BWYellowFilter); item->setWhatsThis(i18n("Black & White with Yellow Filter:" "

Simulate black and white film exposure using a yellow filter. " "This has the most natural tonal correction, and improves contrast. Ideal for " "landscapes.

")); item = d->addItem(d->bwFilters, i18n("Yellow-Green Filter"), BWSepiaContainer::BWYellowGreenFilter); item->setWhatsThis(i18n("Black & White with Yellow-Green Filter:" "

Simulate black and white film exposure using a yellow-green filter. " "A yellow-green filter is highly effective for outdoor portraits because " "red is rendered dark while green appears lighter. Great for correcting skin tones, " "bringing out facial expressions in close-ups and emphasizing the feeling of liveliness. " "This filter is highly effective for indoor portraits under tungsten lighting.

")); item = d->addItem(d->bwFilters, i18n("Blue Filter"), BWSepiaContainer::BWBlueFilter); item->setWhatsThis(i18n("Black & White with Blue Filter:" "

Simulate black and white film exposure using a blue filter. " "This accentuates haze and fog. Used for dye transfer and contrast effects.

")); DHBox* const hbox1 = new DHBox(vbox); QLabel* const label1 = new QLabel(i18n("Strength:"), hbox1); label1->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); d->strengthInput = new DIntNumInput(hbox1); d->strengthInput->setRange(1, 5, 1); d->strengthInput->setDefaultValue(1); d->strengthInput->setWhatsThis(i18n("Here, set the strength adjustment of the lens filter.")); vlay->addWidget(d->bwFilters); vlay->addWidget(hbox1); vlay->setContentsMargins(QMargins()); vlay->setSpacing(spacing); // ------------------------------------------------------------- d->bwTone = new PreviewList; item = d->addItem(d->bwTone, i18n("No Tone Filter"), BWSepiaContainer::BWNoTone); item->setWhatsThis(i18n("No Tone Filter:" "

Do not apply a tone filter to the image.

")); item = d->addItem(d->bwTone, i18n("Sepia Filter"), BWSepiaContainer::BWSepiaTone); item->setWhatsThis(i18n("Black & White with Sepia Tone:" "

Gives a warm highlight and mid-tone while adding a bit of coolness to " "the shadows - very similar to the process of bleaching a print and " "re-developing in a sepia toner.

")); item = d->addItem(d->bwTone, i18n("Brown Filter"), BWSepiaContainer::BWBrownTone); item->setWhatsThis(i18n("Black & White with Brown Tone:" "

This filter is more neutral than the Sepia Tone " "filter.

")); item = d->addItem(d->bwTone, i18n("Cold Filter"), BWSepiaContainer::BWColdTone); item->setWhatsThis(i18n("Black & White with Cold Tone:" "

Start subtly and replicate printing on a cold tone black and white " "paper such as a bromide enlarging " "paper.

")); item = d->addItem(d->bwTone, i18n("Selenium Filter"), BWSepiaContainer::BWSeleniumTone); item->setWhatsThis(i18n("Black & White with Selenium Tone:" "

This effect replicates traditional selenium chemical toning done " "in the darkroom.

")); item = d->addItem(d->bwTone, i18n("Platinum Filter"), BWSepiaContainer::BWPlatinumTone); item->setWhatsThis(i18n("Black & White with Platinum Tone:" "

This effect replicates traditional platinum chemical toning done " "in the darkroom.

")); item = d->addItem(d->bwTone, i18n("Green Filter"), BWSepiaContainer::BWGreenTone); item->setWhatsThis(i18n("Black & White with greenish tint:" "

This effect is also known as Verdante.

")); // ------------------------------------------------------------- QWidget* lumBox = new QWidget(); // NOTE: add a method to be able to use curves widget without image data as simple curve editor. if (!img->isNull()) { d->curvesBox = new CurvesBox(256, 192, *img, lumBox); } else { d->curvesBox = new CurvesBox(256, 192, DImg(1, 1, true, false, (uchar*)"\x00\x00\x00\x00\x00\x00\x00\x00"), lumBox); } d->curvesBox->enableCurveTypes(true); d->curvesBox->enableResetButton(true); d->curvesBox->setWhatsThis(i18n("This is the curve adjustment of the image luminosity")); // ------------------------------------------------------------- DHBox* const hbox2 = new DHBox(lumBox); QLabel* const label2 = new QLabel(i18n("Contrast:"), hbox2); label2->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); d->cInput = new DIntNumInput(hbox2); d->cInput->setRange(-100, 100, 1); d->cInput->setDefaultValue(0); d->cInput->setWhatsThis(i18n("Set here the contrast adjustment of the image.")); QGridLayout* gridTab2 = new QGridLayout(lumBox); gridTab2->addWidget(d->curvesBox, 0, 0, 1, 1); gridTab2->addWidget(hbox2, 1, 0, 1, 1); gridTab2->setRowStretch(2, 10); gridTab2->setContentsMargins(spacing, spacing, spacing, spacing); gridTab2->setSpacing(0); // ------------------------------------------------------------- // Some new icons may be needed : a film roll, a lens filter and ? d->tab->addItem(d->bwFilm, QIcon::fromTheme(QLatin1String("filmgrain")), i18n("Film"), QLatin1String("Film"), true); d->tab->addItem(vbox, QIcon::fromTheme(QLatin1String("lensautofix")), i18n("Lens Filters"), QLatin1String("Lens Filters"), false); d->tab->addItem(d->bwTone, QIcon::fromTheme(QLatin1String("fill-color")), i18n("Tone"), QLatin1String("Tone"), false); d->tab->addItem(lumBox, QIcon::fromTheme(QLatin1String("adjustcurves")), i18n("Luminosity"), QLatin1String("Luminosity"), false); d->tab->addStretch(); grid->addWidget(d->tab, 0, 0, 1, 10); grid->setRowStretch(0, 10); grid->setContentsMargins(spacing, spacing, spacing, spacing); grid->setSpacing(spacing); // ------------------------------------------------------------- connect(d->bwFilters, SIGNAL(itemSelectionChanged()), this, SLOT(slotFilterSelected())); connect(d->strengthInput, SIGNAL(valueChanged(int)), this, SIGNAL(signalSettingsChanged())); connect(d->bwFilm, SIGNAL(itemSelectionChanged()), this, SIGNAL(signalSettingsChanged())); connect(d->bwTone, SIGNAL(itemSelectionChanged()), this, SIGNAL(signalSettingsChanged())); connect(d->cInput, SIGNAL(valueChanged(int)), this, SIGNAL(signalSettingsChanged())); connect(d->curvesBox, SIGNAL(signalCurvesChanged()), this, SIGNAL(signalSettingsChanged())); connect(d->curvesBox, SIGNAL(signalChannelReset(int)), this, SIGNAL(signalSettingsChanged())); } BWSepiaSettings::~BWSepiaSettings() { delete d; } void BWSepiaSettings::startPreviewFilters() { d->bwFilters->startFilters(); d->bwFilm->startFilters(); d->bwTone->startFilters(); } void BWSepiaSettings::slotFilterSelected() { int filter = d->bwFilters->currentId(); if (filter == BWSepiaContainer::BWNoFilter) { d->strengthInput->setEnabled(false); } else { d->strengthInput->setEnabled(true); } emit signalSettingsChanged(); } BWSepiaContainer BWSepiaSettings::settings() const { BWSepiaContainer prm; prm.filmType = d->bwFilm->currentId(); prm.filterType = d->bwFilters->currentId(); prm.toneType = d->bwTone->currentId(); prm.bcgPrm.contrast = ((double)(d->cInput->value() / 100.0) + 1.00); prm.strength = 1.0 + ((double)d->strengthInput->value() - 1.0) * (1.0 / 3.0); prm.curvesPrm = d->curvesBox->curves()->getContainer(LuminosityChannel); return prm; } void BWSepiaSettings::setSettings(const BWSepiaContainer& settings) { blockSignals(true); d->bwFilm->setCurrentId(settings.filmType); d->bwFilters->setCurrentId(settings.filterType); d->bwTone->setCurrentId(settings.toneType); d->cInput->setValue((int)((settings.bcgPrm.contrast - 1.00) * 100.0)); d->strengthInput->setValue((int)(1.0 + (settings.strength - 1.0) * 3.0)); d->curvesBox->curves()->setContainer(settings.curvesPrm); d->curvesBox->update(); slotFilterSelected(); blockSignals(false); } void BWSepiaSettings::resetToDefault() { blockSignals(true); d->bwFilters->setCurrentId(BWSepiaContainer::BWNoFilter); d->bwFilm->setCurrentId(BWSepiaContainer::BWGeneric); d->bwTone->setCurrentId(BWSepiaContainer::BWNoTone); d->cInput->slotReset(); d->strengthInput->slotReset(); d->curvesBox->curves()->curvesChannelReset(LuminosityChannel); d->curvesBox->reset(); blockSignals(false); slotFilterSelected(); } BWSepiaContainer BWSepiaSettings::defaultSettings() const { BWSepiaContainer prm; prm.bcgPrm.contrast = ((double)(d->cInput->defaultValue() / 100.0) + 1.00); prm.strength = 1.0 + ((double)d->strengthInput->defaultValue() - 1.0) * (1.0 / 3.0); return prm; } void BWSepiaSettings::readSettings(KConfigGroup& group) { BWSepiaContainer prm; BWSepiaContainer defaultPrm = defaultSettings(); d->tab->readSettings(group); prm.filmType = group.readEntry(d->configBWFilmEntry, defaultPrm.filmType); prm.filterType = group.readEntry(d->configBWFilterEntry, defaultPrm.filterType); prm.toneType = group.readEntry(d->configBWToneEntry, defaultPrm.toneType); prm.bcgPrm.contrast = group.readEntry(d->configContrastAdjustmentEntry, defaultPrm.bcgPrm.contrast); prm.strength = group.readEntry(d->configStrengthAdjustmentEntry, defaultPrm.strength); d->curvesBox->readCurveSettings(group, d->configCurveEntry); prm.curvesPrm = d->curvesBox->curves()->getContainer(LuminosityChannel); setSettings(prm); } void BWSepiaSettings::writeSettings(KConfigGroup& group) { BWSepiaContainer prm = settings(); d->tab->writeSettings(group); group.writeEntry(d->configBWFilmEntry, prm.filmType); group.writeEntry(d->configBWFilterEntry, prm.filterType); group.writeEntry(d->configBWToneEntry, prm.toneType); group.writeEntry(d->configContrastAdjustmentEntry, prm.bcgPrm.contrast); group.writeEntry(d->configStrengthAdjustmentEntry, prm.strength); d->curvesBox->writeCurveSettings(group, d->configCurveEntry); } void BWSepiaSettings::loadSettings() { QUrl loadFile = DFileDialog::getOpenFileUrl(qApp->activeWindow(), i18n("Black & White Settings File to Load"), QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)), QLatin1String("*")); if (loadFile.isEmpty()) { return; } QFile file(loadFile.toLocalFile()); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); if (stream.readLine() != QLatin1String("# Black & White Configuration File")) { QMessageBox::critical(qApp->activeWindow(), qApp->applicationName(), i18n("\"%1\" is not a Black & White settings text file.", loadFile.fileName())); file.close(); return; } blockSignals(true); d->bwFilm->setCurrentId(stream.readLine().toInt()); d->bwFilters->setCurrentId(stream.readLine().toInt()); d->bwTone->setCurrentId(stream.readLine().toInt()); d->cInput->setValue(stream.readLine().toInt()); for (int i = 0 ; i < 5 ; ++i) { d->curvesBox->curves()->curvesChannelReset(i); } d->curvesBox->curves()->setCurveType(d->curvesBox->channel(), ImageCurves::CURVE_SMOOTH); d->curvesBox->reset(); // TODO cant we use the kconfig mechanisms provided by CurveWidget here? QPoint disable = ImageCurves::getDisabledValue(); QPoint p; for (int j = 0 ; j < ImageCurves::NUM_POINTS ; ++j) { p.setX(stream.readLine().toInt()); p.setY(stream.readLine().toInt()); if (d->curvesBox->curves()->isSixteenBits() && p != disable) { p.setX(p.x()*ImageCurves::MULTIPLIER_16BIT); p.setY(p.y()*ImageCurves::MULTIPLIER_16BIT); } d->curvesBox->curves()->setCurvePoint(LuminosityChannel, j, p); } d->curvesBox->curves()->curvesCalculateAllCurves(); blockSignals(false); } else { QMessageBox::critical(qApp->activeWindow(), qApp->applicationName(), i18n("Cannot load settings from the Black & White text file.")); } file.close(); } void BWSepiaSettings::saveAsSettings() { QUrl saveFile = DFileDialog::getSaveFileUrl(qApp->activeWindow(), i18n("Black & White Settings File to Save"), QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)), QLatin1String("*")); if (saveFile.isEmpty()) { return; } QFile file(saveFile.toLocalFile()); if (file.open(QIODevice::WriteOnly)) { QTextStream stream(&file); stream << QLatin1String("# Black & White Configuration File\n"); stream << d->bwFilm->currentId() << "\n"; stream << d->bwFilters->currentId() << "\n"; stream << d->bwTone->currentId() << "\n"; stream << d->cInput->value() << "\n"; // TODO cant we use the kconfig mechanisms provided by CurveWidget here? for (int j = 0 ; j < ImageCurves::NUM_POINTS ; ++j) { QPoint p = d->curvesBox->curves()->getCurvePoint(LuminosityChannel, j); if (d->curvesBox->curves()->isSixteenBits()) { p.setX(p.x() / ImageCurves::MULTIPLIER_16BIT); p.setY(p.y() / ImageCurves::MULTIPLIER_16BIT); } stream << p.x() << "\n"; stream << p.y() << "\n"; } } else { QMessageBox::critical(qApp->activeWindow(), qApp->applicationName(), i18n("Cannot save settings to the Black & White text file.")); } file.close(); } void BWSepiaSettings::setScaleType(HistogramScale scale) { d->curvesBox->setScale(scale); } } // namespace Digikam diff --git a/core/libs/dimg/filters/fx/colorfxsettings.cpp b/core/libs/dimg/filters/fx/colorfxsettings.cpp index 443b88e209..0a8ec37753 100644 --- a/core/libs/dimg/filters/fx/colorfxsettings.cpp +++ b/core/libs/dimg/filters/fx/colorfxsettings.cpp @@ -1,425 +1,428 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2012-11-08 * Description : Color effects settings view. * * Copyright (C) 2012 by Alexander Dymo * * 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. * * ============================================================ */ #include "colorfxsettings.h" // Qt includes #include #include #include #include #include #include #include #include #include // Local includes #include "dexpanderbox.h" #include "previewlist.h" #include "imageiface.h" #include "dcombobox.h" #include "dnuminput.h" namespace Digikam { class Q_DECL_HIDDEN ColorFXSettings::Private { public: explicit Private() : stack(0), effectType(0), levelInput(0), iterationInput(0), intensityInput(0), iterationLabel(0), correctionTools(0) { } static const QString configEffectTypeEntry; static const QString configLevelAdjustmentEntry; static const QString configIterationAdjustmentEntry; static const QString configLut3DFilterEntry; static const QString configLut3DIntensityEntry; QStackedWidget* stack; DComboBox* effectType; DIntNumInput* levelInput; DIntNumInput* iterationInput; DIntNumInput* intensityInput; QLabel* iterationLabel; PreviewList* correctionTools; QStringList luts; }; const QString ColorFXSettings::Private::configEffectTypeEntry(QLatin1String("EffectType")); const QString ColorFXSettings::Private::configLevelAdjustmentEntry(QLatin1String("LevelAdjustment")); const QString ColorFXSettings::Private::configIterationAdjustmentEntry(QLatin1String("IterationAdjustment")); const QString ColorFXSettings::Private::configLut3DFilterEntry(QLatin1String("Lut3D Color Correction Filter")); const QString ColorFXSettings::Private::configLut3DIntensityEntry(QLatin1String("Lut3D Color Correction Intensity")); // -------------------------------------------------------- ColorFXSettings::ColorFXSettings(QWidget* const parent, bool useGenericImg) : QWidget(parent), d(new Private) { DImg thumbImage; findLuts(); if (useGenericImg) { - thumbImage = DImg(QIcon::fromTheme(QLatin1String("view-preview")).pixmap(128).toImage()); + QString backGround = QStandardPaths::locate(QStandardPaths::GenericDataLocation, + QLatin1String("digikam/about/images/body-background.jpg")); + + thumbImage = DImg(backGround).smoothScale(128, 128); } else { ImageIface iface; thumbImage = iface.original()->smoothScale(128, 128, Qt::KeepAspectRatio); } // ------------------------------------------------------------- const int spacing = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing); QGridLayout* const grid = new QGridLayout(parent); QLabel* const effectTypeLabel = new QLabel(i18n("Type:"), parent); d->effectType = new DComboBox(parent); d->effectType->addItem(i18n("Solarize")); d->effectType->addItem(i18n("Vivid")); d->effectType->addItem(i18n("Neon")); d->effectType->addItem(i18n("Find Edges")); d->effectType->addItem(i18n("Lut3D")); d->effectType->setDefaultIndex(ColorFXFilter::Solarize); d->effectType->setWhatsThis(i18n("

Select the effect type to apply to the image here.

" "

Solarize: simulates solarization of photograph.

" "

Vivid: simulates the Velvia(tm) slide film colors.

" "

Neon: coloring the edges in a photograph to " "reproduce a fluorescent light effect.

" "

Find Edges: detects the edges in a photograph " "and their strength.

" "

Lut3D: coloring images with Lut3D filters

")); d->stack = new QStackedWidget(parent); grid->addWidget(effectTypeLabel, 0, 0, 1, 1); grid->addWidget(d->effectType, 1, 0, 1, 1); grid->addWidget(new DLineWidget(Qt::Horizontal, parent), 2, 0, 1, 1); grid->addWidget(d->stack, 3, 0, 1, 1); grid->setRowStretch(3, 10); grid->setContentsMargins(spacing, spacing, spacing, spacing); grid->setSpacing(spacing); // ------------------------------------------------------------- QWidget* const solarizeSettings = new QWidget(d->stack); QGridLayout* const grid1 = new QGridLayout(solarizeSettings); QLabel* const levelLabel = new QLabel(i18nc("level of the effect", "Level:"), solarizeSettings); d->levelInput = new DIntNumInput(solarizeSettings); d->levelInput->setRange(0, 100, 1); d->levelInput->setDefaultValue(3); d->levelInput->setWhatsThis( i18n("Set here the level of the effect.")); d->iterationLabel = new QLabel(i18n("Iteration:"), solarizeSettings); d->iterationInput = new DIntNumInput(solarizeSettings); d->iterationInput->setRange(0, 100, 1); d->iterationInput->setDefaultValue(2); d->iterationInput->setWhatsThis(i18n("This value controls the number of iterations " "to use with the Neon and Find Edges effects.")); grid1->addWidget(levelLabel, 0, 0, 1, 1); grid1->addWidget(d->levelInput, 1, 0, 1, 1); grid1->addWidget(d->iterationLabel, 2, 0, 1, 1); grid1->addWidget(d->iterationInput, 3, 0, 1, 1); grid1->setRowStretch(4, 10); grid1->setContentsMargins(QMargins()); grid1->setSpacing(0); d->stack->insertWidget(0, solarizeSettings); // ------------------------------------------------------------- QWidget* const lut3DSettings = new QWidget(d->stack); QGridLayout* const grid2 = new QGridLayout(lut3DSettings); d->correctionTools = new PreviewList(lut3DSettings); for (int idx = 0 ; idx < d->luts.count() ; ++idx) { ColorFXContainer prm; prm.colorFXType = ColorFXFilter::Lut3D; prm.path = d->luts[idx]; QFileInfo fi(prm.path); d->correctionTools->addItem(new ColorFXFilter(&thumbImage, lut3DSettings, prm), translateLuts(fi.baseName()), idx); } QLabel* const intensityLabel = new QLabel(i18n("Intensity:"), lut3DSettings); d->intensityInput = new DIntNumInput(lut3DSettings); d->intensityInput->setRange(1, 100, 1); d->intensityInput->setDefaultValue(100); d->intensityInput->setWhatsThis(i18n("Set here the intensity of the filter.")); grid2->addWidget(d->correctionTools, 0, 0, 1, 1); grid2->addWidget(intensityLabel, 1, 0, 1, 1); grid2->addWidget(d->intensityInput, 2, 0, 1, 1); grid2->setRowStretch(0, 10); grid2->setContentsMargins(QMargins()); grid2->setSpacing(0); d->stack->insertWidget(1, lut3DSettings); // ------------------------------------------------------------- connect(d->effectType, SIGNAL(activated(int)), this, SLOT(slotEffectTypeChanged(int))); connect(d->levelInput, SIGNAL(valueChanged(int)), this, SIGNAL(signalSettingsChanged())); connect(d->iterationInput, SIGNAL(valueChanged(int)), this, SIGNAL(signalSettingsChanged())); connect(d->correctionTools, SIGNAL(itemSelectionChanged()), this, SIGNAL(signalSettingsChanged())); connect(d->intensityInput, SIGNAL(valueChanged(int)), this, SIGNAL(signalSettingsChanged())); } ColorFXSettings::~ColorFXSettings() { delete d; } void ColorFXSettings::startPreviewFilters() { d->correctionTools->startFilters(); } void ColorFXSettings::slotEffectTypeChanged(int type) { d->iterationInput->blockSignals(true); d->levelInput->blockSignals(true); int w = (type == ColorFXFilter::Lut3D ? 1 : 0); d->stack->setCurrentWidget(d->stack->widget(w)); switch (type) { case ColorFXFilter::Solarize: d->levelInput->setRange(0, 100, 1); d->levelInput->setValue(20); d->iterationInput->setEnabled(false); d->iterationLabel->setEnabled(false); break; case ColorFXFilter::Vivid: d->levelInput->setRange(0, 50, 1); d->levelInput->setValue(5); d->iterationInput->setEnabled(false); d->iterationLabel->setEnabled(false); break; case ColorFXFilter::Neon: case ColorFXFilter::FindEdges: d->levelInput->setRange(0, 5, 1); d->levelInput->setValue(3); d->iterationInput->setEnabled(true); d->iterationLabel->setEnabled(true); d->iterationInput->setRange(0, 5, 1); d->iterationInput->setValue(2); break; } d->iterationInput->blockSignals(false); d->levelInput->blockSignals(false); emit signalSettingsChanged(); } ColorFXContainer ColorFXSettings::settings() const { ColorFXContainer prm; prm.colorFXType = d->effectType->currentIndex(); prm.level = d->levelInput->value(); prm.iterations = d->iterationInput->value(); prm.intensity = d->intensityInput->value(); prm.path = d->luts.value(d->correctionTools->currentId()); return prm; } void ColorFXSettings::setSettings(const ColorFXContainer& settings) { blockSignals(true); d->effectType->setCurrentIndex(settings.colorFXType); slotEffectTypeChanged(settings.colorFXType); d->levelInput->setValue(settings.level); d->iterationInput->setValue(settings.iterations); int filterId = d->luts.indexOf(settings.path); if (filterId == -1) { filterId = 0; } d->intensityInput->setValue(settings.intensity); d->correctionTools->setCurrentId(filterId); blockSignals(false); } void ColorFXSettings::resetToDefault() { setSettings(defaultSettings()); } ColorFXContainer ColorFXSettings::defaultSettings() const { return ColorFXContainer(); } void ColorFXSettings::readSettings(KConfigGroup& group) { ColorFXContainer prm; ColorFXContainer defaultPrm = defaultSettings(); prm.colorFXType = group.readEntry(d->configEffectTypeEntry, defaultPrm.colorFXType); prm.level = group.readEntry(d->configLevelAdjustmentEntry, defaultPrm.level); prm.iterations = group.readEntry(d->configIterationAdjustmentEntry, defaultPrm.iterations); prm.intensity = group.readEntry(d->configLut3DIntensityEntry, defaultPrm.intensity); prm.path = group.readEntry(d->configLut3DFilterEntry, defaultPrm.path); setSettings(prm); } void ColorFXSettings::writeSettings(KConfigGroup& group) { ColorFXContainer prm = settings(); group.writeEntry(d->configEffectTypeEntry, prm.colorFXType); group.writeEntry(d->configLevelAdjustmentEntry, prm.level); group.writeEntry(d->configIterationAdjustmentEntry, prm.iterations); group.writeEntry(d->configLut3DIntensityEntry, prm.intensity); group.writeEntry(d->configLut3DFilterEntry, prm.path); } void ColorFXSettings::findLuts() { QStringList dirpaths; dirpaths << QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("digikam/data/lut3d"), QStandardPaths::LocateDirectory); foreach (const QString& dirpath, dirpaths) { QDirIterator dirIt(dirpath, QDirIterator::Subdirectories); while (dirIt.hasNext()) { dirIt.next(); if (QFileInfo(dirIt.filePath()).isFile()) { d->luts << dirIt.filePath(); } } } d->luts.sort(); } QString ColorFXSettings::translateLuts(const QString& name) const { if (name.toLower() == QLatin1String("bleach")) { return i18n("Bleach"); } else if (name.toLower() == QLatin1String("blue_crush")) { return i18n("Blue Crush"); } else if (name.toLower() == QLatin1String("bw_contrast")) { return i18n("BW Contrast"); } else if (name.toLower() == QLatin1String("instant")) { return i18n("Instant"); } else if (name.toLower() == QLatin1String("original")) { return i18n("Original"); } else if (name.toLower() == QLatin1String("punch")) { return i18n("Punch"); } else if (name.toLower() == QLatin1String("summer")) { return i18n("Summer"); } else if (name.toLower() == QLatin1String("tokyo")) { return i18n("Tokyo"); } else if (name.toLower() == QLatin1String("vintage")) { return i18n("Vintage"); } else if (name.toLower() == QLatin1String("washout")) { return i18n("Washout"); } else if (name.toLower() == QLatin1String("washout_color")) { return i18n("Washout Color"); } else if (name.toLower() == QLatin1String("x_process")) { return i18n("X Process"); } return name; } } // namespace Digikam