From 6e79521e8b7709458b8ee093e2d0dc6440ffea2c Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 26 Dec 2011 14:05:19 +0000 Subject: Move some bits from MonoPanner and StereoPanner into a common base class. git-svn-id: svn://localhost/ardour2/branches/3.0@11071 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/mono_panner.cc | 84 ++++--------------------------- gtk2_ardour/mono_panner.h | 15 ++---- gtk2_ardour/panner_interface.cc | 109 ++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/panner_interface.h | 52 +++++++++++++++++++ gtk2_ardour/stereo_panner.cc | 77 +++------------------------- gtk2_ardour/stereo_panner.h | 17 ++----- gtk2_ardour/wscript | 1 + 7 files changed, 187 insertions(+), 168 deletions(-) create mode 100644 gtk2_ardour/panner_interface.cc create mode 100644 gtk2_ardour/panner_interface.h diff --git a/gtk2_ardour/mono_panner.cc b/gtk2_ardour/mono_panner.cc index 791c3e8d0b..5764c4c137 100644 --- a/gtk2_ardour/mono_panner.cc +++ b/gtk2_ardour/mono_panner.cc @@ -57,15 +57,13 @@ MonoPanner::ColorScheme MonoPanner::colors; bool MonoPanner::have_colors = false; MonoPanner::MonoPanner (boost::shared_ptr panner) - : _panner (panner) + : PannerInterface (panner) , position_control (_panner->pannable()->pan_azimuth_control) , dragging (false) , drag_start_x (0) , last_drag_x (0) , accumulated_delta (0) , detented (false) - , drag_data_window (0) - , drag_data_label (0) , position_binder (position_control) { if (!have_colors) { @@ -75,26 +73,18 @@ MonoPanner::MonoPanner (boost::shared_ptr panner) position_control->Changed.connect (connections, invalidator(*this), boost::bind (&MonoPanner::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, &MonoPanner::color_handler)); + ColorsChanged.connect (sigc::mem_fun (*this, &MonoPanner::color_handler)); } MonoPanner::~MonoPanner () { - delete drag_data_window; + } void MonoPanner::set_drag_data () { - if (!drag_data_label) { + if (!_drag_data_label) { return; } @@ -112,14 +102,7 @@ MonoPanner::set_drag_data () snprintf (buf, sizeof (buf), "L:%3d R:%3d", (int) rint (100.0 * (1.0 - pos)), (int) rint (100.0 * pos)); - drag_data_label->set_markup (buf); -} - -void -MonoPanner::value_change () -{ - set_drag_data (); - queue_draw (); + _drag_data_label->set_markup (buf); } bool @@ -330,8 +313,8 @@ MonoPanner::on_button_release_event (GdkEventButton* ev) accumulated_delta = 0; detented = false; - if (drag_data_window) { - drag_data_window->hide (); + if (_drag_data_window) { + _drag_data_window->hide (); } if (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)) { @@ -379,32 +362,7 @@ MonoPanner::on_motion_notify_event (GdkEventMotion* ev) 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 (get_toplevel()); - if (toplevel) { - drag_data_window->set_transient_for (*toplevel); - } - } - - if (!drag_data_window->is_visible ()) { - /* move the window a little away from the mouse */ - int rx, ry; - get_window()->get_origin (rx, ry); - drag_data_window->move (rx, ry+get_height()); - drag_data_window->present (); - } + show_drag_data_window (); int w = get_width(); double delta = (ev->x - last_drag_x) / (double) w; @@ -469,27 +427,6 @@ MonoPanner::on_key_press_event (GdkEventKey* ev) return true; } -bool -MonoPanner::on_key_release_event (GdkEventKey*) -{ - return false; -} - -bool -MonoPanner::on_enter_notify_event (GdkEventCrossing*) -{ - grab_focus (); - Keyboard::magic_widget_grab_focus (); - return false; -} - -bool -MonoPanner::on_leave_notify_event (GdkEventCrossing*) -{ - Keyboard::magic_widget_drop_focus (); - return false; -} - void MonoPanner::set_colors () { @@ -504,6 +441,7 @@ MonoPanner::set_colors () void MonoPanner::color_handler () { - set_colors (); - queue_draw (); + set_colors (); + queue_draw (); } + diff --git a/gtk2_ardour/mono_panner.h b/gtk2_ardour/mono_panner.h index 37a0932b99..4e20e10902 100644 --- a/gtk2_ardour/mono_panner.h +++ b/gtk2_ardour/mono_panner.h @@ -22,16 +22,17 @@ #include "pbd/signals.h" -#include #include #include "gtkmm2ext/binding_proxy.h" +#include "panner_interface.h" + namespace PBD { class Controllable; } -class MonoPanner : public Gtk::DrawingArea +class MonoPanner : public PannerInterface { public: MonoPanner (boost::shared_ptr); @@ -49,12 +50,8 @@ class MonoPanner : public Gtk::DrawingArea bool on_motion_notify_event (GdkEventMotion*); bool on_scroll_event (GdkEventScroll*); bool on_key_press_event (GdkEventKey*); - bool on_key_release_event (GdkEventKey*); - bool on_enter_notify_event (GdkEventCrossing* ev); - bool on_leave_notify_event (GdkEventCrossing* ev); private: - boost::shared_ptr _panner; boost::shared_ptr position_control; PBD::ScopedConnectionList connections; bool dragging; @@ -63,12 +60,8 @@ class MonoPanner : public Gtk::DrawingArea double accumulated_delta; bool detented; - Gtk::Window* drag_data_window; - Gtk::Label* drag_data_label; - BindingProxy position_binder; - void value_change (); void set_drag_data (); struct ColorScheme { @@ -83,7 +76,7 @@ class MonoPanner : public Gtk::DrawingArea static ColorScheme colors; static void set_colors (); static bool have_colors; - void color_handler (); + void color_handler (); }; #endif /* __gtk_ardour_mono_panner_h__ */ diff --git a/gtk2_ardour/panner_interface.cc b/gtk2_ardour/panner_interface.cc new file mode 100644 index 0000000000..95e1e4e7ff --- /dev/null +++ b/gtk2_ardour/panner_interface.cc @@ -0,0 +1,109 @@ +/* + Copyright (C) 2011 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include "gtkmm2ext/keyboard.h" +#include "panner_interface.h" +#include "global_signals.h" + +#include "i18n.h" + +using namespace Gtk; +using namespace ARDOUR; +using namespace Gtkmm2ext; + +PannerInterface::PannerInterface (boost::shared_ptr p) + : _panner (p) + , _drag_data_window (0) + , _drag_data_label (0) +{ + 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); + +} + +PannerInterface::~PannerInterface () +{ + delete _drag_data_window; +} + +void +PannerInterface::show_drag_data_window () +{ + 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 (get_toplevel()); + if (toplevel) { + _drag_data_window->set_transient_for (*toplevel); + } + } + + if (!_drag_data_window->is_visible ()) { + /* move the window a little away from the mouse */ + int rx, ry; + get_window()->get_origin (rx, ry); + _drag_data_window->move (rx, ry + get_height()); + _drag_data_window->present (); + } +} + +bool +PannerInterface::on_enter_notify_event (GdkEventCrossing *) +{ + grab_focus (); + Keyboard::magic_widget_grab_focus (); + return false; +} + +bool +PannerInterface::on_leave_notify_event (GdkEventCrossing *) +{ + Keyboard::magic_widget_drop_focus (); + return false; +} + +bool +PannerInterface::on_key_release_event (GdkEventKey*) +{ + return false; +} + +void +PannerInterface::value_change () +{ + set_drag_data (); + queue_draw (); +} + diff --git a/gtk2_ardour/panner_interface.h b/gtk2_ardour/panner_interface.h new file mode 100644 index 0000000000..5cf33951ba --- /dev/null +++ b/gtk2_ardour/panner_interface.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2011 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __gtk_ardour_panner_interface_h__ +#define __gtk_ardour_panner_interface_h__ + +#include +#include +#include + +namespace ARDOUR { + class Panner; +} + +/** Parent class for some panner UI classes that contains some common code */ +class PannerInterface : public Gtk::DrawingArea +{ +public: + PannerInterface (boost::shared_ptr); + virtual ~PannerInterface (); + +protected: + virtual void set_drag_data () = 0; + + void show_drag_data_window (); + void value_change (); + bool on_enter_notify_event (GdkEventCrossing *); + bool on_leave_notify_event (GdkEventCrossing *); + bool on_key_release_event (GdkEventKey *); + + boost::shared_ptr _panner; + Gtk::Window* _drag_data_window; + Gtk::Label* _drag_data_label; +}; + +#endif diff --git a/gtk2_ardour/stereo_panner.cc b/gtk2_ardour/stereo_panner.cc index e55d2c1b20..6da8a249fc 100644 --- a/gtk2_ardour/stereo_panner.cc +++ b/gtk2_ardour/stereo_panner.cc @@ -57,7 +57,7 @@ bool StereoPanner::have_colors = false; using namespace ARDOUR; StereoPanner::StereoPanner (boost::shared_ptr panner) - : _panner (panner) + : PannerInterface (panner) , position_control (_panner->pannable()->pan_azimuth_control) , width_control (_panner->pannable()->pan_width_control) , dragging (false) @@ -68,8 +68,6 @@ StereoPanner::StereoPanner (boost::shared_ptr 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 +79,18 @@ StereoPanner::StereoPanner (boost::shared_ptr 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 +108,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 @@ -427,8 +410,8 @@ StereoPanner::on_button_release_event (GdkEventButton* ev) accumulated_delta = 0; detented = false; - if (drag_data_window) { - drag_data_window->hide (); + if (_drag_data_window) { + _drag_data_window->hide (); } if (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)) { @@ -487,32 +470,7 @@ StereoPanner::on_motion_notify_event (GdkEventMotion* ev) 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 (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 (); - } + show_drag_data_window (); int w = get_width(); double delta = (ev->x - last_drag_x) / (double) w; @@ -616,27 +574,6 @@ StereoPanner::on_key_press_event (GdkEventKey* ev) return true; } -bool -StereoPanner::on_key_release_event (GdkEventKey*) -{ - return false; -} - -bool -StereoPanner::on_enter_notify_event (GdkEventCrossing*) -{ - 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 () { diff --git a/gtk2_ardour/stereo_panner.h b/gtk2_ardour/stereo_panner.h index f2b04f1af7..8d76442724 100644 --- a/gtk2_ardour/stereo_panner.h +++ b/gtk2_ardour/stereo_panner.h @@ -21,11 +21,8 @@ #define __gtk_ardour_stereo_panner_h__ #include "pbd/signals.h" - -#include -#include - #include "gtkmm2ext/binding_proxy.h" +#include "panner_interface.h" namespace PBD { class Controllable; @@ -35,7 +32,7 @@ namespace ARDOUR { class Panner; } -class StereoPanner : public Gtk::DrawingArea +class StereoPanner : public PannerInterface { public: StereoPanner (boost::shared_ptr); @@ -53,12 +50,8 @@ class StereoPanner : public Gtk::DrawingArea bool on_motion_notify_event (GdkEventMotion*); bool on_scroll_event (GdkEventScroll*); bool on_key_press_event (GdkEventKey*); - bool on_key_release_event (GdkEventKey*); - bool on_enter_notify_event (GdkEventCrossing* ev); - bool on_leave_notify_event (GdkEventCrossing* ev); private: - boost::shared_ptr _panner; boost::shared_ptr position_control; boost::shared_ptr width_control; PBD::ScopedConnectionList connections; @@ -71,13 +64,9 @@ class StereoPanner : public Gtk::DrawingArea double accumulated_delta; bool detented; - Gtk::Window* drag_data_window; - Gtk::Label* drag_data_label; - BindingProxy position_binder; BindingProxy width_binder; - void value_change (); void set_drag_data (); struct ColorScheme { @@ -97,7 +86,7 @@ class StereoPanner : public Gtk::DrawingArea static ColorScheme colors[3]; static void set_colors (); static bool have_colors; - void color_handler (); + void color_handler (); }; #endif /* __gtk_ardour_stereo_panner_h__ */ diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript index b659ff500a..e12e0bf388 100644 --- a/gtk2_ardour/wscript +++ b/gtk2_ardour/wscript @@ -164,6 +164,7 @@ gtk2_ardour_sources = [ 'option_editor.cc', 'opts.cc', 'panner2d.cc', + 'panner_interface.cc', 'panner_ui.cc', 'piano_roll_header.cc', 'playlist_selector.cc', -- cgit v1.2.3