reduce actual size of tool_cut.png to avoid blowing up h-padding on all other tool...
[ardour.git] / gtk2_ardour / mixer_strip.cc
index a0f9f241987bb133d8c8e45d25c05571b295a0f7..d21efb2a75131e242277e12e1b52c245026f8365 100644 (file)
@@ -37,6 +37,7 @@
 #include "ardour/audio_track.h"
 #include "ardour/audioengine.h"
 #include "ardour/internal_send.h"
+#include "ardour/meter.h"
 #include "ardour/midi_track.h"
 #include "ardour/pannable.h"
 #include "ardour/panner.h"
@@ -68,6 +69,7 @@
 #include "i18n.h"
 
 using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
 using namespace PBD;
 using namespace Gtk;
 using namespace Gtkmm2ext;
@@ -90,7 +92,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
        , rec_solo_table (2, 2)
        , top_button_table (1, 2)
        , middle_button_table (1, 2)
-       , bottom_button_table (1, 2)
+       , bottom_button_table (1, 3)
        , meter_point_button (_("pre"))
        , midi_input_enable_button (0)
        , _comment_button (_("Comments"))
@@ -118,7 +120,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt
        , button_size_group (Gtk::SizeGroup::create (Gtk::SIZE_GROUP_HORIZONTAL))
        , button_table (3, 1)
        , middle_button_table (1, 2)
-       , bottom_button_table (1, 2)
+       , bottom_button_table (1, 3)
        , meter_point_button (_("pre"))
        , midi_input_enable_button (0)
        , _comment_button (_("Comments"))
@@ -131,6 +133,8 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt
 void
 MixerStrip::init ()
 {
+       int button_table_row = 0;
+
        input_selector = 0;
        output_selector = 0;
        group_menu = 0;
@@ -173,7 +177,7 @@ MixerStrip::init ()
        */
        set_size_request_to_display_given_text (meter_point_button, _("tupni"), 5, 5);
 
-       bottom_button_table.attach (meter_point_button, 1, 2, 0, 1);
+       bottom_button_table.attach (meter_point_button, 2, 3, 0, 1);
 
        meter_point_button.signal_button_press_event().connect (sigc::mem_fun (gpm, &GainMeter::meter_press), false);
        meter_point_button.signal_button_release_event().connect (sigc::mem_fun (gpm, &GainMeter::meter_release), false);
@@ -206,15 +210,19 @@ MixerStrip::init ()
 
        top_button_table.set_homogeneous (true);
        top_button_table.set_spacings (2);
-       top_button_table.attach (*monitor_input_button, 0, 1, 0, 1);
-        top_button_table.attach (*monitor_disk_button, 1, 2, 0, 1);
+       if (!ARDOUR::Profile->get_trx()) {
+               top_button_table.attach (*monitor_input_button, 0, 1, 0, 1);
+               top_button_table.attach (*monitor_disk_button, 1, 2, 0, 1);
+       }
        top_button_table.show ();
 
        rec_solo_table.set_homogeneous (true);
        rec_solo_table.set_row_spacings (2);
        rec_solo_table.set_col_spacings (2);
-        rec_solo_table.attach (*solo_isolated_led, 1, 2, 0, 1);
-        rec_solo_table.attach (*solo_safe_led, 1, 2, 1, 2);
+       if (!ARDOUR::Profile->get_trx()) {
+               rec_solo_table.attach (*solo_isolated_led, 1, 2, 0, 1);
+               rec_solo_table.attach (*solo_safe_led, 1, 2, 1, 2);
+       }
         rec_solo_table.show ();
 
        button_table.set_homogeneous (false);
@@ -236,17 +244,24 @@ MixerStrip::init ()
                button_size_group->add_widget (*monitor_input_button);
        }
 
