rawTherapee/rtgui/gradient.cc

181 lines
6.0 KiB
C++

/*
* This file is part of RawTherapee.
*/
#include "gradient.h"
#include <iomanip>
using namespace rtengine;
using namespace rtengine::procparams;
Gradient::Gradient () : Gtk::VBox(), FoldableToolPanel(this)
{
set_border_width(4);
enabled = Gtk::manage (new Gtk::CheckButton (M("GENERAL_ENABLED")));
enabled->set_active (false);
enaConn = enabled->signal_toggled().connect( sigc::mem_fun(*this, &Gradient::enabledChanged) );
strength = Gtk::manage (new Adjuster (M("TP_GRADIENT_STRENGTH"), -5, 5, 0.01, 0));
strength->set_tooltip_text (M("TP_GRADIENT_STRENGTH_TOOLTIP"));
strength->setAdjusterListener (this);
degree = Gtk::manage (new Adjuster (M("TP_GRADIENT_DEGREE"), -180, 180, 1, 0));
degree->set_tooltip_text (M("TP_GRADIENT_DEGREE_TOOLTIP"));
degree->setAdjusterListener (this);
feather = Gtk::manage (new Adjuster (M("TP_GRADIENT_FEATHER"), 0, 100, 1, 25));
feather->set_tooltip_text (M("TP_GRADIENT_FEATHER_TOOLTIP"));
feather->setAdjusterListener (this);
centerX = Gtk::manage (new Adjuster (M("TP_GRADIENT_CENTER_X"), -100, 100, 1, 0));
centerX->set_tooltip_text (M("TP_GRADIENT_CENTER_X_TOOLTIP"));
centerX->setAdjusterListener (this);
centerY = Gtk::manage (new Adjuster (M("TP_GRADIENT_CENTER_Y"), -100, 100, 1, 0));
centerY->set_tooltip_text (M("TP_GRADIENT_CENTER_Y_TOOLTIP"));
centerY->setAdjusterListener (this);
pack_start(*enabled);
pack_start(*Gtk::manage (new Gtk::HSeparator()), Gtk::PACK_EXPAND_WIDGET, 4);
pack_start (*strength);
pack_start (*degree);
pack_start (*feather);
pack_start (*centerX);
pack_start (*centerY);
show_all();
}
void Gradient::read (const ProcParams* pp, const ParamsEdited* pedited)
{
disableListener ();
if (pedited) {
degree->setEditedState (pedited->gradient.degree ? Edited : UnEdited);
feather->setEditedState (pedited->gradient.feather ? Edited : UnEdited);
strength->setEditedState (pedited->gradient.strength ? Edited : UnEdited);
centerX->setEditedState (pedited->gradient.centerX ? Edited : UnEdited);
centerY->setEditedState (pedited->gradient.centerY ? Edited : UnEdited);
enabled->set_inconsistent (!pedited->gradient.enabled);
}
enaConn.block (true);
enabled->set_active (pp->gradient.enabled);
enaConn.block (false);
degree->setValue (pp->gradient.degree);
feather->setValue (pp->gradient.feather);
strength->setValue (pp->gradient.strength);
centerX->setValue (pp->gradient.centerX);
centerY->setValue (pp->gradient.centerY);
lastEnabled = pp->gradient.enabled;
enableListener ();
}
void Gradient::write (ProcParams* pp, ParamsEdited* pedited)
{
pp->gradient.degree = degree->getValue ();
pp->gradient.feather = feather->getIntValue ();
pp->gradient.strength = strength->getValue ();
pp->gradient.centerX = centerX->getIntValue ();
pp->gradient.centerY = centerY->getIntValue ();
pp->gradient.enabled = enabled->get_active();
if (pedited) {
pedited->gradient.degree = degree->getEditedState ();
pedited->gradient.feather = feather->getEditedState ();
pedited->gradient.strength = strength->getEditedState ();
pedited->gradient.centerX = centerX->getEditedState ();
pedited->gradient.centerY = centerY->getEditedState ();
pedited->gradient.enabled = !enabled->get_inconsistent();
}
}
void Gradient::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited)
{
degree->setDefault (defParams->gradient.degree);
feather->setDefault (defParams->gradient.feather);
strength->setDefault (defParams->gradient.strength);
centerX->setDefault (defParams->gradient.centerX);
centerY->setDefault (defParams->gradient.centerY);
if (pedited) {
degree->setDefaultEditedState (pedited->gradient.degree ? Edited : UnEdited);
feather->setDefaultEditedState (pedited->gradient.feather ? Edited : UnEdited);
strength->setDefaultEditedState (pedited->gradient.strength ? Edited : UnEdited);
centerX->setDefaultEditedState (pedited->gradient.centerX ? Edited : UnEdited);
centerY->setDefaultEditedState (pedited->gradient.centerY ? Edited : UnEdited);
} else {
degree->setDefaultEditedState (Irrelevant);
feather->setDefaultEditedState (Irrelevant);
strength->setDefaultEditedState (Irrelevant);
centerX->setDefaultEditedState (Irrelevant);
centerY->setDefaultEditedState (Irrelevant);
}
}
void Gradient::adjusterChanged (Adjuster* a, double newval) {
if (listener && enabled->get_active()) {
if (a == degree)
listener->panelChanged (EvGradientDegree, degree->getTextValue());
else if (a == feather)
listener->panelChanged (EvGradientFeather, feather->getTextValue());
else if (a == strength)
listener->panelChanged (EvGradientStrength, strength->getTextValue());
else if (a == centerX || a == centerY)
listener->panelChanged (EvGradientCenter, Glib::ustring::compose ("X=%1\nY=%2", centerX->getTextValue(), centerY->getTextValue()));
}
}
void Gradient::enabledChanged () {
if (batchMode) {
if (enabled->get_inconsistent()) {
enabled->set_inconsistent (false);
enaConn.block (true);
enabled->set_active (false);
enaConn.block (false);
}
else if (lastEnabled)
enabled->set_inconsistent (true);
lastEnabled = enabled->get_active ();
}
if (listener) {
if (enabled->get_active())
listener->panelChanged (EvGradientEnabled, M("GENERAL_ENABLED"));
else
listener->panelChanged (EvGradientEnabled, M("GENERAL_DISABLED"));
}
}
void Gradient::setAdjusterBehavior (bool degreeadd, bool featheradd, bool strengthadd, bool centeradd)
{
degree->setAddMode(degreeadd);
feather->setAddMode(featheradd);
strength->setAddMode(strengthadd);
centerX->setAddMode(centeradd);
centerY->setAddMode(centeradd);
}
void Gradient::trimValues (rtengine::procparams::ProcParams* pp)
{
degree->trimValue(pp->gradient.degree);
feather->trimValue(pp->gradient.feather);
strength->trimValue(pp->gradient.strength);
centerX->trimValue(pp->gradient.centerX);
centerY->trimValue(pp->gradient.centerY);
}
void Gradient::setBatchMode (bool batchMode)
{
ToolPanel::setBatchMode (batchMode);
degree->showEditedCB ();
feather->showEditedCB ();
strength->showEditedCB ();
centerX->showEditedCB ();
centerY->showEditedCB ();
}