From 2adb3fb579068b5a278df2ac96d131fe5f40f169 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 26 Dec 2011 14:30:35 +0000 Subject: [PATCH] Show panner drag information tool-tip style, and also show 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 | 18 +++++++----------- gtk2_ardour/mono_panner.h | 1 - gtk2_ardour/panner_interface.cc | 28 ++++++++++++++++++++++++++++ gtk2_ardour/panner_interface.h | 7 +++++++ gtk2_ardour/stereo_panner.cc | 19 ++++++++----------- 5 files changed, 50 insertions(+), 23 deletions(-) diff --git a/gtk2_ardour/mono_panner.cc b/gtk2_ardour/mono_panner.cc index 5764c4c137..e93dc83894 100644 --- a/gtk2_ardour/mono_panner.cc +++ b/gtk2_ardour/mono_panner.cc @@ -59,7 +59,6 @@ bool MonoPanner::have_colors = false; MonoPanner::MonoPanner (boost::shared_ptr 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; diff --git a/gtk2_ardour/mono_panner.h b/gtk2_ardour/mono_panner.h index 4e20e10902..ec47aa309d 100644 --- a/gtk2_ardour/mono_panner.h +++ b/gtk2_ardour/mono_panner.h @@ -54,7 +54,6 @@ class MonoPanner : public PannerInterface private: boost::shared_ptr position_control; PBD::ScopedConnectionList connections; - bool dragging; int drag_start_x; int last_drag_x; double accumulated_delta; diff --git a/gtk2_ardour/panner_interface.cc b/gtk2_ardour/panner_interface.cc index 95e1e4e7ff..53a7535f4d 100644 --- a/gtk2_ardour/panner_interface.cc +++ b/gtk2_ardour/panner_interface.cc @@ -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 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; } diff --git a/gtk2_ardour/panner_interface.h b/gtk2_ardour/panner_interface.h index 5cf33951ba..167ea6d7be 100644 --- a/gtk2_ardour/panner_interface.h +++ b/gtk2_ardour/panner_interface.h @@ -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 _panner; Gtk::Window* _drag_data_window; Gtk::Label* _drag_data_label; + bool _dragging; + +private: + bool drag_data_timeout (); + sigc::connection _drag_data_timeout; }; #endif diff --git a/gtk2_ardour/stereo_panner.cc b/gtk2_ardour/stereo_panner.cc index 6da8a249fc..43fae05e7b 100644 --- a/gtk2_ardour/stereo_panner.cc +++ b/gtk2_ardour/stereo_panner.cc @@ -60,7 +60,6 @@ StereoPanner::StereoPanner (boost::shared_ptr 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 ();