Make Dropdown menus at least as wide as the button
[ardour.git] / gtk2_ardour / meterbridge.cc
index aaf1842c79e077b2370650a7c04e429a82d201ea..02350c92bf114345012bfc95a092c4b30a1b5219 100644 (file)
@@ -40,7 +40,6 @@
 
 #include "ardour/audio_track.h"
 #include "ardour/midi_track.h"
-#include "ardour/route_sorters.h"
 
 #include "meterbridge.h"
 
 #include "route_sorter.h"
 #include "actions.h"
 #include "gui_thread.h"
-#include "global_signals.h"
 #include "meter_patterns.h"
 #include "timers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -125,7 +123,6 @@ Meterbridge::Meterbridge ()
 
        signal_delete_event().connect (sigc::mem_fun (*this, &Meterbridge::hide_window));
        signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
-       Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this), gui_context());
        MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context());
        MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context());
        MeterStrip::ConfigurationChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::queue_resize, this), gui_context());
@@ -174,8 +171,8 @@ Meterbridge::Meterbridge ()
        viewport->set_border_width(0);
 
        UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &Meterbridge::on_theme_changed));
-       ColorsChanged.connect (sigc::mem_fun (*this, &Meterbridge::on_theme_changed));
-       DPIReset.connect (sigc::mem_fun (*this, &Meterbridge::on_theme_changed));
+       UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &Meterbridge::on_theme_changed));
+       UIConfiguration::instance().DPIReset.connect (sigc::mem_fun (*this, &Meterbridge::on_theme_changed));
 }
 
 Meterbridge::~Meterbridge ()
@@ -257,7 +254,7 @@ Meterbridge::on_key_press_event (GdkEventKey* ev)
        if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
                return true;
        }
-       return forward_key_press (ev);
+       return relay_key_press (ev, this);
 }
 
 bool
@@ -401,6 +398,22 @@ Meterbridge::on_scroll()
        metrics_right.set_metric_mode(mm_right, mt_right);
 }
 
+struct PresentationInfoRouteSorter
+{
+       bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
+               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 a->presentation_info().order() < b->presentation_info().order();
+       }
+};
+
 void
 Meterbridge::set_session (Session* s)
 {
@@ -423,12 +436,11 @@ Meterbridge::set_session (Session* s)
        _show_master = _session->config.get_show_master_on_meterbridge();
        _show_midi = _session->config.get_show_midi_on_meterbridge();
 
-       ARDOUR::SignalOrderRouteSorter sorter;
        boost::shared_ptr<RouteList> routes = _session->get_routes();
 
-       RouteList copy(*routes);
-       copy.sort(sorter);
-       add_strips(copy);
+       RouteList copy (*routes);
+       copy.sort (PresentationInfoRouteSorter());
+       add_strips (copy);
 
        _session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Meterbridge::add_strips, this, _1), gui_context());
        _session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Meterbridge::update_title, this), gui_context());
@@ -464,7 +476,7 @@ Meterbridge::session_going_away ()
 int
 Meterbridge::set_state (const XMLNode& node)
 {
-       const XMLProperty* prop;
+       XMLProperty const * prop;
        XMLNode* geometry;
 
        m_width = default_width;
@@ -474,7 +486,7 @@ Meterbridge::set_state (const XMLNode& node)
 
        if ((geometry = find_named_node (node, "geometry")) != 0) {
 
-               XMLProperty* prop;
+               XMLProperty const * prop;
 
                if ((prop = geometry->property("x_size")) == 0) {
                        prop = geometry->property ("x-size");