Fix up confusion with relayering after movement drags in
[ardour.git] / gtk2_ardour / stereo_panner.cc
index 7fe204fbfda52e3772d61135971bdd7a3704d60c..43fae05e7b3e349cb2187a2de54b10b217f1124e 100644 (file)
@@ -57,10 +57,9 @@ bool StereoPanner::have_colors = false;
 using namespace ARDOUR;
 
 StereoPanner::StereoPanner (boost::shared_ptr<Panner> panner)
-       : _panner (panner)
+       : PannerInterface (panner)
        , position_control (_panner->pannable()->pan_azimuth_control)
        , width_control (_panner->pannable()->pan_width_control)
-       , dragging (false)
        , dragging_position (false)
        , dragging_left (false)
        , dragging_right (false)
@@ -68,8 +67,6 @@ StereoPanner::StereoPanner (boost::shared_ptr<Panner> panner)
        , last_drag_x (0)
        , accumulated_delta (0)
        , detented (false)
-       , drag_data_window (0)
-       , drag_data_label (0)
        , position_binder (position_control)
        , width_binder (width_control)
 {
@@ -81,26 +78,18 @@ StereoPanner::StereoPanner (boost::shared_ptr<Panner> panner)
        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());
 
-       set_flags (Gtk::CAN_FOCUS);
-
-       add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK|
-                   Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|
-                   Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|
-                   Gdk::SCROLL_MASK|
-                   Gdk::POINTER_MOTION_MASK);
-
        ColorsChanged.connect (sigc::mem_fun (*this, &StereoPanner::color_handler));
 }
 
 StereoPanner::~StereoPanner ()
 {
-       delete drag_data_window;
+
 }
 
 void
 StereoPanner::set_drag_data ()
 {
-       if (!drag_data_label) {
+       if (!_drag_data_label) {
                return;
        }
 
@@ -118,14 +107,7 @@ StereoPanner::set_drag_data ()
        snprintf (buf, sizeof (buf), "L:%3d R:%3d Width:%d%%", (int) rint (100.0 * (1.0 - pos)),
                  (int) rint (100.0 * pos),
                  (int) floor (100.0 * width_control->get_value()));
-       drag_data_label->set_markup (buf);
-}
-
-void
-StereoPanner::value_change ()
-{
-       set_drag_data ();
-       queue_draw ();
+       _drag_data_label->set_markup (buf);
 }
 
 bool
@@ -287,7 +269,7 @@ StereoPanner::on_button_press_event (GdkEventButton* ev)
        dragging_position = false;
        dragging_left = false;
        dragging_right = false;
-       dragging = false;
+       _dragging = false;
        accumulated_delta = 0;
        detented = false;
 
@@ -364,7 +346,7 @@ StereoPanner::on_button_press_event (GdkEventButton* ev)
                        }
                }
 
-               dragging = false;
+               _dragging = false;
 
        } else if (ev->type == GDK_BUTTON_PRESS) {
 
@@ -373,6 +355,8 @@ StereoPanner::on_button_press_event (GdkEventButton* ev)
                        return true;
                }
 
+               show_drag_data_window ();
+
                if (ev->y < 20) {
                        /* top section of widget is for position drags */
                        dragging_position = true;
@@ -405,7 +389,7 @@ StereoPanner::on_button_press_event (GdkEventButton* ev)
                        StartWidthGesture ();
                }
 
-               dragging = true;
+               _dragging = true;
        }
 
        return true;
@@ -418,23 +402,19 @@ StereoPanner::on_button_release_event (GdkEventButton* ev)
                return false;
        }
 
-       bool dp = dragging_position;
+       bool const dp = dragging_position;
 
-       dragging = false;
+       _dragging = false;
        dragging_position = false;
        dragging_left = false;
        dragging_right = false;
        accumulated_delta = 0;
        detented = false;
 
-       if (drag_data_window) {
-               drag_data_window->hide ();
-       }
+       hide_drag_data_window ();
 
        if (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)) {
-               /* reset to default */
-               position_control->set_value (0.5);
-               width_control->set_value (1.0);
+               _panner->reset ();
        } else {
                if (dp) {
                        StopPositionGesture ();
@@ -485,37 +465,10 @@ StereoPanner::on_scroll_event (GdkEventScroll* ev)
 bool
 StereoPanner::on_motion_notify_event (GdkEventMotion* ev)
 {
-       if (!dragging) {
+       if (!_dragging) {
                return false;
        }
 
-       if (!drag_data_window) {
-               drag_data_window = new Window (WINDOW_POPUP);
-               drag_data_window->set_name (X_("ContrastingPopup"));
-               drag_data_window->set_position (WIN_POS_MOUSE);
-               drag_data_window->set_decorated (false);
-
-               drag_data_label = manage (new Label);
-               drag_data_label->set_use_markup (true);
-
-               drag_data_window->set_border_width (6);
-               drag_data_window->add (*drag_data_label);
-               drag_data_label->show ();
-
-               Window* toplevel = dynamic_cast<Window*> (get_toplevel());
-               if (toplevel) {
-                       drag_data_window->set_transient_for (*toplevel);
-               }
-       }
-
-       if (!drag_data_window->is_visible ()) {
-               /* move the popup window vertically down from the panner display */
-               int rx, ry;
-               get_window()->get_origin (rx, ry);
-               drag_data_window->move (rx, ry+get_height());
-               drag_data_window->present ();
-       }
-
        int w = get_width();
        double delta = (ev->x - last_drag_x) / (double) w;
        double current_width = width_control->get_value ();
@@ -618,27 +571,6 @@ StereoPanner::on_key_press_event (GdkEventKey* ev)
        return true;
 }
 
-bool
-StereoPanner::on_key_release_event (GdkEventKey* ev)
-{
-       return false;
-}
-
-bool
-StereoPanner::on_enter_notify_event (GdkEventCrossing* ev)
-{
-       grab_focus ();
-       Keyboard::magic_widget_grab_focus ();
-       return false;
-}
-
-bool
-StereoPanner::on_leave_notify_event (GdkEventCrossing*)
-{
-       Keyboard::magic_widget_drop_focus ();
-       return false;
-}
-
 void
 StereoPanner::set_colors ()
 {