switch to using boost::signals2 instead of sigc++, at least for libardour. not finish...
[ardour.git] / gtk2_ardour / gain_meter.h
1 /*
2     Copyright (C) 2002 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 __ardour_gtk_gain_meter_h__
21 #define __ardour_gtk_gain_meter_h__
22
23 #include <vector>
24 #include <map>
25
26 #include <gtkmm/box.h>
27 #include <gtkmm/adjustment.h>
28 #include <gtkmm/frame.h>
29 #include <gtkmm/eventbox.h>
30 #include <gtkmm/button.h>
31 #include <gtkmm/table.h>
32 #include <gtkmm/drawingarea.h>
33 #include <gdkmm/colormap.h>
34
35 #include "pbd/scoped_connections.h"
36
37 #include "ardour/types.h"
38 #include "ardour/session_handle.h"
39
40 #include "gtkmm2ext/click_box.h"
41 #include "gtkmm2ext/focus_entry.h"
42 #include "gtkmm2ext/slider_controller.h"
43
44 #include "enums.h"
45 #include "level_meter.h"
46
47 namespace ARDOUR {
48         class IO;
49         class Session;
50         class Route;
51         class RouteGroup;
52         class PeakMeter;
53         class Amp;
54         class Automatable;
55 }
56 namespace Gtkmm2ext {
57         class FastMeter;
58         class BarController;
59 }
60 namespace Gtk {
61         class Menu;
62 }
63
64 class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
65 {
66   public:
67         GainMeterBase (ARDOUR::Session*, const Glib::RefPtr<Gdk::Pixbuf>& pix,
68                        bool horizontal, int);
69         virtual ~GainMeterBase ();
70
71         virtual void set_controls (boost::shared_ptr<ARDOUR::Route> route,
72                                    boost::shared_ptr<ARDOUR::PeakMeter> meter,
73                                    boost::shared_ptr<ARDOUR::Amp> amp);
74
75         void update_gain_sensitive ();
76         void update_meters ();
77
78         void effective_gain_display ();
79         void set_width (Width, int len=0);
80         void set_meter_strip_name (const char * name);
81         void set_fader_name (const char * name);
82
83         virtual void setup_meters (int len=0);
84
85         boost::shared_ptr<PBD::Controllable> get_controllable();
86
87         LevelMeter& get_level_meter() const { return *level_meter; }
88         Gtkmm2ext::SliderController& get_gain_slider() const { return *gain_slider; }
89
90   protected:
91
92         friend class MixerStrip;
93         boost::shared_ptr<ARDOUR::Route> _route;
94         boost::shared_ptr<ARDOUR::PeakMeter> _meter;
95         boost::shared_ptr<ARDOUR::Amp> _amp;
96         std::vector<sigc::connection> connections;
97         PBD::ScopedConnectionList model_connections;
98
99         bool ignore_toggle;
100         bool next_release_selects;
101
102         Gtkmm2ext::SliderController *gain_slider;
103         Gtk::Adjustment              gain_adjustment;
104         Gtkmm2ext::FocusEntry        gain_display;
105         Gtk::Button                  peak_display;
106         Gtk::DrawingArea             meter_metric_area;
107         LevelMeter                  *level_meter;
108
109         sigc::connection gain_watching;
110
111         Gtk::Button gain_automation_style_button;
112         Gtk::ToggleButton gain_automation_state_button;
113
114         Gtk::Menu gain_astate_menu;
115         Gtk::Menu gain_astyle_menu;
116
117         gint gain_automation_style_button_event (GdkEventButton *);
118         gint gain_automation_state_button_event (GdkEventButton *);
119         gint pan_automation_style_button_event (GdkEventButton *);
120         gint pan_automation_state_button_event (GdkEventButton *);
121
122         void gain_automation_state_changed();
123         void gain_automation_style_changed();
124
125         std::string astate_string (ARDOUR::AutoState);
126         std::string short_astate_string (ARDOUR::AutoState);
127         std::string _astate_string (ARDOUR::AutoState, bool);
128
129         std::string astyle_string (ARDOUR::AutoStyle);
130         std::string short_astyle_string (ARDOUR::AutoStyle);
131         std::string _astyle_string (ARDOUR::AutoStyle, bool);
132
133         Width _width;
134
135         void show_gain ();
136         void gain_activated ();
137         bool gain_focused (GdkEventFocus*);
138
139         float max_peak;
140
141         void gain_adjusted ();
142         void gain_changed ();
143
144         void meter_point_clicked ();
145         void gain_unit_changed ();
146
147         virtual void hide_all_meters ();
148
149         gint meter_button_press (GdkEventButton*, uint32_t);
150
151         bool peak_button_release (GdkEventButton*);
152         bool gain_key_press (GdkEventKey*);
153
154         Gtk::Menu* meter_menu;
155         void popup_meter_menu (GdkEventButton*);
156
157         gint start_gain_touch (GdkEventButton*);
158         gint end_gain_touch (GdkEventButton*);
159
160         void set_mix_group_meter_point (ARDOUR::Route&, ARDOUR::MeterPoint);
161         void set_meter_point (ARDOUR::Route&, ARDOUR::MeterPoint);
162         gint meter_release (GdkEventButton*);
163         gint meter_press (GdkEventButton*);
164         bool wait_for_release;
165         ARDOUR::MeterPoint old_meter_point;
166
167         void parameter_changed (const char*);
168
169         void reset_peak_display ();
170         void reset_group_peak_display (ARDOUR::RouteGroup*);
171
172         static sigc::signal<void> ResetAllPeakDisplays;
173         static sigc::signal<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
174
175         void on_theme_changed ();
176         bool style_changed;
177         bool dpi_changed;
178         bool color_changed;
179         void color_handler(bool);
180         bool _is_midi;
181 };
182
183 class GainMeter : public GainMeterBase, public Gtk::VBox
184 {
185   public:
186         GainMeter (ARDOUR::Session*, int);
187         ~GainMeter () {}
188
189         virtual void set_controls (boost::shared_ptr<ARDOUR::Route> route,
190                                    boost::shared_ptr<ARDOUR::PeakMeter> meter,
191                                    boost::shared_ptr<ARDOUR::Amp> amp);
192
193         int get_gm_width ();
194         void setup_meters (int len=0);
195
196         static void setup_slider_pix ();
197
198   protected:
199         void hide_all_meters ();
200
201         gint meter_metrics_expose (GdkEventExpose *);
202
203         static std::map<std::string,Glib::RefPtr<Gdk::Pixmap> > metric_pixmaps;
204         static Glib::RefPtr<Gdk::Pixmap> render_metrics (Gtk::Widget&);
205
206   private:
207         Gtk::HBox  gain_display_box;
208         Gtk::HBox  fader_box;
209         Gtk::VBox* fader_vbox;
210         Gtk::HBox  hbox;
211
212         static Glib::RefPtr<Gdk::Pixbuf> slider;
213 };
214
215 #endif /* __ardour_gtk_gain_meter_h__ */
216