X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmeterbridge.h;h=b741f6fd74f9f67c31cc9c55fb503ee25ecdfd72;hb=38e94875647782fa6c28e25be471f0cff6c97d2a;hp=b8e6fc0c79a264ca1dde2e6837c3fb1a56d251dd;hpb=40493e06eed6bcf8fdda4105f0adb4a9cd01eccf;p=ardour.git diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h index b8e6fc0c79..b741f6fd74 100644 --- a/gtk2_ardour/meterbridge.h +++ b/gtk2_ardour/meterbridge.h @@ -20,6 +20,8 @@ #ifndef __ardour_meterbridge_h__ #define __ardour_meterbridge_h__ +#include + #include #include #include @@ -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; @@ -73,21 +78,55 @@ class Meterbridge : void add_strips (ARDOUR::RouteList&); void remove_strip (MeterStrip *); - void update_metrics (); - - void reset_all_peaks (); - void reset_group_peaks (ARDOUR::RouteGroup*); void session_going_away (); - void sync_order_keys (ARDOUR::RouteSortOrderKey src); - - std::list 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 a = ma.s->route(); + boost::shared_ptr 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 strips; + + MeterStrip metrics_left; + MeterStrip metrics_right; + std::vector _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 (); @@ -99,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