Start of Fonts dialog for setting up subtitle fonts.
[dcpomatic.git] / src / wx / colour_conversion_editor.cc
index a4ec2341126788fca6321c583824032914e5e00f..129c6f2ea46e44c9483953e8bc0ac9a3dc79605a 100644 (file)
 #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;
 
@@ -77,9 +77,8 @@ ColourConversionEditor::ColourConversionEditor (wxWindow* parent)
 
        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);
@@ -93,31 +92,31 @@ ColourConversionEditor::ColourConversionEditor (wxWindow* parent)
        _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
@@ -150,3 +149,24 @@ ColourConversionEditor::changed ()
        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);
+}
+