don't display elevation if panner does not support it.
authorRobin Gareus <robin@gareus.org>
Sun, 12 Jan 2014 02:56:35 +0000 (03:56 +0100)
committerRobin Gareus <robin@gareus.org>
Sun, 12 Jan 2014 02:56:35 +0000 (03:56 +0100)
gtk2_ardour/panner2d.cc
gtk2_ardour/panner2d.h

index 941b37182732435ebe1156f4a68e9d0443843baf..1be1371ab87fb439671aac4995a4a4f006314b10 100644 (file)
@@ -74,6 +74,7 @@ Panner2d::Panner2d (boost::shared_ptr<PannerShell> p, int32_t h)
         , width (0)
         , height (h)
         , last_width (0)
+        , have_elevation (false)
 {
        panner_shell->Changed.connect (connections, invalidator (*this), boost::bind (&Panner2d::handle_state_change, this), gui_context());
 
@@ -82,6 +83,7 @@ Panner2d::Panner2d (boost::shared_ptr<PannerShell> p, int32_t h)
        drag_target = 0;
        set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
 
+       handle_state_change ();
        handle_position_change ();
 }
 
@@ -200,6 +202,14 @@ Panner2d::handle_state_change ()
 {
        panconnect.drop_connections();
        panner_shell->panner()->SignalPositionChanged.connect (panconnect, invalidator(*this), boost::bind (&Panner2d::handle_position_change, this), gui_context());
+
+        set<Evoral::Parameter> params = panner_shell->panner()->what_can_be_automated();
+        set<Evoral::Parameter>::iterator p = params.find(PanElevationAutomation);
+        bool elev = have_elevation;
+        have_elevation = (p == params.end()) ? false : true;
+        if (elev != have_elevation) {
+                handle_position_change();
+        }
        queue_draw ();
 }
 
@@ -237,8 +247,12 @@ Panner2d::handle_position_change ()
        uint32_t n;
         double w = panner_shell->pannable()->pan_width_control->get_value();
 
-        position.position = AngularVector (panner_shell->pannable()->pan_azimuth_control->get_value() * 360.0,
-                                           panner_shell->pannable()->pan_elevation_control->get_value() * 90.0);
+        if (have_elevation) {
+                position.position = AngularVector (panner_shell->pannable()->pan_azimuth_control->get_value() * 360.0,
+                                                   panner_shell->pannable()->pan_elevation_control->get_value() * 90.0);
+        } else {
+                position.position = AngularVector (panner_shell->pannable()->pan_azimuth_control->get_value() * 360.0, 0);
+        }
 
         for (uint32_t i = 0; i < signals.size(); ++i) {
                 signals[i]->position = panner_shell->panner()->signal_position (i);
@@ -480,7 +494,9 @@ Panner2d::on_expose_event (GdkEventExpose *event)
 
                                 if (signal->visible) {
 
-                                        signal->position.cartesian (c);
+                                        PBD::AngularVector sp = signal->position;
+                                        if (!have_elevation) sp.ele = 0;
+                                        sp.cartesian (c);
                                         cart_to_gtk (c);
 
                                         cairo_new_path (cr);
@@ -607,11 +623,8 @@ Panner2d::on_button_press_event (GdkEventButton *ev)
                         }
                }
 
-               drag_x = ev->x;
-               drag_y = ev->y;
                state = (GdkModifierType) ev->state;
-
-               return handle_motion (drag_x, drag_y, state);
+               return handle_motion (ev->x, ev->y, state);
                break;
 
        default:
@@ -686,14 +699,11 @@ Panner2d::handle_motion (gint evx, gint evy, GdkModifierType state)
                }
 
                if (need_move) {
-                       set<Evoral::Parameter> params = panner_shell->panner()->what_can_be_automated();
-                       set<Evoral::Parameter>::iterator p = params.find(PanElevationAutomation);
-
                        CartesianVector cp (evx, evy, 0.0);
                        AngularVector av;
                        gtk_to_cart (cp);
 
-                       if (p == params.end()) {
+                       if (!have_elevation) {
                                clamp_to_circle (cp.x, cp.y);
                                cp.angular (av);
                                if (drag_target == &position) {
index 033b5711bcff80ceb2b7966b2bc073912ea960da..cd84ad9e2c5918d26aec616bad5757c21097cdbb 100644 (file)
@@ -108,9 +108,6 @@ class Panner2d : public Gtk::DrawingArea
         Target  position;
 
        Target *drag_target;
-       int     drag_x;
-       int     drag_y;
-       bool    allow_speaker_motion;
        int     width;
        int     height;
         double  radius;
@@ -119,9 +116,7 @@ class Panner2d : public Gtk::DrawingArea
         double  voffset;
         double  last_width;
        bool    did_move;
-
-       gint compute_x (float);
-       gint compute_y (float);
+       bool    have_elevation;
 
        Target *find_closest_object (gdouble x, gdouble y, bool& is_signal);