correct check for presence of / or \ in a session name
[ardour.git] / gtk2_ardour / gain_meter.h
index 1673e8ca073489a0be6858f27e74df8f65c003e4..3e025656c5109b21c7e6fd436f73ceef0f1e939f 100644 (file)
@@ -38,6 +38,7 @@
 #include <gtkmm2ext/slider_controller.h>
 
 #include "enums.h"
+#include "level_meter.h"
 
 namespace ARDOUR {
        class IO;
@@ -53,46 +54,44 @@ namespace Gtk {
        class Menu;
 }
 
-class GainMeter : public Gtk::VBox
+class GainMeterBase : virtual public sigc::trackable
 {
   public:
-       GainMeter (boost::shared_ptr<ARDOUR::IO>, ARDOUR::Session&);
-       ~GainMeter ();
+       GainMeterBase ( ARDOUR::Session&, const Glib::RefPtr<Gdk::Pixbuf>& pix,
+                      bool horizontal);
+       virtual ~GainMeterBase ();
 
-       void update_gain_sensitive ();
+       virtual void set_io (boost::shared_ptr<ARDOUR::IO>);
 
+       void update_gain_sensitive ();
        void update_meters ();
-       void update_meters_falloff ();
-
        void effective_gain_display ();
-
        void set_width (Width, int len=0);
-       void setup_meters (int len=0);
-
-       int get_gm_width ();
-
        void set_meter_strip_name (const char * name);
        void set_fader_name (const char * name);
-       PBD::Controllable& get_controllable() { return _io->gain_control(); }
 
-       void clear_meters ();
+       virtual void setup_meters (int len=0);
 
-  private:
+       PBD::Controllable& get_controllable() { return _io->gain_control(); }
+       LevelMeter& get_level_meter() const { return *level_meter; }
+       Gtkmm2ext::SliderController& get_gain_slider() const { return *gain_slider; }
+       
+  protected:
 
        friend class MixerStrip;
        boost::shared_ptr<ARDOUR::IO> _io;
        ARDOUR::Session& _session;
+       std::vector<sigc::connection> connections;
 
        bool ignore_toggle;
        bool next_release_selects;
 
-       Gtkmm2ext::VSliderController *gain_slider;
+       Gtkmm2ext::SliderController *gain_slider;
        Gtk::Adjustment              gain_adjustment;
        Gtkmm2ext::FocusEntry        gain_display;
        Gtk::Button                  peak_display;
-       Gtk::HBox                    gain_display_box;
-       Gtk::HBox                    fader_box;
        Gtk::DrawingArea             meter_metric_area;
+       LevelMeter                  *level_meter;
 
        sigc::connection gain_watching;
 
@@ -120,48 +119,21 @@ class GainMeter : public Gtk::VBox
 
        Width _width;
 
-       static std::map<std::string,Glib::RefPtr<Gdk::Pixmap> > metric_pixmaps;
-       static Glib::RefPtr<Gdk::Pixmap> render_metrics (Gtk::Widget&);
-
-       gint meter_metrics_expose (GdkEventExpose *);
-
        void show_gain ();
        void gain_activated ();
        bool gain_focused (GdkEventFocus*);
 
-       struct MeterInfo {
-           Gtkmm2ext::FastMeter *meter;
-           gint16          width;
-               int                             length;   
-           bool            packed;
-           
-           MeterInfo() { 
-                   meter = 0;
-                   width = 0;
-                       length = 0;
-                   packed = false;
-           }
-       };
-
-       guint16 regular_meter_width;
-       static const guint16 thin_meter_width = 2;
-       vector<MeterInfo>    meters;
        float       max_peak;
        
-       Gtk::VBox*   fader_vbox;
-       Gtk::HBox   hbox;
-       Gtk::HBox   meter_packer;
-
        void gain_adjusted ();
        void gain_changed (void *);
        
        void meter_point_clicked ();
        void gain_unit_changed ();
        
-       void hide_all_meters ();
+       virtual void hide_all_meters ();
 
        gint meter_button_press (GdkEventButton*, uint32_t);
-       gint meter_button_release (GdkEventButton*, uint32_t);
 
        bool peak_button_release (GdkEventButton*);
        bool gain_key_press (GdkEventKey*);
@@ -187,10 +159,6 @@ class GainMeter : public Gtk::VBox
        static sigc::signal<void> ResetAllPeakDisplays;
        static sigc::signal<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
 
-       static Glib::RefPtr<Gdk::Pixbuf> slider;
-       static Glib::RefPtr<Gdk::Pixbuf> rail;
-       static int setup_slider_pix ();
-
        void on_theme_changed ();
        bool style_changed;
        bool dpi_changed;
@@ -198,5 +166,35 @@ class GainMeter : public Gtk::VBox
        void color_handler(bool);
 };
 
+class GainMeter : public GainMeterBase, public Gtk::VBox
+{
+  public:
+       GainMeter (ARDOUR::Session&);
+       ~GainMeter () {}
+
+       void set_io (boost::shared_ptr<ARDOUR::IO>);
+
+       int get_gm_width ();
+       void setup_meters (int len=0);
+
+       static void setup_slider_pix ();
+
+  protected:
+       void hide_all_meters ();
+
+       gint meter_metrics_expose (GdkEventExpose *);
+
+       static std::map<std::string,Glib::RefPtr<Gdk::Pixmap> > metric_pixmaps;
+       static Glib::RefPtr<Gdk::Pixmap> render_metrics (Gtk::Widget&);
+
+  private:
+       Gtk::HBox  gain_display_box;
+       Gtk::HBox  fader_box;
+       Gtk::VBox* fader_vbox;
+       Gtk::HBox  hbox;
+
+       static Glib::RefPtr<Gdk::Pixbuf> slider;
+};
+
 #endif /* __ardour_gtk_gain_meter_h__ */