Patch from Lincoln (#3319) to make the range selection box not display trim handles...
[ardour.git] / gtk2_ardour / panner2d.cc
index 91ca15b7b7d74cb9cedb060cfec34b7e3f789de1..6b6aed80d9e933bc34ce541f73d7575323564efc 100644 (file)
@@ -24,8 +24,8 @@
 #include <cairo.h>
 #include <gtkmm/menu.h>
 
-#include <pbd/error.h>
-#include <ardour/panner.h>
+#include "pbd/error.h"
+#include "ardour/panner.h"
 #include <gtkmm2ext/gtk_ui.h>
 
 #include "panner2d.h"
@@ -36,9 +36,9 @@
 
 using namespace std;
 using namespace Gtk;
-using namespace sigc;
 using namespace ARDOUR;
 using namespace PBD;
+using Gtkmm2ext::Keyboard;
 
 Panner2d::Target::Target (float xa, float ya, const char *txt)
        : x (xa, 0.0, 1.0, 0.01, 0.1)
@@ -50,7 +50,7 @@ Panner2d::Target::Target (float xa, float ya, const char *txt)
 }
 
 Panner2d::Target::~Target ()
-{ 
+{
        if (text) {
                free (text);
        }
@@ -65,16 +65,16 @@ Panner2d::Target::set_text (const char* txt)
        text = strdup (txt);
 }
 
-Panner2d::Panner2d (Panner& p, int32_t h)
+Panner2d::Panner2d (boost::shared_ptr<Panner> p, int32_t h)
        : panner (p), width (0), height (h)
 {
        allow_x = false;
        allow_y = false;
        allow_target = false;
 
-       panner.StateChanged.connect (mem_fun(*this, &Panner2d::handle_state_change));
-       panner.Changed.connect (mem_fun(*this, &Panner2d::handle_position_change));
-       
+       panner->StateChanged.connect (state_connection, invalidator (*this), boost::bind (&Panner2d::handle_state_change, this), gui_context());
+       panner->Changed.connect (change_connection, invalidator (*this), boost::bind (&Panner2d::handle_position_change, this), gui_context());
+
        drag_target = 0;
        set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
 }
@@ -96,7 +96,7 @@ Panner2d::reset (uint32_t n_inputs)
        while (pucks.size() < n_inputs) {
                add_puck ("", 0.0, 0.0);
        }
-       
+
        while (pucks.size() > n_inputs) {
                pucks.erase (pucks.begin());
        }
@@ -108,54 +108,40 @@ Panner2d::reset (uint32_t n_inputs)
        switch (n_inputs) {
        case 0:
                break;
-               
+
        case 1:
                pucks[0]->set_text ("");
-               pucks[0]->x.set_value (0.0);
-               pucks[0]->y.set_value (0.5);
-               pucks[0]->visible = true;
                break;
-               
+
        case 2:
                pucks[0]->set_text ("R");
-               if (existing_pucks < 0) {
-                       pucks[0]->x.set_value (0.5f);
-                       pucks[1]->y.set_value (0.25f);
-               }
-               pucks[0]->visible = true;
                pucks[1]->set_text ("L");
-               if (existing_pucks < 2) {
-                       pucks[1]->x.set_value (0.25f);
-                       pucks[1]->y.set_value (0.5f);
-               }
-               pucks[1]->visible = true;
                break;
-               
+
        default:
                for (uint32_t i = 0; i < n_inputs; ++i) {
                        char buf[64];
                        snprintf (buf, sizeof (buf), "%" PRIu32, i);
                        pucks[i]->set_text (buf);
-                       
-                       if (existing_pucks < i) {
-                               float x, y;
-                               panner.streampanner (i).get_position (x, y);
-                               pucks[i]->x.set_value (x);
-                               pucks[i]->y.set_value (y);
-                       }
-
-                       pucks[i]->visible = true;
                }
                break;
        }
-       
+
+       for (uint32_t i = existing_pucks; i < n_inputs; ++i) {
+               float x, y;
+               panner->streampanner (i).get_position (x, y);
+               pucks[i]->x.set_value (x);
+               pucks[i]->y.set_value (y);
+               pucks[i]->visible = true;
+       }
+
        /* add all outputs */
-       
-       while (targets.size() < panner.nouts()) {
+
+       while (targets.size() < panner->nouts()) {
                add_target (0.0, 0.0);
        }
-       
-       while (targets.size() > panner.nouts()) {
+
+       while (targets.size() > panner->nouts()) {
                targets.erase (targets.begin());
        }
 
@@ -163,16 +149,16 @@ Panner2d::reset (uint32_t n_inputs)
                (*x).second->visible = false;
        }
 
-       for (uint32_t n = 0; n < panner.nouts(); ++n) {
+       for (uint32_t n = 0; n < panner->nouts(); ++n) {
                char buf[16];
 
                snprintf (buf, sizeof (buf), "%d", n+1);
                targets[n]->set_text (buf);
-               targets[n]->x.set_value (panner.output(n).x);
-               targets[n]->y.set_value (panner.output(n).y);
+               targets[n]->x.set_value (panner->output(n).x);
+               targets[n]->y.set_value (panner->output(n).y);
                targets[n]->visible = true;
        }
-       
+
        allow_x_motion (true);
        allow_y_motion (true);
        allow_target_motion (true);
@@ -212,7 +198,7 @@ Panner2d::add_puck (const char* text, float x, float y)
 
        pucks.insert (newpair);
        puck->visible = true;
-       
+
        return 0;
 }
 
@@ -261,12 +247,12 @@ Panner2d::remove_target (int which)
                targets.erase (i);
                queue_draw ();
        }
-}              
+}
 
 void
 Panner2d::handle_state_change ()
 {
-       ENSURE_GUI_THREAD(mem_fun(*this, &Panner2d::handle_state_change));
+       ENSURE_GUI_THREAD (*this, &Panner2d::handle_state_change)
 
        queue_draw ();
 }
