758b94c37bd310e72a9468176dc9c225ecea9ed4
[ardour.git] / gtk2_ardour / level_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_track_meter_h__
21 #define __ardour_gtk_track_meter_h__
22
23 #include <vector>
24
25 #include <gtkmm/box.h>
26 #include <gtkmm/adjustment.h>
27 #include <gtkmm/frame.h>
28 #include <gtkmm/eventbox.h>
29 #include <gtkmm/button.h>
30 #include <gtkmm/table.h>
31 #include <gtkmm/drawingarea.h>
32
33 #include "ardour/types.h"
34 #include "ardour/chan_count.h"
35 #include "ardour/session_handle.h"
36
37 #include <gtkmm2ext/click_box.h>
38 #include <gtkmm2ext/focus_entry.h>
39 #include <gtkmm2ext/slider_controller.h>
40 #include <gtkmm2ext/fastmeter.h>
41
42 #include "enums.h"
43
44 namespace ARDOUR {
45         class Session;
46         class PeakMeter;
47 }
48 namespace Gtk {
49         class Menu;
50 }
51
52 class LevelMeterBase : public ARDOUR::SessionHandlePtr, virtual public sigc::trackable
53 {
54   public:
55         LevelMeterBase (ARDOUR::Session*, PBD::EventLoop::InvalidationRecord* ir,
56                         Gtkmm2ext::FastMeter::Orientation o = Gtkmm2ext::FastMeter::Vertical);
57         virtual ~LevelMeterBase ();
58
59         virtual void set_meter (ARDOUR::PeakMeter* meter);
60
61         void update_gain_sensitive ();
62
63         float update_meters ();
64         void update_meters_falloff ();
65         void clear_meters (bool reset_highlight = true);
66         void hide_meters ();
67         void setup_meters (int len=0, int width=3, int thin=2);
68         void set_max_audio_meter_count (uint32_t cnt = 0);
69
70         void set_type (ARDOUR::MeterType);
71         ARDOUR::MeterType get_type () { return meter_type; }
72
73         /** Emitted in the GUI thread when a button is pressed over the meter */
74         PBD::Signal1<bool, GdkEventButton *> ButtonPress;
75         PBD::Signal1<bool, GdkEventButton *> ButtonRelease;
76         PBD::Signal1<void, ARDOUR::MeterType> MeterTypeChanged;
77
78         protected:
79         virtual void mtr_pack(Gtk::Widget &w) = 0;
80         virtual void mtr_remove(Gtk::Widget &w) = 0;
81
82   private:
83         PBD::EventLoop::InvalidationRecord* parent_invalidator;
84         ARDOUR::PeakMeter* _meter;
85         Gtkmm2ext::FastMeter::Orientation _meter_orientation;
86
87         Width _width;
88
89         struct MeterInfo {
90             Gtkmm2ext::FastMeter *meter;
91             gint16                width;
92             int                   length;
93             bool                  packed;
94             float                 max_peak;
95
96             MeterInfo() {
97                     meter = 0;
98                     width = 0;
99                     length = 0;
100                     packed = false;
101                     max_peak = -INFINITY;
102             }
103         };
104
105         guint16                regular_meter_width;
106         int                    meter_length;
107         guint16                thin_meter_width;
108         std::vector<MeterInfo> meters;
109         float                  max_peak;
110         ARDOUR::MeterType      meter_type;
111         ARDOUR::MeterType      visible_meter_type;
112         uint32_t               meter_count;
113         uint32_t               max_visible_meters;
114
115         PBD::ScopedConnection _configuration_connection;
116         PBD::ScopedConnection _meter_type_connection;
117         PBD::ScopedConnection _parameter_connection;
118
119         void hide_all_meters ();
120         bool meter_button_press (GdkEventButton *);
121         bool meter_button_release (GdkEventButton *);
122
123         void parameter_changed (std::string);
124         void configuration_changed (ARDOUR::ChanCount in, ARDOUR::ChanCount out);
125         void meter_type_changed (ARDOUR::MeterType);
126
127         bool color_changed;
128         void color_handler ();
129 };
130
131 class LevelMeterHBox : public LevelMeterBase, public Gtk::HBox
132 {
133   public:
134         LevelMeterHBox (ARDOUR::Session*);
135         ~LevelMeterHBox();
136
137         protected:
138         void mtr_pack(Gtk::Widget &w);
139         void mtr_remove(Gtk::Widget &w);
140 };
141
142 class LevelMeterVBox : public LevelMeterBase, public Gtk::VBox
143 {
144   public:
145         LevelMeterVBox (ARDOUR::Session*);
146         ~LevelMeterVBox();
147
148         protected:
149         void mtr_pack(Gtk::Widget &w);
150         void mtr_remove(Gtk::Widget &w);
151 };
152
153 #endif /* __ardour_gtk_track_meter_h__ */
154