diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index f2ea3f0b4..0d2c2961f 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -25,16 +25,30 @@ #include "guiutils.h" #include "rtimage.h" -#define MIN_RESET_BUTTON_HEIGHT 17 namespace { + +constexpr int MIN_RESET_BUTTON_HEIGHT = 17; + double one2one(double val) { return val; } } -Adjuster::Adjuster (Glib::ustring vlabel, double vmin, double vmax, double vstep, double vdefault, Gtk::Image *imgIcon1, Gtk::Image *imgIcon2, double2double_fun slider2value_, double2double_fun value2slider_) : +Adjuster::Adjuster ( + Glib::ustring vlabel, + double vmin, + double vmax, + double vstep, + double vdefault, + Gtk::Image *imgIcon1, + Gtk::Image *imgIcon2, + double2double_fun slider2value, + double2double_fun value2slider) + + : + adjustmentName(std::move(vlabel)), grid(nullptr), label(nullptr), @@ -52,8 +66,8 @@ Adjuster::Adjuster (Glib::ustring vlabel, double vmin, double vmax, double vstep logBase(0), logPivot(0), logAnchorMiddle(false), - value2slider(value2slider_ ? value2slider_ : one2one), - slider2value(slider2value_ ? slider2value_ : one2one), + value2slider(value2slider ? value2slider : &one2one), + slider2value(slider2value ? slider2value : &one2one), delay(options.adjusterMinDelay) { @@ -156,13 +170,12 @@ Adjuster::~Adjuster () delayConnection.block(true); adjusterListener = nullptr; - delete automatic; } -void Adjuster::addAutoButton (Glib::ustring tooltip) +void Adjuster::addAutoButton (const Glib::ustring &tooltip) { if (!automatic) { - automatic = new Gtk::CheckButton(); + automatic = Gtk::manage(new Gtk::CheckButton()); //automatic->add (*Gtk::manage (new RTImage ("gears.png"))); automatic->set_tooltip_markup(tooltip.length() ? Glib::ustring::compose("%1\n\n%2", M("GENERAL_AUTO"), tooltip) : M("GENERAL_AUTO")); setExpandAlignProperties(automatic, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); @@ -302,8 +315,8 @@ void Adjuster::resetPressed (GdkEventButton* event) double Adjuster::shapeValue (double a) const { - const double pow10 = pow(10.0, digits); - const double val = round(a * pow10) / pow10; + const double pow10 = std::pow(10.0, digits); + const double val = std::round(a * pow10) / pow10; return val == -0.0 ? 0.0 : val; } @@ -313,7 +326,7 @@ void Adjuster::setLimits (double vmin, double vmax, double vstep, double vdefaul spinChange.block(true); double pow10 = vstep; - for (digits = 0; fabs(pow10 - floor(pow10)) > 0.000000000001; digits++, pow10 *= 10.0); + for (digits = 0; std::fabs(pow10 - floor(pow10)) > 0.000000000001; digits++, pow10 *= 10.0); const double shapeVal = shapeValue(vdefault); spin->set_digits(digits); @@ -557,7 +570,6 @@ void Adjuster::showEditedCB () void Adjuster::editedToggled () { - if (adjusterListener && !blocked) { adjusterListener->adjusterChanged(this, spin->get_value()); } @@ -567,26 +579,20 @@ void Adjuster::editedToggled () void Adjuster::trimValue (double &val) const { - val = rtengine::LIM(val, vMin, vMax); - } void Adjuster::trimValue (int &val) const { - val = rtengine::LIM(val, vMin, vMax); - } void Adjuster::trimValue (float &val) const { - val = rtengine::LIM(val, vMin, vMax); - } -inline double Adjuster::getSliderValue() const +double Adjuster::getSliderValue() const { double val = slider->get_value(); if (logBase) { @@ -596,29 +602,28 @@ inline double Adjuster::getSliderValue() const if (val >= mmid) { double range = vMax - mmid; double x = (val - mmid) / range; - val = logPivot + (pow(logBase, x) - 1.0) / (logBase - 1.0) * (vMax - logPivot); + val = logPivot + (std::pow(logBase, x) - 1.0) / (logBase - 1.0) * (vMax - logPivot); } else { double range = mmid - vMin; double x = (mmid - val) / range; - val = logPivot - (pow(logBase, x) - 1.0) / (logBase - 1.0) * (logPivot - vMin); + val = logPivot - (std::pow(logBase, x) - 1.0) / (logBase - 1.0) * (logPivot - vMin); } } else { if (val >= logPivot) { double range = vMax - logPivot; double x = (val - logPivot) / range; - val = logPivot + (pow(logBase, x) - 1.0) / (logBase - 1.0) * range; + val = logPivot + (std::pow(logBase, x) - 1.0) / (logBase - 1.0) * range; } else { double range = logPivot - vMin; double x = (logPivot - val) / range; - val = logPivot - (pow(logBase, x) - 1.0) / (logBase - 1.0) * range; + val = logPivot - (std::pow(logBase, x) - 1.0) / (logBase - 1.0) * range; } } } return val; } - -inline void Adjuster::setSliderValue(double val) +void Adjuster::setSliderValue(double val) { if (logBase) { if (logAnchorMiddle) { @@ -626,28 +631,27 @@ inline void Adjuster::setSliderValue(double val) if (val >= logPivot) { double range = vMax - logPivot; double x = (val - logPivot) / range; - val = (vMin + mid) + log(x * (logBase - 1.0) + 1.0) / log(logBase) * mid; + val = (vMin + mid) + std::log(x * (logBase - 1.0) + 1.0) / std::log(logBase) * mid; } else { double range = logPivot - vMin; double x = (logPivot - val) / range; - val = (vMin + mid) - log(x * (logBase - 1.0) + 1.0) / log(logBase) * mid; + val = (vMin + mid) - std::log(x * (logBase - 1.0) + 1.0) / std::log(logBase) * mid; } } else { if (val >= logPivot) { double range = vMax - logPivot; double x = (val - logPivot) / range; - val = logPivot + log(x * (logBase - 1.0) + 1.0) / log(logBase) * range; + val = logPivot + std::log(x * (logBase - 1.0) + 1.0) / std::log(logBase) * range; } else { double range = logPivot - vMin; double x = (logPivot - val) / range; - val = logPivot - log(x * (logBase - 1.0) + 1.0) / log(logBase) * range; + val = logPivot - std::log(x * (logBase - 1.0) + 1.0) / std::log(logBase) * range; } } } slider->set_value(val); } - void Adjuster::setLogScale(double base, double pivot, bool anchorMiddle) { spinChange.block(true); @@ -662,3 +666,61 @@ void Adjuster::setLogScale(double base, double pivot, bool anchorMiddle) sliderChange.block(false); spinChange.block(false); } + +bool Adjuster::getAutoValue() const +{ + return automatic ? automatic->get_active() : false; +} + +void Adjuster::setAutoInconsistent(bool i) +{ + if (automatic) { + automatic->set_inconsistent(i); + } +} + +bool Adjuster::getAutoInconsistent() const +{ + return automatic ? automatic->get_inconsistent() : true /* we have to return something */; +} + +void Adjuster::setAdjusterListener (AdjusterListener* alistener) +{ + adjusterListener = alistener; +} + +double Adjuster::getValue() const +{ + return shapeValue(spin->get_value()); +} + +int Adjuster::getIntValue() const +{ + return spin->get_value_as_int(); +} + +Glib::ustring Adjuster::getTextValue() const +{ + if (addMode) { + return Glib::ustring::compose("%1", spin->get_text()); + } else { + return spin->get_text(); + } +} + +void Adjuster::setLabel(const Glib::ustring &lbl) +{ + label->set_label(lbl); +} + +bool Adjuster::block(bool isBlocked) +{ + bool oldValue = blocked; + blocked = isBlocked; + return oldValue; +} + +bool Adjuster::getAddMode() const +{ + return addMode; +} diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index 2f3b10b18..f57129bf1 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -83,87 +83,40 @@ public: int delay; - Adjuster (Glib::ustring vlabel, double vmin, double vmax, double vstep, double vdefault, Gtk::Image *imgIcon1 = nullptr, Gtk::Image *imgIcon2 = nullptr, double2double_fun slider2value_ = nullptr, double2double_fun value2slider_ = nullptr); + Adjuster (Glib::ustring vlabel, double vmin, double vmax, double vstep, double vdefault, Gtk::Image *imgIcon1 = nullptr, Gtk::Image *imgIcon2 = nullptr, double2double_fun slider2value = nullptr, double2double_fun value2slider = nullptr); ~Adjuster () override; // Add an "Automatic" checkbox next to the reset button. - void addAutoButton(Glib::ustring tooltip = ""); + void addAutoButton(const Glib::ustring &tooltip = ""); // Send back the value of og the Auto checkbox - bool getAutoValue () - { - return automatic ? automatic->get_active() : false; - } - void setAutoValue (bool a); - bool notifyListenerAutoToggled (); - void autoToggled (); - void setAutoInconsistent (bool i) - { - if (automatic) { - automatic->set_inconsistent(i); - } - } - bool getAutoInconsistent () const - { - return automatic ? automatic->get_inconsistent() : true /* we have to return something */; - } - - void setAdjusterListener (AdjusterListener* alistener) - { - adjusterListener = alistener; - } - + bool getAutoValue() const; + void setAutoValue(bool a); + bool notifyListenerAutoToggled(); + void autoToggled(); + void setAutoInconsistent(bool i); + bool getAutoInconsistent() const; + void setAdjusterListener(AdjusterListener* alistener); // return the value trimmed to the limits at construction time - double getValue () const - { - return shapeValue(spin->get_value()); - } + double getValue() const; // return the value trimmed to the limits at construction time - int getIntValue () const - { - return spin->get_value_as_int(); - } + int getIntValue() const; // return the value trimmed to the limits at construction time, // method only used by the history manager, so decoration is added if addMode=true - Glib::ustring getTextValue () const - { - if (addMode) { - return Glib::ustring::compose("%1", spin->get_text()); - } else { - return spin->get_text(); - } - } - - void setLabel (const Glib::ustring &lbl) - { - label->set_label(lbl); - } + Glib::ustring getTextValue() const; + void setLabel (const Glib::ustring &lbl); void setValue (double a); void setLimits (double vmin, double vmax, double vstep, double vdefault); void setEnabled (bool enabled); void setDefault (double def); // will let the adjuster throw it's "changed" signal when the mouse button is released. Can work altogether with the delay value. void throwOnButtonRelease(bool throwOnBRelease = true); - void setNbDisplayedChars (int nbr) - { - spin->set_width_chars(nbr); - spin->set_max_width_chars(nbr); - } void setEditedState (EditedState eState); EditedState getEditedState (); void setDefaultEditedState (EditedState eState); void showEditedCB (); - bool block(bool isBlocked) - { - bool oldValue = blocked; - blocked = isBlocked; - return oldValue; - } - + bool block(bool isBlocked); void setAddMode(bool addM); - bool getAddMode() const - { - return addMode; - }; + bool getAddMode() const; void spinChanged (); void sliderChanged (); bool notifyListener (); @@ -175,7 +128,6 @@ public: void trimValue (double &val) const; void trimValue (float &val) const; void trimValue (int &val) const; - void setLogScale(double base, double pivot, bool anchorMiddle = false); };