@@ -275,18 +261,18 @@ void
 Panner2d::handle_position_change ()
 {
        uint32_t n;
-       ENSURE_GUI_THREAD(mem_fun(*this, &Panner2d::handle_position_change));
+       ENSURE_GUI_THREAD (*this, &Panner2d::handle_position_change)
 
        for (n = 0; n < pucks.size(); ++n) {
                float x, y;
-               panner.streampanner(n).get_position (x, y);
+               panner->streampanner(n).get_position (x, y);
                pucks[n]->x.set_value (x);
                pucks[n]->y.set_value (y);
        }
 
        for (n = 0; n < targets.size(); ++n) {
-               targets[n]->x.set_value (panner.output(n).x);
-               targets[n]->y.set_value (panner.output(n).y);
+               targets[n]->x.set_value (panner->output(n).x);
+               targets[n]->y.set_value (panner->output(n).y);
        }
 
        queue_draw ();
@@ -306,10 +292,10 @@ Panner2d::move_target (int which, float x, float y)
                target = i->second;
                target->x.set_value (x);
                target->y.set_value (y);
-               
+
                queue_draw ();
        }
-}              
+}
 
 void
 Panner2d::move_puck (int which, float x, float y)
@@ -321,10 +307,10 @@ Panner2d::move_puck (int which, float x, float y)
                target = i->second;
                target->x.set_value (x);
                target->y.set_value (y);
-               
+
                queue_draw ();
        }
-}              
+}
 
 void
 Panner2d::show_puck (int which)
@@ -426,9 +412,9 @@ Panner2d::find_closest_object (gdouble x, gdouble y, int& which, bool& is_puck)
                        which = pwhich;
                }
        }
-       
+
        return closest;
-}              
+}
 
 bool
 Panner2d::on_motion_notify_event (GdkEventMotion *ev)
@@ -458,7 +444,7 @@ Panner2d::on_expose_event (GdkEventExpose *event)
        cairo_set_line_width (cr, 1.0);
 
        cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
