add locale-guard when saving engine states, also #6418
[ardour.git] / gtk2_ardour / stereo_panner.cc
index e3271db2ebadffa1ef434cc70bb8cd70cbc3ebab..ab057c91476ab90d8afee3d4c416232d27e09253 100644 (file)
@@ -37,6 +37,8 @@
 #include "ardour/panner.h"
 #include "ardour/panner_shell.h"
 
+#include "canvas/colors.h"
+
 #include "ardour_ui.h"
 #include "global_signals.h"
 #include "stereo_panner.h"
 using namespace std;
 using namespace Gtk;
 using namespace Gtkmm2ext;
-
-static const int pos_box_size = 8;
-static const int lr_box_size = 15;
-static const int step_down = 10;
-static const int top_step = 2;
+using namespace ARDOUR_UI_UTILS;
 
 StereoPanner::ColorScheme StereoPanner::colors[3];
 bool StereoPanner::have_colors = false;
@@ -86,18 +84,18 @@ StereoPanner::StereoPanner (boost::shared_ptr<PannerShell> p)
        if (!have_font) {
                Pango::FontDescription font;
                Pango::AttrFontDesc* font_attr;
-               font = Pango::FontDescription ("ArdourMono");
-               font.set_weight (Pango::WEIGHT_BOLD);
-               font.set_size(9 * PANGO_SCALE);
+               font = Pango::FontDescription (ARDOUR_UI::config()->get_SmallBoldMonospaceFont());
                font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
                panner_font_attributes.change(*font_attr);
                delete font_attr;
                have_font = true;
        }
 
-       position_control->Changed.connect (connections, invalidator(*this), boost::bind (&StereoPanner::value_change, this), gui_context());
-       width_control->Changed.connect (connections, invalidator(*this), boost::bind (&StereoPanner::value_change, this), gui_context());
-       _panner_shell->Changed.connect (connections, invalidator (*this), boost::bind (&StereoPanner::bypass_handler, this), gui_context());
+       position_control->Changed.connect (panvalue_connections, invalidator(*this), boost::bind (&StereoPanner::value_change, this), gui_context());
+       width_control->Changed.connect (panvalue_connections, invalidator(*this), boost::bind (&StereoPanner::value_change, this), gui_context());
+
+       _panner_shell->Changed.connect (panshell_connections, invalidator (*this), boost::bind (&StereoPanner::bypass_handler, this), gui_context());
+       _panner_shell->PannableChanged.connect (panshell_connections, invalidator (*this), boost::bind (&StereoPanner::pannable_handler, this), gui_context());
 
        ColorsChanged.connect (sigc::mem_fun (*this, &StereoPanner::color_handler));
 
@@ -147,13 +145,18 @@ StereoPanner::on_expose_event (GdkEventExpose*)
        const double pos = position_control->get_value (); /* 0..1 */
        const double swidth = width_control->get_value (); /* -1..+1 */
        const double fswidth = fabs (swidth);
-       const double corner_radius = 5.0;
        uint32_t o, f, t, b, r;
        State state;
 
        width = get_width();
        height = get_height ();
 
+       const int step_down = rint(height / 3.5);
+       const double corner_radius = 5.0 * ARDOUR_UI::ui_scale;
+       const int lr_box_size = height - 2 * step_down;
+       const int pos_box_size = (int)(rint(step_down * .8)) | 1;
+       const int top_step = step_down - pos_box_size;
+
        if (swidth == 0.0) {
                state = Mono;
        } else if (swidth < 0.0) {
@@ -176,6 +179,12 @@ StereoPanner::on_expose_event (GdkEventExpose*)
                r  = 0x606060ff;
        }
 
+       if (_send_mode) {
+               b = ARDOUR_UI::config()->color ("send bg");
+               // b = rgba_from_style("SendStripBase",
+               // UINT_RGBA_R(b), UINT_RGBA_G(b), UINT_RGBA_B(b), 255,
+               // "fg");
+       }
        /* background */
 
        context->set_source_rgba (UINT_RGBA_R_FLT(b), UINT_RGBA_G_FLT(b), UINT_RGBA_B_FLT(b), UINT_RGBA_A_FLT(b));
@@ -206,8 +215,6 @@ StereoPanner::on_expose_event (GdkEventExpose*)
        const double left  = center - pan_spread;
        const double right = center + pan_spread;
 
-       printf("L %.2f  R %.2f  PW:%.2f\n", left, right, pan_spread);
-
        /* center line */
        context->set_line_width (1.0);
        context->move_to ((usable_width + lr_box_size)/2.0, 0);
@@ -239,9 +246,9 @@ StereoPanner::on_expose_event (GdkEventExpose*)
                /* add text */
                context->set_source_rgba (UINT_RGBA_R_FLT(t), UINT_RGBA_G_FLT(t), UINT_RGBA_B_FLT(t), UINT_RGBA_A_FLT(t));
                if (swidth < 0.0) {
-                       layout->set_text (_("R"));
+                       layout->set_text (S_("Panner|R"));
                } else {
-                       layout->set_text (_("L"));
+                       layout->set_text (S_("Panner|L"));
                }
                layout->get_pixel_size(tw, th);
                context->move_to (rint(left - tw/2), rint(lr_box_size + step_down - th/2));
@@ -261,12 +268,12 @@ StereoPanner::on_expose_event (GdkEventExpose*)
        context->set_source_rgba (UINT_RGBA_R_FLT(t), UINT_RGBA_G_FLT(t), UINT_RGBA_B_FLT(t), UINT_RGBA_A_FLT(t));
 
        if (state == Mono) {
-               layout->set_text (_("M"));
+               layout->set_text (S_("Panner|M"));
        } else {
                if (swidth < 0.0) {
-                       layout->set_text (_("L"));
+                       layout->set_text (S_("Panner|L"));
                } else {
-                       layout->set_text (_("R"));
+                       layout->set_text (S_("Panner|R"));
                }
        }
        layout->get_pixel_size(tw, th);
