a reverb is a reverb is a reverb
[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 "gtkmm2ext/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   private:
62         PannerEditor* editor ();
63         boost::shared_ptr<ARDOUR::PannerShell> _panner_shell;
64
65         boost::shared_ptr<PBD::Controllable> position_control;
66         boost::shared_ptr<PBD::Controllable> width_control;
67         PBD::ScopedConnectionList panvalue_connections;
68         PBD::ScopedConnectionList panshell_connections;
69         bool dragging_position;
70         bool dragging_left;
71         bool dragging_right;
72         int drag_start_x;
73         int last_drag_x;
74         double accumulated_delta;
75         bool detented;
76
77         BindingProxy position_binder;
78         BindingProxy width_binder;
79
80         void set_tooltip ();
81
82         struct ColorScheme {
83             uint32_t outline;
84             uint32_t fill;
85             uint32_t text;
86             uint32_t background;
87             uint32_t rule;
88         };
89
90         enum State {
91                 Normal,
92                 Mono,
93                 Inverted
94         };
95
96         bool _dragging;
97
98         static Pango::AttrList panner_font_attributes;
99         static bool have_font;
100
101         static ColorScheme colors[3];
102         static void set_colors ();
103         static bool have_colors;
104         void color_handler ();
105         void bypass_handler ();
106         void pannable_handler ();
107 };
108
109 #endif /* __gtk_ardour_stereo_panner_h__ */