-       button_table.attach (name_button, 0, 1, 0, 1);
-       button_table.attach (input_button_box, 0, 1, 1, 2);
-       button_table.attach (_invert_button_box, 0, 1, 2, 3);
+       if (!ARDOUR::Profile->get_trx()) {
+               button_table.attach (name_button, 0, 1, button_table_row, button_table_row+1);
+               button_table_row++;
+               button_table.attach (input_button_box, 0, 2, button_table_row, button_table_row+1);
+               button_table_row++;
+               button_table.attach (_invert_button_box, 0, 2, button_table_row, button_table_row+1);
+               button_table_row++;
+       }
 
        middle_button_table.set_homogeneous (true);
        middle_button_table.set_spacings (2);
 
        bottom_button_table.set_spacings (2);
-       bottom_button_table.set_homogeneous (true);
-//     bottom_button_table.attach (group_button, 0, 1, 0, 1);
-       bottom_button_table.attach (gpm.gain_automation_state_button, 0, 1, 0, 1);
+       bottom_button_table.set_homogeneous (false);
+       button_table_row = 0;
+       bottom_button_table.attach (group_button, 0, 1, button_table_row, button_table_row+1);
+       bottom_button_table.attach (gpm.gain_automation_state_button, 1, 2, button_table_row, button_table_row+1);
+       button_table_row++;
 
        name_button.set_name ("mixer strip button");
        name_button.set_text (" "); /* non empty text, forces creation of the layout */
@@ -277,20 +292,34 @@ MixerStrip::init ()
        width_hide_box.pack_start (top_event_box, true, true);
        width_hide_box.pack_end (hide_button, false, true);
 
+       number_label.set_text ("-");
+       number_label.set_no_show_all ();
+       number_label.set_name ("tracknumber label");
+       number_label.set_fixed_colors (0x80808080, 0x80808080);
+       number_label.set_elements (ArdourButton::Element(ArdourButton::Body | ArdourButton::Text));
+       number_label.set_alignment (.5, .5);
+       top_event_box.add (number_label);
+
        whvbox.pack_start (width_hide_box, true, true);
 
        global_vpacker.set_spacing (2);
-       global_vpacker.pack_start (whvbox, Gtk::PACK_SHRINK);
-       global_vpacker.pack_start (button_table, Gtk::PACK_SHRINK);
-       global_vpacker.pack_start (processor_box, true, true);
+       if (!ARDOUR::Profile->get_trx()) {
+               global_vpacker.pack_start (whvbox, Gtk::PACK_SHRINK);
+               global_vpacker.pack_start (button_table, Gtk::PACK_SHRINK);
+               global_vpacker.pack_start (processor_box, true, true);
+       }
        global_vpacker.pack_start (panners, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (top_button_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (rec_solo_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (middle_button_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (bottom_button_table, Gtk::PACK_SHRINK);
-       global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
-       global_vpacker.pack_start (_comment_button, Gtk::PACK_SHRINK);
+       if (!ARDOUR::Profile->get_trx()) {
+               global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
+               global_vpacker.pack_start (_comment_button, Gtk::PACK_SHRINK);
+       } else {
+               global_vpacker.pack_start (name_button, Gtk::PACK_SHRINK);
+       }
 
        global_frame.add (global_vpacker);
        global_frame.set_shadow_type (Gtk::SHADOW_IN);
@@ -314,6 +343,7 @@ MixerStrip::init ()
 
        /* ditto for this button and busses */
 
+       number_label.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::name_button_button_press), false);
        name_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::name_button_button_press), false);
        group_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::select_route_group), false);
 
@@ -359,6 +389,7 @@ MixerStrip::init ()
        parameter_changed (X_("mixer-strip-visibility"));
 
        Config->ParameterChanged.connect (_config_connection, MISSING_INVALIDATOR, boost::bind (&MixerStrip::parameter_changed, this, _1), gui_context());
+       _session->config.ParameterChanged.connect (_config_connection, MISSING_INVALIDATOR, boost::bind (&MixerStrip::parameter_changed, this, _1), gui_context());
 
        gpm.LevelMeterButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&MixerStrip::level_meter_button_press, this, _1));
 }