-       if (!panner.bypassed()) {
+       if (!panner->bypassed()) {
                cairo_set_source_rgba (cr, 0.1, 0.1, 0.1, 1.0);
        } else {
                cairo_set_source_rgba (cr, 0.1, 0.1, 0.1, 0.2);
@@ -482,7 +468,7 @@ Panner2d::on_expose_event (GdkEventExpose *event)
        cairo_arc (cr, height/2, height/2, height/2, 0, 2.0 * M_PI);
        cairo_stroke (cr);
 
-       if (!panner.bypassed()) {
+       if (!panner->bypassed()) {
                float arc_radius;
 
                cairo_select_font_face (cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
@@ -501,28 +487,28 @@ Panner2d::on_expose_event (GdkEventExpose *event)
 
                        if (puck->visible) {
                                /* redraw puck */
-                               
+
                                fx = min (puck->x.get_value(), 1.0);
                                fx = max (fx, -1.0f);
                                x = (gint) floor (width * fx - 4);
-                               
+
                                fy = min (puck->y.get_value(), 1.0);
                                fy = max (fy, -1.0f);
                                y = (gint) floor (height * fy - 4);
-                               
+
                                cairo_arc (cr, x, y, arc_radius, 0, 2.0 * M_PI);
                                cairo_set_source_rgb (cr, 0.8, 0.2, 0.1);
                                cairo_close_path (cr);
                                cairo_fill (cr);
 
                                /* arrow */
-                               
+
                                if (height > 100.0f) {
 
                                        float endx, endy;
                                        endx = x;
                                        endy = y;
-                                       
+
                                        cairo_save (cr);
                                        cairo_translate (cr, x, y);
                                        cairo_rotate (cr, puck->azimuth.get_value());
@@ -537,9 +523,9 @@ Panner2d::on_expose_event (GdkEventExpose *event)
                                        cairo_move_to (cr, 0.0, 0.0);
                                        cairo_line_to (cr, endx, endy);
                                        cairo_stroke (cr);
-                                       
+
                                        /* arrow head */
-                                       
+
                                        cairo_move_to (cr, endx - 10.0, endy + 10.0);
                                        cairo_line_to (cr, endx, endy);
                                        cairo_line_to (cr, endx - 10.0, endy - 10.0);
@@ -555,7 +541,7 @@ Panner2d::on_expose_event (GdkEventExpose *event)
                }
 
                /* redraw any visible targets */
-               
+
                int n = 0;
 
                for (Targets::iterator i = targets.begin(); i != targets.end(); ++i) {
@@ -564,11 +550,11 @@ Panner2d::on_expose_event (GdkEventExpose *event)
                        ++n;
 
                        if (target->visible) {
-                               
+
                                fx = min (target->x.get_value(), 1.0);
                                fx = max (fx, -1.0f);
                                x = (gint) floor (width  * fx);
-                       
+
                                fy = min (target->y.get_value(), 1.0);
                                fy = max (fy, -1.0f);
                                y = (gint) floor (height * fy);
@@ -612,7 +598,7 @@ Panner2d::on_button_press_event (GdkEventButton *ev)
        default:
                break;
        }
-       
+
        return FALSE;
 }
 
@@ -633,7 +619,7 @@ Panner2d::on_button_release_event (GdkEventButton *ev)
 
 
                        for (Targets::iterator i = pucks.begin(); i != pucks.end(); ++i) {
-                               Target* puck = i->second;
+                               //Target* puck = i->second;
 
                                /* XXX DO SOMETHING TO SET PUCK BACK TO "normal" */
                        }
@@ -645,7 +631,7 @@ Panner2d::on_button_release_event (GdkEventButton *ev)
                } else {
                        ret = handle_motion (x, y, state);
                }
-               
+
                drag_target = 0;
                break;
 
@@ -660,7 +646,7 @@ Panner2d::on_button_release_event (GdkEventButton *ev)
                } else {
                        ret = handle_motion (x, y, state);
                }
-               
+
                drag_target = 0;
                break;
 
@@ -703,7 +689,7 @@ Panner2d::handle_motion (gint evx, gint evy, GdkModifierType state)
                                need_move = true;
                        }
                }
-               
+
                if (allow_y || drag_is_puck) {
                        float new_y;
                        y = min (evy, height - 1);
@@ -714,21 +700,22 @@ Panner2d::handle_motion (gint evx, gint evy, GdkModifierType state)
                                need_move = true;
                        }
                }
-               
+
                if (need_move) {
-                       
+
                        if (drag_is_puck) {
-                               
-                               panner.streampanner(drag_index).set_position (drag_target->x.get_value(), drag_target->y.get_value(), false);
-                               
+
+                               panner->streampanner(drag_index).set_position (
+                                               drag_target->x.get_value(), drag_target->y.get_value(), false);
+
                        } else {
-                               
+
                                TargetMoved (drag_index);
                        }
 
                        queue_draw ();
                }
-               
+
 
        } else if ((state & GDK_BUTTON2_MASK) && !(state & GDK_BUTTON1_MASK)) {
 
@@ -738,7 +725,7 @@ Panner2d::handle_motion (gint evx, gint evy, GdkModifierType state)
 
                int xdelta = drag_x - evx;
                int ydelta = drag_x - evy;
-               
+
                drag_target->azimuth.set_value (drag_target->azimuth.get_value() + (2 * M_PI) * ((float)ydelta)/height * ((float) -xdelta)/height);
                queue_draw ();
        }
@@ -749,7 +736,7 @@ Panner2d::handle_motion (gint evx, gint evy, GdkModifierType state)
 void
 Panner2d::toggle_bypass ()
 {
-       panner.set_bypassed (!panner.bypassed());
+       panner->set_bypassed (!panner->bypassed());
 }
 
 void
@@ -770,7 +757,7 @@ Panner2d::allow_y_motion (bool yn)
        allow_y = yn;
 }
 
-Panner2dWindow::Panner2dWindow (Panner&p, int32_t h, uint32_t inputs)
+Panner2dWindow::Panner2dWindow (boost::shared_ptr<Panner> p, int32_t h, uint32_t inputs)
        : widget (p, h)
        , reset_button (_("Reset"))
        , bypass_button (_("Bypass"))
@@ -780,7 +767,7 @@ Panner2dWindow::Panner2dWindow (Panner&p, int32_t h, uint32_t inputs)
 
        set_title (_("Panner"));
        widget.set_size_request (h, h);
-       
+
        button_box.set_spacing (6);
        button_box.pack_start (reset_button, false, false);
        button_box.pack_start (bypass_button, false, false);
@@ -804,7 +791,7 @@ Panner2dWindow::Panner2dWindow (Panner&p, int32_t h, uint32_t inputs)
        hpacker.pack_start (widget, false, false);
        hpacker.pack_start (left_side, false, false);
        hpacker.show ();
-       
+
        add (hpacker);
        reset (inputs);
        widget.show ();