#include <wx/spinctrl.h>
#include <wx/gbsizer.h>
#include "lib/colour_conversion.h"
+#include "lib/safe_stringstream.h"
#include "wx_util.h"
#include "colour_conversion_editor.h"
using std::string;
using std::cout;
-using std::stringstream;
using boost::shared_ptr;
using boost::lexical_cast;
add_label_to_grid_bag_sizer (table, this, _("Output gamma"), true, wxGBPosition (r, 0));
wxBoxSizer* output_sizer = new wxBoxSizer (wxHORIZONTAL);
- /* TRANSLATORS: this means the mathematical reciprocal operation, i.e. we are dividing 1 by the control that
- comes after it.
- */
+ /// TRANSLATORS: this means the mathematical reciprocal operation, i.e. we are dividing 1 by the control that
+ /// comes after it.
add_label_to_sizer (output_sizer, this, _("1 / "), false);
_output_gamma = new wxSpinCtrlDouble (this);
output_sizer->Add (_output_gamma);
_output_gamma->SetDigits (2);
_output_gamma->SetIncrement (0.1);
- _input_gamma->Bind (wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, boost::bind (&ColourConversionEditor::changed, this));
+ _input_gamma->Bind (wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, boost::bind (&ColourConversionEditor::changed, this, _input_gamma));
_input_gamma_linearised->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&ColourConversionEditor::changed, this));
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
_matrix[i][j]->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::changed, this));
}
}
- _output_gamma->Bind (wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, boost::bind (&ColourConversionEditor::changed, this));
+ _output_gamma->Bind (wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, boost::bind (&ColourConversionEditor::changed, this, _output_gamma));
}
void
ColourConversionEditor::set (ColourConversion conversion)
{
- _input_gamma->SetValue (conversion.input_gamma);
+ set_spin_ctrl (_input_gamma, conversion.input_gamma);
_input_gamma_linearised->SetValue (conversion.input_gamma_linearised);
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
- stringstream s;
+ SafeStringStream s;
s.setf (std::ios::fixed, std::ios::floatfield);
s.precision (7);
s << conversion.matrix (i, j);
_matrix[i][j]->SetValue (std_to_wx (s.str ()));
}
}
- _output_gamma->SetValue (conversion.output_gamma);
+ set_spin_ctrl (_output_gamma, conversion.output_gamma);
}
ColourConversion
Changed ();
}
+void
+ColourConversionEditor::changed (wxSpinCtrlDouble* sc)
+{
+ /* On OS X, it seems that in some cases when a wxSpinCtrlDouble loses focus
+ it emits an erroneous changed signal, which messes things up.
+ Check for that here.
+ */
+ if (fabs (_last_spin_ctrl_value[sc] - sc->GetValue()) < 1e-3) {
+ return;
+ }
+
+ Changed ();
+}
+
+void
+ColourConversionEditor::set_spin_ctrl (wxSpinCtrlDouble* control, double value)
+{
+ _last_spin_ctrl_value[control] = value;
+ control->SetValue (value);
+}
+