@@ -496,6 +527,10 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
                rec_enable_button->set_sensitive (_session->writable());
                rec_enable_button->show();
 
+               if (ARDOUR::Profile->get_trx()) {
+                       rec_solo_table.attach (*monitor_input_button, 1, 2, 0, 2);
+               }
+
        } else {
 
                /* non-master bus */
@@ -560,12 +595,14 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
        if (!route()->is_master() && !route()->is_monitor()) {
                /* we don't allow master or control routes to be hidden */
                hide_button.show();
+               number_label.show();
        }
 
        gpm.reset_peak_display ();
        gpm.gain_display.show ();
        gpm.peak_display.show ();
 
+       top_event_box.show();
        width_button.show();
        width_hide_box.show();
        whvbox.show ();
@@ -992,18 +1029,11 @@ MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR
 void
 MixerStrip::update_diskstream_display ()
 {
-       if (is_track()) {
+        if (is_track() && input_selector) {
+                        input_selector->hide_all ();
+        }
 
-               if (input_selector) {
-                       input_selector->hide_all ();
-               }
-
-               route_color_changed ();
-
-       } else {
-
-               show_passthru_color ();
-       }
+        route_color_changed ();
 }
 
 void
@@ -1033,6 +1063,7 @@ MixerStrip::connect_to_pan ()
        if (panners._panner == 0) {
                panners.panshell_changed ();
        }
+       update_panner_choices();
 }
 
 void
@@ -1041,29 +1072,13 @@ MixerStrip::update_panner_choices ()
        ENSURE_GUI_THREAD (*this, &MixerStrip::update_panner_choices)
        if (!_route->panner_shell()) { return; }
 
-       int in = _route->output()->n_ports().n_audio();
-       int out = in;
-
+       uint32_t in = _route->output()->n_ports().n_audio();
+       uint32_t out = in;
        if (_route->panner()) {
                in = _route->panner()->in().n_audio();
        }
 
