Grey-out patch changes on inactive channels rather than not
[ardour.git] / gtk2_ardour / editor_selection.cc
index fe9351606366cbf90a64625681b6788935de3fad..eb67fb363125d956ed9fcd88597ccba2527b812d 100644 (file)
 
 #include "pbd/stacktrace.h"
 
-#include "ardour/session.h"
+#include "ardour/midi_region.h"
 #include "ardour/playlist.h"
-#include "ardour/route_group.h"
 #include "ardour/profile.h"
-#include "ardour/midi_region.h"
-#include "ardour/audioplaylist.h"
+#include "ardour/route_group.h"
+#include "ardour/session.h"
 
 #include "control_protocol/control_protocol.h"
 
@@ -264,7 +263,6 @@ Editor::set_selected_track_as_side_effect (Selection::Operation op)
 
        case Selection::Extend:
                selection->clear();
-               cerr << ("Editor::set_selected_track_as_side_effect  case  Selection::Add  not yet implemented\n");
                break;
        }
 }
@@ -320,19 +318,39 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation
                return false;
        }
 
-       if (!press) {
-               return true;
-       }
-
        switch (op) {
        case Selection::Set:
-               selection->set (clicked_control_point);
+               if (press) {
+                       selection->set (clicked_control_point);
+               }
                break;
        case Selection::Add:
-               selection->add (clicked_control_point);
+               if (press) {
+                       selection->add (clicked_control_point);
+               }
                break;
        case Selection::Toggle:
-               selection->toggle (clicked_control_point);
+               /* This is a bit of a hack; if we Primary-Click-Drag a control
+                  point (for push drag) we want the point we clicked on to be
+                  selected, otherwise we end up confusingly dragging an
+                  unselected point.  So here we ensure that the point is selected
+                  after the press, and if we subsequently get a release (meaning no
+                  drag occurred) we set things up so that the toggle has happened.
+               */
+               if (press && !selection->selected (clicked_control_point)) {
+                       /* This is the button press, and the control point is not selected; make it so,
+                          in case this press leads to a drag.  Also note that having done this, we don't
+                          need to toggle again on release.
+                       */
+                       selection->toggle (clicked_control_point);
+                       _control_point_toggled_on_press = true;
+               } else if (!press && !_control_point_toggled_on_press) {
+                       /* This is the release, and the point wasn't toggled on the press, so do it now */
+                       selection->toggle (clicked_control_point);
+               } else {
+                       /* Reset our flag */
+                       _control_point_toggled_on_press = false;
+               }
                break;
        case Selection::Extend:
                /* XXX */
@@ -1055,6 +1073,10 @@ Editor::sensitize_the_right_region_actions ()
        bool have_envelope_inactive = false;
        bool have_non_unity_scale_amplitude = false;
        bool have_compound_regions = false;
+       bool have_inactive_fade_in = false;
+       bool have_inactive_fade_out = false;
+       bool have_active_fade_in = false;
+       bool have_active_fade_out = false;
 
        for (list<RegionView*>::const_iterator i = rs.begin(); i != rs.end(); ++i) {
 
@@ -1114,6 +1136,18 @@ Editor::sensitize_the_right_region_actions ()
                        if (ar->scale_amplitude() != 1) {
                                have_non_unity_scale_amplitude = true;
                        }
+
+                       if (ar->fade_in_active ()) {
+                               have_active_fade_in = true;
+                       } else {
+                               have_inactive_fade_in = true;
+                       }
+
+                       if (ar->fade_out_active ()) {
+                               have_active_fade_out = true;
+                       } else {
+                               have_inactive_fade_out = true;
+                       }
                }
        }
 
@@ -1168,7 +1202,7 @@ Editor::sensitize_the_right_region_actions ()
                if (have_envelope_active && !have_envelope_inactive) {
                        Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-gain-envelope-active"))->set_active ();
                } else if (have_envelope_active && have_envelope_inactive) {
-                       // _region_actions->get_action("toggle-region-gain-envelope-active")->set_inconsistent ();
+                       // Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-gain-envelope-active"))->set_inconsistent ();
                }
 
        } else {
@@ -1184,25 +1218,29 @@ Editor::sensitize_the_right_region_actions ()
                _region_actions->get_action("reset-region-scale-amplitude")->set_sensitive (false);
        }
 
-       Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-lock"))->set_active (have_locked && !have_unlocked);
+       Glib::RefPtr<ToggleAction> a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-lock"));
+       a->set_active (have_locked && !have_unlocked);
        if (have_locked && have_unlocked) {
-               // _region_actions->get_action("toggle-region-lock")->set_inconsistent ();
+               // a->set_inconsistent ();
        }
 
-       Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-lock-style"))->set_active (have_position_lock_style_music && !have_position_lock_style_audio);
+       a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-lock-style"));
+       a->set_active (have_position_lock_style_music && !have_position_lock_style_audio);
 
        if (have_position_lock_style_music && have_position_lock_style_audio) {
-               // _region_actions->get_action("toggle-region-lock-style")->set_inconsistent ();
+               // a->set_inconsistent ();
        }
 
-       Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-mute"))->set_active (have_muted && !have_unmuted);
+       a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-mute"));
+       a->set_active (have_muted && !have_unmuted);
        if (have_muted && have_unmuted) {
-               // _region_actions->get_action("toggle-region-mute")->set_inconsistent ();
+               // a->set_inconsistent ();
        }
 
-       Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-opaque-region"))->set_active (have_opaque && !have_non_opaque);
+       a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-opaque-region"));
+       a->set_active (have_opaque && !have_non_opaque);
        if (have_opaque && have_non_opaque) {
-               // _region_actions->get_action("toggle-opaque-region")->set_inconsistent ();
+               // a->set_inconsistent ();
        }
 
        if (!have_not_at_natural_position) {
@@ -1216,6 +1254,29 @@ Editor::sensitize_the_right_region_actions ()
                _region_actions->get_action("insert-region-from-region-list")->set_sensitive (true);
        }
 
+       a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-fade-in"));
+       a->set_active (have_active_fade_in && !have_inactive_fade_in);
+       if (have_active_fade_in && have_inactive_fade_in) {
+               // a->set_inconsistent ();
+       }
+
+       a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-fade-out"));
+       a->set_active (have_active_fade_out && !have_inactive_fade_out);
+
+       if (have_active_fade_out && have_inactive_fade_out) {
+               // a->set_inconsistent ();
+       }
+       
+       bool const have_active_fade = have_active_fade_in || have_active_fade_out;
+       bool const have_inactive_fade = have_inactive_fade_in || have_inactive_fade_out;
+
+       a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-fades"));
+       a->set_active (have_active_fade && !have_inactive_fade);
+
+       if (have_active_fade && have_inactive_fade) {
+               // a->set_inconsistent ();
+       }
+       
        _ignore_region_action = false;
 
        _all_region_actions_sensitized = false;