a more reliable/robust/less complex version of previous commit
[ardour.git] / gtk2_ardour / level_meter.h
index ead63aa50b8f090517a8744fc7bed53a9eab1aa7..758b94c37bd310e72a9468176dc9c225ecea9ed4 100644 (file)
@@ -37,6 +37,7 @@
 #include <gtkmm2ext/click_box.h>
 #include <gtkmm2ext/focus_entry.h>
 #include <gtkmm2ext/slider_controller.h>
+#include <gtkmm2ext/fastmeter.h>
 
 #include "enums.h"
 
@@ -44,18 +45,16 @@ namespace ARDOUR {
        class Session;
        class PeakMeter;
 }
-namespace Gtkmm2ext {
-       class FastMeter;
-}
 namespace Gtk {
        class Menu;
 }
 
-class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
+class LevelMeterBase : public ARDOUR::SessionHandlePtr, virtual public sigc::trackable
 {
   public:
-       LevelMeter (ARDOUR::Session*);
-       ~LevelMeter ();
+       LevelMeterBase (ARDOUR::Session*, PBD::EventLoop::InvalidationRecord* ir,
+                       Gtkmm2ext::FastMeter::Orientation o = Gtkmm2ext::FastMeter::Vertical);
+       virtual ~LevelMeterBase ();
 
        virtual void set_meter (ARDOUR::PeakMeter* meter);
 
@@ -66,16 +65,24 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
        void clear_meters (bool reset_highlight = true);
        void hide_meters ();
        void setup_meters (int len=0, int width=3, int thin=2);
+       void set_max_audio_meter_count (uint32_t cnt = 0);
 
        void set_type (ARDOUR::MeterType);
        ARDOUR::MeterType get_type () { return meter_type; }
 
        /** Emitted in the GUI thread when a button is pressed over the meter */
        PBD::Signal1<bool, GdkEventButton *> ButtonPress;
+       PBD::Signal1<bool, GdkEventButton *> ButtonRelease;
        PBD::Signal1<void, ARDOUR::MeterType> MeterTypeChanged;
 
+       protected:
+       virtual void mtr_pack(Gtk::Widget &w) = 0;
+       virtual void mtr_remove(Gtk::Widget &w) = 0;
+
   private:
+       PBD::EventLoop::InvalidationRecord* parent_invalidator;
        ARDOUR::PeakMeter* _meter;
+       Gtkmm2ext::FastMeter::Orientation _meter_orientation;
 
        Width _width;
 
@@ -101,6 +108,9 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
        std::vector<MeterInfo> meters;
        float                  max_peak;
        ARDOUR::MeterType      meter_type;
+       ARDOUR::MeterType      visible_meter_type;
+       uint32_t               meter_count;
+       uint32_t               max_visible_meters;
 
        PBD::ScopedConnection _configuration_connection;
        PBD::ScopedConnection _meter_type_connection;
@@ -114,11 +124,31 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
        void configuration_changed (ARDOUR::ChanCount in, ARDOUR::ChanCount out);
        void meter_type_changed (ARDOUR::MeterType);
 
-       void on_theme_changed ();
-       bool style_changed;
        bool color_changed;
        void color_handler ();
 };
 
+class LevelMeterHBox : public LevelMeterBase, public Gtk::HBox
+{
+  public:
+       LevelMeterHBox (ARDOUR::Session*);
+       ~LevelMeterHBox();
+
+       protected:
+       void mtr_pack(Gtk::Widget &w);
+       void mtr_remove(Gtk::Widget &w);
+};
+
+class LevelMeterVBox : public LevelMeterBase, public Gtk::VBox
+{
+  public:
+       LevelMeterVBox (ARDOUR::Session*);
+       ~LevelMeterVBox();
+
+       protected:
+       void mtr_pack(Gtk::Widget &w);
+       void mtr_remove(Gtk::Widget &w);
+};
+
 #endif /* __ardour_gtk_track_meter_h__ */