-       if (out < 2 || in == 0) {
-               panners.set_available_panners(_route, std::map<std::string,std::string>());
-               return;
-       }
-
-       std::map<std::string,std::string> panner_list;
-       std::list<PannerInfo*> panner_info = PannerManager::instance().panner_info;
-       /* get available panners for current configuration. */
-       for (list<PannerInfo*>::iterator p = panner_info.begin(); p != panner_info.end(); ++p) {
-                PanPluginDescriptor* d = &(*p)->descriptor;
-                if (d->in != -1 && d->in != in) continue;
-                if (d->out != -1 && d->out != out) continue;
-                if (d->in == -1 && d->out == -1 && out <= 2) continue;
-                panner_list.insert(std::pair<std::string,std::string>(d->panner_uri,d->name));
-       }
-       panners.set_available_panners(_route, panner_list);
+       panners.set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out));
 }
 
 /*
@@ -1495,6 +1510,7 @@ MixerStrip::route_color_changed ()
 {
        name_button.modify_bg (STATE_NORMAL, color());
        top_event_box.modify_bg (STATE_NORMAL, color());
+       number_label.set_fixed_colors (gdk_color_to_rgba (color()), gdk_color_to_rgba (color()));
        reset_strip_style ();
 }
 
@@ -1524,6 +1540,7 @@ MixerStrip::build_route_ops_menu ()
        items.push_back (CheckMenuElem (_("Active")));
        Gtk::CheckMenuItem* i = dynamic_cast<Gtk::CheckMenuItem *> (&items.back());
        i->set_active (_route->active());
+       i->set_sensitive(! _session->transport_rolling());
        i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::set_route_active), !_route->active(), false));
 
        items.push_back (SeparatorElem());
@@ -1598,10 +1615,28 @@ MixerStrip::name_changed ()
 {
        switch (_width) {
        case Wide:
+               if (_session->config.get_track_name_number()) {
+                       const int64_t track_number = _route->track_number ();
+                       if (track_number == 0) {
+                               number_label.set_text ("-");
+                               number_label.hide();
+                       } else {
+                               number_label.set_text (PBD::to_string (abs(_route->track_number ()), std::dec));
+                               number_label.show();
+                       }
+               } else {
+                       number_label.hide();
+               }
                name_button.set_text (_route->name());
                break;
        case Narrow:
-               name_button.set_text (PBD::short_version (_route->name(), 5));
+               number_label.hide();
+               if (_session->config.get_track_name_number()) {
+                       name_button.set_markup(track_number_to_string (_route->track_number (), " ",
+                                               PBD::short_version (_route->name (), 5)));
+               } else {
+                       name_button.set_text (PBD::short_version (_route->name(), 5));
+               }
                break;
        }
 
@@ -1885,24 +1920,21 @@ MixerStrip::show_send (boost::shared_ptr<Send> send)
 
        set_current_delivery (send);
 
+       send->meter()->set_type(_route->shared_peak_meter()->get_type());
        send->set_metering (true);
        _current_delivery->DropReferences.connect (send_gone_connection, invalidator (*this), boost::bind (&MixerStrip::revert_to_default_display, this), gui_context());
 
        gain_meter().set_controls (_route, send->meter(), send->amp());
        gain_meter().setup_meters ();
 
-       panner_ui().set_panner (_current_delivery->panner_shell(), _current_delivery->panner());
-       panner_ui().set_available_panners(boost::shared_ptr<ARDOUR::Route>(), std::map<std::string,std::string>());
+       uint32_t const in = _current_delivery->pans_required();
+       uint32_t const out = _current_delivery->pan_outs();
 
+       panner_ui().set_panner (_current_delivery->panner_shell(), _current_delivery->panner());
+       panner_ui().set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out));
        panner_ui().setup_pan ();
-
-       /* make sure the send has audio output */
-
-       if (_current_delivery->output() && _current_delivery->output()->n_ports().n_audio() > 0) {
-               panners.show_all ();
-       } else {
-               panners.hide_all ();
-       }
+       panner_ui().set_send_drawing_mode (true);
+       panner_ui().show_all ();
 
        input_button.set_sensitive (false);
        group_button.set_sensitive (false);
@@ -1937,6 +1969,7 @@ MixerStrip::revert_to_default_display ()
        panner_ui().set_panner (_route->main_outs()->panner_shell(), _route->main_outs()->panner());
        update_panner_choices();
        panner_ui().setup_pan ();
+       panner_ui().set_send_drawing_mode (false);
 
        if (has_audio_outputs ()) {
                panners.show_all ();
@@ -2077,6 +2110,9 @@ MixerStrip::parameter_changed (string p)
                */
                _visibility.set_state (Config->get_mixer_strip_visibility ());
        }
+       else if (p == "track-name-number") {
+               name_changed ();
+       }
 }
 
 /** Called to decide whether the solo isolate / solo lock button visibility should
@@ -2157,6 +2193,9 @@ MixerStrip::ab_plugins ()
 bool
 MixerStrip::level_meter_button_press (GdkEventButton* ev)
 {
+       if (_current_delivery && boost::dynamic_pointer_cast<Send>(_current_delivery)) {
+               return false;
+       }
        if (ev->button == 3) {
                popup_level_meter_menu (ev);
                return true;
@@ -2177,8 +2216,8 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev)
 
        _suspend_menu_callbacks = true;
        add_level_meter_item_point (items, group, _("Input"), MeterInput);
-       add_level_meter_item_point (items, group, _("Pre-fader"), MeterPreFader);
-       add_level_meter_item_point (items, group, _("Post-fader"), MeterPostFader);
+       add_level_meter_item_point (items, group, _("Pre Fader"), MeterPreFader);
+       add_level_meter_item_point (items, group, _("Post Fader"), MeterPostFader);
        add_level_meter_item_point (items, group, _("Output"), MeterOutput);
        add_level_meter_item_point (items, group, _("Custom"), MeterCustom);