use new action map API instead of ActionManager::get_action
[ardour.git] / gtk2_ardour / stereo_panner.h
1 /*
2     Copyright (C) 2010 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef __gtk_ardour_stereo_panner_h__
21 #define __gtk_ardour_stereo_panner_h__
22
23 #include "pbd/signals.h"
24 #include "widgets/binding_proxy.h"
25 #include "panner_interface.h"
26
27 namespace ARDOUR {
28         class PannerShell;
29 }
30
31 namespace PBD {
32         class Controllable;
33 }
34
35 namespace ARDOUR {
36         class Panner;
37 }
38
39 class StereoPanner : public PannerInterface
40 {
41 public:
42         StereoPanner (boost::shared_ptr<ARDOUR::PannerShell>);
43         ~StereoPanner ();
44
45         boost::shared_ptr<PBD::Controllable> get_position_controllable() const { return position_control; }
46         boost::shared_ptr<PBD::Controllable> get_width_controllable() const { return width_control; }
47
48         sigc::signal<void> StartPositionGesture;
49         sigc::signal<void> StopPositionGesture;
50         sigc::signal<void> StartWidthGesture;
51         sigc::signal<void> StopWidthGesture;
52
53 protected:
54         bool on_expose_event (GdkEventExpose*);
55         bool on_button_press_event (GdkEventButton*);
56         bool on_button_release_event (GdkEventButton*);
57         bool on_motion_notify_event (GdkEventMotion*);
58         bool on_scroll_event (GdkEventScroll*);
59         bool on_key_press_event (GdkEventKey*);
60
61         boost::weak_ptr<PBD::Controllable> proxy_controllable () const
62         {
63                 return boost::weak_ptr<PBD::Controllable> (position_binder.get_controllable());
64         }
65
66 private:
67         PannerEditor* editor ();
68         boost::shared_ptr<ARDOUR::PannerShell> _panner_shell;
69
70         boost::shared_ptr<PBD::Controllable> position_control;
71         boost::shared_ptr<PBD::Controllable> width_control;
72         PBD::ScopedConnectionList panvalue_connections;
73         PBD::ScopedConnectionList panshell_connections;
74         bool dragging_position;
75         bool dragging_left;
76         bool dragging_right;
77         int drag_start_x;
78         int last_drag_x;
79         double accumulated_delta;
80         bool detented;
81
82         ArdourWidgets::BindingProxy position_binder;
83         ArdourWidgets::BindingProxy width_binder;
84
85         void set_tooltip ();
86
87         struct ColorScheme {
88                 uint32_t outline;
89                 uint32_t fill;
90                 uint32_t text;
91                 uint32_t background;
92                 uint32_t rule;
93         };
94
95         enum State {
96                 Normal,
97                 Mono,
98                 Inverted
99         };
100
101         bool _dragging;
102
103         static Pango::AttrList panner_font_attributes;
104         static bool have_font;
105
106         static ColorScheme colors[3];
107         static void set_colors ();
108         static bool have_colors;
109         void color_handler ();
110         void bypass_handler ();
111         void pannable_handler ();
112 };
113
114 #endif /* __gtk_ardour_stereo_panner_h__ */