Only show user-presets in favorite sidebar
[ardour.git] / gtk2_ardour / meterbridge.h
index 43fdef3c42c65f42e0b608e7630361f4ced7a2dc..b741f6fd74f9f67c31cc9c55fb503ee25ecdfd72 100644 (file)
@@ -20,6 +20,8 @@
 #ifndef __ardour_meterbridge_h__
 #define __ardour_meterbridge_h__
 
+#include <glibmm/thread.h>
+
 #include <gtkmm/box.h>
 #include <gtkmm/scrolledwindow.h>
 #include <gtkmm/label.h>
@@ -42,7 +44,7 @@ class Meterbridge :
        public ARDOUR::SessionHandlePtr,
        public Gtkmm2ext::VisibilityTracker
 {
-  public:
+public:
        static Meterbridge* instance();
        ~Meterbridge();
 
@@ -54,14 +56,17 @@ class Meterbridge :
        void show_window ();
        bool hide_window (GdkEventAny *ev);
 
-  private:
+private:
        Meterbridge ();
        static Meterbridge* _instance;
 
        bool _visible;
        bool _show_busses;
+       bool _show_master;
+       bool _show_midi;
 
        Gtk::ScrolledWindow scroller;
+       Gtk::HBox meterarea;
        Gtk::HBox global_hpacker;
        Gtk::VBox global_vpacker;
 
@@ -75,15 +80,53 @@ class Meterbridge :
        void remove_strip (MeterStrip *);
 
        void session_going_away ();
-       void sync_order_keys (ARDOUR::RouteSortOrderKey src);
-
-       std::list<MeterStrip *> strips;
-
-       MeterStrip *metrics_left;
-       MeterStrip *metrics_right;
+       void sync_order_keys ();
+       void resync_order ();
+       mutable Glib::Threads::Mutex _resync_mutex;
+
+       struct MeterBridgeStrip {
+               MeterStrip *s;
+               bool visible;
+
+               MeterBridgeStrip(MeterStrip *ss) {
+                       s = ss;
+                       visible = true;
+               }
+       };
+
+       struct MeterOrderRouteSorter
+       {
+               bool operator() (struct MeterBridgeStrip ma, struct MeterBridgeStrip mb) {
+                       boost::shared_ptr<ARDOUR::Route> a = ma.s->route();
+                       boost::shared_ptr<ARDOUR::Route> b = mb.s->route();
+                       if (a->is_master() || a->is_monitor()) {
+                               /* "a" is a special route (master, monitor, etc), and comes
+                                * last in the mixer ordering
+                                */
+                               return false;
+                       } else if (b->is_master() || b->is_monitor()) {
+                               /* everything comes before b */
+                               return true;
+                       }
+                       return ARDOUR::Stripable::Sorter (true) (a, b);
+               }
+       };
+
+       std::list<MeterBridgeStrip> strips;
+
+       MeterStrip metrics_left;
+       MeterStrip metrics_right;
+       std::vector<MeterStrip *> _metrics;
+
+       Gtk::VBox metrics_vpacker_left;
+       Gtk::VBox metrics_vpacker_right;
+       Gtk::HBox metrics_spacer_left;
+       Gtk::HBox metrics_spacer_right;
 
        static const int32_t default_width = 600;
        static const int32_t default_height = 400;
+       static const int max_height = 1200; // == 1024 + 148 + 16 + 12 see meter_strip.cc
+       int cur_max_width;
 
        void update_title ();
 
@@ -95,8 +138,22 @@ class Meterbridge :
 
        bool on_key_press_event (GdkEventKey*);
        bool on_key_release_event (GdkEventKey*);
+       bool on_scroll_event (GdkEventScroll*);
+
+       void scroll_left ();
+       void scroll_right ();
+
+       void on_size_allocate (Gtk::Allocation&);
+       void on_size_request (Gtk::Requisition*);
 
        void parameter_changed (std::string const & p);
+       void on_theme_changed ();
+
+       void on_scroll ();
+       sigc::connection scroll_connection;
+
+       int _mm_left, _mm_right;
+       ARDOUR::MeterType _mt_left, _mt_right;
 };
 
 #endif