Cope with drags of selections that include regions on hidden tracks (#3493).
[ardour.git] / gtk2_ardour / mixer_strip.cc
index e4d9b4058a596f8043d03d9977a95889ff78e1b4..5ce4caa3af1b74866a95e2073aa5fab38ccc17e8 100644 (file)
@@ -87,6 +87,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
        , panners (sess)
        , button_table (3, 1)
        , solo_led_table (2, 2)
+       , top_button_table (1, 2)
        , middle_button_table (1, 2)
        , bottom_button_table (1, 2)
        , meter_point_label (_("pre"))
@@ -184,6 +185,9 @@ MixerStrip::init ()
        mute_button->set_name ("MixerMuteButton");
        solo_button->set_name ("MixerSoloButton");
 
+       monitor_input_button->set_name ("MixerMonitorInputButton");
+       monitor_disk_button->set_name ("MixerMonitorInputButton");
+
         solo_isolated_led = manage (new LED);
         solo_isolated_led->show ();
         solo_isolated_led->set_diameter (6);
@@ -217,8 +221,14 @@ MixerStrip::init ()
         solo_led_table.attach (*solo_isolated_led, 1, 2, 0, 1, Gtk::FILL, Gtk::FILL);
        solo_led_table.attach (*_safe_label, 0, 1, 1, 2, Gtk::FILL, Gtk::FILL);
         solo_led_table.attach (*solo_safe_led, 1, 2, 1, 2, Gtk::FILL, Gtk::FILL);
-
         solo_led_table.show ();
+
+       top_button_table.set_homogeneous (true);
+       top_button_table.set_spacings (0);
+       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 ();
+
        below_panner_box.set_border_width (2);
        below_panner_box.set_spacing (2);
         below_panner_box.pack_end (solo_led_table, false, false);
@@ -271,6 +281,7 @@ MixerStrip::init ()
        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 (below_panner_box, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (middle_button_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
@@ -334,7 +345,7 @@ MixerStrip::init ()
        SwitchIO.connect (sigc::mem_fun (*this, &MixerStrip::switch_io));
 
        AudioEngine::instance()->PortConnectedOrDisconnected.connect (
-               *this, invalidator (*this), boost::bind (&MixerStrip::port_connected_or_disconnected, this, _1, _2), gui_context ()
+               *this, invalidator (*this), boost::bind (&MixerStrip::port_connected_or_disconnected, this, _1, _3), gui_context ()
                );
 }
 
@@ -396,6 +407,14 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
                global_vpacker.pack_start (*spacer, false, false);
        }
 
+       if (is_track()) {
+               monitor_input_button->show ();
+               monitor_disk_button->show ();
+       } else {
+               monitor_input_button->hide();
+               monitor_disk_button->hide ();
+       }
+
        if (is_midi_track()) {
                if (midi_input_enable_button == 0) {
                        Image* img = manage (new Image (get_icon (X_("midi_socket_small"))));
@@ -1643,6 +1662,8 @@ MixerStrip::drop_send ()
        rec_enable_button->set_sensitive (true);
        solo_isolated_led->set_sensitive (true);
        solo_safe_led->set_sensitive (true);
+       monitor_input_button->set_sensitive (true);
+       monitor_disk_button->set_sensitive (true);
 }
 
 void
@@ -1679,6 +1700,8 @@ MixerStrip::show_send (boost::shared_ptr<Send> send)
        rec_enable_button->set_sensitive (false);
        solo_isolated_led->set_sensitive (false);
        solo_safe_led->set_sensitive (false);
+       monitor_input_button->set_sensitive (false);
+       monitor_disk_button->set_sensitive (false);
 
        if (boost::dynamic_pointer_cast<InternalSend>(send)) {
                output_button.set_sensitive (false);
@@ -1714,6 +1737,8 @@ MixerStrip::set_button_names ()
        case Wide:
                rec_enable_button_label.set_text (_("Rec"));
                mute_button_label.set_text (_("Mute"));
+               monitor_input_button_label.set_text (_("In"));
+               monitor_disk_button_label.set_text (_("Disk"));
                if (_route && _route->solo_safe()) {
                        solo_button_label.set_text (X_("!"));
                } else {
@@ -1735,6 +1760,8 @@ MixerStrip::set_button_names ()
        default:
                rec_enable_button_label.set_text (_("R"));
                mute_button_label.set_text (_("M"));
+               monitor_input_button_label.set_text (_("I"));
+               monitor_disk_button_label.set_text (_("D"));
                if (_route && _route->solo_safe()) {
                        solo_button_label.set_text (X_("!"));
                        if (!Config->get_solo_control_is_listen_control()) {
@@ -1880,7 +1907,7 @@ MixerStrip::hide_things ()
 }
 
 bool
-MixerStrip::input_active_button_press (GdkEventButton* ev)
+MixerStrip::input_active_button_press (GdkEventButton*)
 {
        /* nothing happens on press */
        return true;