@@ -405,6 +412,7 @@ StereoPanner::on_button_press_event (GdkEventButton* ev)
                        double pos = position_control->get_value (); /* 0..1 */
                        double swidth = width_control->get_value (); /* -1..+1 */
                        double fswidth = fabs (swidth);
+                       const int lr_box_size = get_height() - 2 * rint(get_height() / 3.5);
                        int usable_width = get_width() - lr_box_size;
                        double center = (lr_box_size/2.0) + (usable_width * pos);
                        int left = lrint (center - (fswidth * usable_width / 2.0)); // center of leftmost box
@@ -522,6 +530,7 @@ StereoPanner::on_motion_notify_event (GdkEventMotion* ev)
                return false;
        }
 
+       const int lr_box_size = get_height() - 2 * rint(get_height() / 3.5);
        int usable_width = get_width() - lr_box_size;
        double delta = (ev->x - last_drag_x) / (double) usable_width;
        double current_width = width_control->get_value ();
@@ -663,23 +672,24 @@ StereoPanner::on_key_press_event (GdkEventKey* ev)
 void
 StereoPanner::set_colors ()
 {
-       colors[Normal].fill = ARDOUR_UI::config()->canvasvar_StereoPannerFill.get();
-       colors[Normal].outline = ARDOUR_UI::config()->canvasvar_StereoPannerOutline.get();
-       colors[Normal].text = ARDOUR_UI::config()->canvasvar_StereoPannerText.get();
-       colors[Normal].background = ARDOUR_UI::config()->canvasvar_StereoPannerBackground.get();
-       colors[Normal].rule = ARDOUR_UI::config()->canvasvar_StereoPannerRule.get();
-
-       colors[Mono].fill = ARDOUR_UI::config()->canvasvar_StereoPannerMonoFill.get();
-       colors[Mono].outline = ARDOUR_UI::config()->canvasvar_StereoPannerMonoOutline.get();
-       colors[Mono].text = ARDOUR_UI::config()->canvasvar_StereoPannerMonoText.get();
-       colors[Mono].background = ARDOUR_UI::config()->canvasvar_StereoPannerMonoBackground.get();
-       colors[Mono].rule = ARDOUR_UI::config()->canvasvar_StereoPannerRule.get();
-
-       colors[Inverted].fill = ARDOUR_UI::config()->canvasvar_StereoPannerInvertedFill.get();
-       colors[Inverted].outline = ARDOUR_UI::config()->canvasvar_StereoPannerInvertedOutline.get();
-       colors[Inverted].text = ARDOUR_UI::config()->canvasvar_StereoPannerInvertedText.get();
-       colors[Inverted].background = ARDOUR_UI::config()->canvasvar_StereoPannerInvertedBackground.get();
-       colors[Inverted].rule = ARDOUR_UI::config()->canvasvar_StereoPannerRule.get();
+       colors[Normal].fill = ARDOUR_UI::config()->color_mod ("stereo panner fill", "panner fill");
+       // colors[Normal].outline = ARDOUR_UI::config()->color ("stereo panner outline");
+       colors[Normal].outline = ArdourCanvas::HSV (colors[Normal].fill).outline().color ();
+       colors[Normal].text = ARDOUR_UI::config()->color ("stereo panner text");
+       colors[Normal].background = ARDOUR_UI::config()->color ("stereo panner bg");
+       colors[Normal].rule = ARDOUR_UI::config()->color ("stereo panner rule");
+
+       colors[Mono].fill = ARDOUR_UI::config()->color ("stereo panner mono fill");
+       colors[Mono].outline = ARDOUR_UI::config()->color ("stereo panner mono outline");
+       colors[Mono].text = ARDOUR_UI::config()->color ("stereo panner mono text");
+       colors[Mono].background = ARDOUR_UI::config()->color ("stereo panner mono bg");
+       colors[Mono].rule = ARDOUR_UI::config()->color ("stereo panner rule");
+
+       colors[Inverted].fill = ARDOUR_UI::config()->color_mod ("stereo panner inverted fill", "stereo panner inverted");
+       colors[Inverted].outline = ARDOUR_UI::config()->color ("stereo panner inverted outline");
+       colors[Inverted].text = ARDOUR_UI::config()->color ("stereo panner inverted text");
+       colors[Inverted].background = ARDOUR_UI::config()->color_mod ("stereo panner inverted bg", "stereo panner inverted bg");
+       colors[Inverted].rule = ARDOUR_UI::config()->color ("stereo panner rule");
 }
 
 void
@@ -695,6 +705,20 @@ StereoPanner::bypass_handler ()
        queue_draw ();
 }
 
+void
+StereoPanner::pannable_handler ()
+{
+       panvalue_connections.drop_connections();
+       position_control = _panner->pannable()->pan_azimuth_control;
+       width_control = _panner->pannable()->pan_width_control;
+       position_binder.set_controllable(position_control);
+       width_binder.set_controllable(width_control);
+
+       position_control->Changed.connect (panvalue_connections, invalidator(*this), boost::bind (&StereoPanner::value_change, this), gui_context());
+       width_control->Changed.connect (panvalue_connections, invalidator(*this), boost::bind (&StereoPanner::value_change, this), gui_context());
+       queue_draw ();
+}
+
 PannerEditor*
 StereoPanner::editor ()
 {