Show panner drag information tool-tip style, and also show
authorCarl Hetherington <carl@carlh.net>
Mon, 26 Dec 2011 14:30:35 +0000 (14:30 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 26 Dec 2011 14:30:35 +0000 (14:30 +0000)
it when the button is pressed to start a drag (#4584 and
#4585).

git-svn-id: svn://localhost/ardour2/branches/3.0@11072 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/mono_panner.cc
gtk2_ardour/mono_panner.h
gtk2_ardour/panner_interface.cc
gtk2_ardour/panner_interface.h
gtk2_ardour/stereo_panner.cc

index 5764c4c137d4c5a0c461a0e7d916fd90d4d770af..e93dc838942ce36d17e8c9dbadbb34f746b82b68 100644 (file)
@@ -59,7 +59,6 @@ bool MonoPanner::have_colors = false;
 MonoPanner::MonoPanner (boost::shared_ptr<ARDOUR::Panner> panner)
        : PannerInterface (panner)
        , position_control (_panner->pannable()->pan_azimuth_control)
-        , dragging (false)
         , drag_start_x (0)
         , last_drag_x (0)
         , accumulated_delta (0)
@@ -251,7 +250,7 @@ MonoPanner::on_button_press_event (GdkEventButton* ev)
         drag_start_x = ev->x;
         last_drag_x = ev->x;
 
-        dragging = false;
+        _dragging = false;
         accumulated_delta = 0;
         detented = false;
 
@@ -286,7 +285,7 @@ MonoPanner::on_button_press_event (GdkEventButton* ev)
                         position_control->set_value (0.5);
                 }
 
-                dragging = false;
+                _dragging = false;
 
         } else if (ev->type == GDK_BUTTON_PRESS) {
 
@@ -295,8 +294,9 @@ MonoPanner::on_button_press_event (GdkEventButton* ev)
                         return true;
                 }
 
-                dragging = true;
+                _dragging = true;
                 StartGesture ();
+               show_drag_data_window ();
         }
 
         return true;
@@ -309,13 +309,11 @@ MonoPanner::on_button_release_event (GdkEventButton* ev)
                 return false;
         }
 
-        dragging = false;
+        _dragging = 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)) {
                _panner->reset ();
@@ -358,12 +356,10 @@ MonoPanner::on_scroll_event (GdkEventScroll* ev)
 bool
 MonoPanner::on_motion_notify_event (GdkEventMotion* ev)
 {
-        if (!dragging) {
+        if (!_dragging) {
                 return false;
         }
 
-       show_drag_data_window ();
-
         int w = get_width();
         double delta = (ev->x - last_drag_x) / (double) w;
 
index 4e20e10902079e9be9edf5552088712b03baacd0..ec47aa309d3eac9b06a80c1a56d283d49dbf8591 100644 (file)
@@ -54,7 +54,6 @@ class MonoPanner : public PannerInterface
   private:
         boost::shared_ptr<PBD::Controllable> position_control;
         PBD::ScopedConnectionList connections;
-        bool dragging;
         int drag_start_x;
         int last_drag_x;
         double accumulated_delta;
index 95e1e4e7ffcec653312779424447971f6149e963..53a7535f4d2181e9d5a4897590f3e69b3f116430 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "i18n.h"
 
+using namespace std;
 using namespace Gtk;
 using namespace ARDOUR;
 using namespace Gtkmm2ext;
@@ -32,6 +33,7 @@ PannerInterface::PannerInterface (boost::shared_ptr<Panner> p)
        : _panner (p)
        , _drag_data_window (0)
        , _drag_data_label (0)
+        , _dragging (false)
 {
         set_flags (Gtk::CAN_FOCUS);
 
@@ -69,6 +71,8 @@ PannerInterface::show_drag_data_window ()
                        _drag_data_window->set_transient_for (*toplevel);
                }
        }
+
+       set_drag_data ();
        
         if (!_drag_data_window->is_visible ()) {
                 /* move the window a little away from the mouse */
@@ -79,11 +83,29 @@ PannerInterface::show_drag_data_window ()
         }
 }
 
+void
+PannerInterface::hide_drag_data_window ()
+{
+        if (_drag_data_window) {
+                _drag_data_window->hide ();
+        }
+}
+
 bool
 PannerInterface::on_enter_notify_event (GdkEventCrossing *)
 {
        grab_focus ();
        Keyboard::magic_widget_grab_focus ();
+
+       _drag_data_timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PannerInterface::drag_data_timeout), 500);
+       
+       return false;
+}
+
+bool
+PannerInterface::drag_data_timeout ()
+{
+       show_drag_data_window ();
        return false;
 }
 
@@ -91,6 +113,12 @@ bool
 PannerInterface::on_leave_notify_event (GdkEventCrossing *)
 {
        Keyboard::magic_widget_drop_focus ();
+
+       _drag_data_timeout.disconnect ();
+       if (!_dragging) {
+               hide_drag_data_window ();
+       }
+       
        return false;
 }
 
index 5cf33951ba8085197f4361c3f8bcd9f66a236fca..167ea6d7be6a5e7d52e302303530005b507bcc79 100644 (file)
@@ -39,7 +39,9 @@ protected:
        virtual void set_drag_data () = 0;
        
        void show_drag_data_window ();
+       void hide_drag_data_window ();
        void value_change ();
+       
         bool on_enter_notify_event (GdkEventCrossing *);
         bool on_leave_notify_event (GdkEventCrossing *);
        bool on_key_release_event  (GdkEventKey *);
@@ -47,6 +49,11 @@ protected:
        boost::shared_ptr<ARDOUR::Panner> _panner;
         Gtk::Window* _drag_data_window;
         Gtk::Label*  _drag_data_label;
+        bool _dragging;
+
+private:
+       bool drag_data_timeout ();
+       sigc::connection _drag_data_timeout;
 };
 
 #endif
index 6da8a249fcafb6e1dae9dbf7ca416cd425721b3a..43fae05e7b3e349cb2187a2de54b10b217f1124e 100644 (file)
@@ -60,7 +60,6 @@ StereoPanner::StereoPanner (boost::shared_ptr<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)
@@ -270,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;
 
@@ -347,7 +346,7 @@ StereoPanner::on_button_press_event (GdkEventButton* ev)
                        }
                }
 
-               dragging = false;
+               _dragging = false;
 
        } else if (ev->type == GDK_BUTTON_PRESS) {
 
@@ -356,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;
@@ -388,7 +389,7 @@ StereoPanner::on_button_press_event (GdkEventButton* ev)
                        StartWidthGesture ();
                }
 
-               dragging = true;
+               _dragging = true;
        }
 
        return true;
@@ -403,16 +404,14 @@ StereoPanner::on_button_release_event (GdkEventButton* ev)
 
        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)) {
                _panner->reset ();
@@ -466,12 +465,10 @@ StereoPanner::on_scroll_event (GdkEventScroll* ev)
 bool
 StereoPanner::on_motion_notify_event (GdkEventMotion* ev)
 {
-       if (!dragging) {
+       if (!_dragging) {
                return false;
        }
 
-       show_drag_data_window ();
-
        int w = get_width();
        double delta = (ev->x - last_drag_x) / (double) w;
        double current_width = width_control->get_value ();