Make stuff in the automation menu apply to the track selection.
authorCarl Hetherington <carl@carlh.net>
Mon, 7 Mar 2011 13:04:36 +0000 (13:04 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 7 Mar 2011 13:04:36 +0000 (13:04 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@9088 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/audio_time_axis.cc
gtk2_ardour/audio_time_axis.h
gtk2_ardour/midi_time_axis.cc
gtk2_ardour/midi_time_axis.h
gtk2_ardour/route_time_axis.cc
gtk2_ardour/route_time_axis.h

index 5cfe3500db33d7905f389310bae8455044457fe8..79751145bf5f9f7034e72f2ac3309eb399dc6ae7 100644 (file)
@@ -311,38 +311,51 @@ AudioTimeAxisView::update_pan_track_visibility ()
 }
 
 void
-AudioTimeAxisView::show_all_automation ()
+AudioTimeAxisView::show_all_automation (bool apply_to_selection)
 {
-       no_redraw = true;
-
-       RouteTimeAxisView::show_all_automation ();
-
-       no_redraw = false;
-
-       _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
+       if (apply_to_selection) {
+               _editor.get_selection().tracks.foreach_audio_time_axis (boost::bind (&AudioTimeAxisView::show_all_automation, _1, false));
+       } else {
+               
+               no_redraw = true;
+               
+               RouteTimeAxisView::show_all_automation ();
+
+               no_redraw = false;
+               
+               _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
+       }
 }
 
 void
-AudioTimeAxisView::show_existing_automation ()
+AudioTimeAxisView::show_existing_automation (bool apply_to_selection)
 {
-       no_redraw = true;
-
-       RouteTimeAxisView::show_existing_automation ();
-
-       no_redraw = false;
-
-       _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
+       if (apply_to_selection) {
+               _editor.get_selection().tracks.foreach_audio_time_axis (boost::bind (&AudioTimeAxisView::show_existing_automation, _1, false));
+       } else {
+               no_redraw = true;
+               
+               RouteTimeAxisView::show_existing_automation ();
+               
+               no_redraw = false;
+               
+               _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
+       }
 }
 
 void
-AudioTimeAxisView::hide_all_automation ()
+AudioTimeAxisView::hide_all_automation (bool apply_to_selection)
 {
-       no_redraw = true;
-
-       RouteTimeAxisView::hide_all_automation();
-
-       no_redraw = false;
-       _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
+       if (apply_to_selection) {
+               _editor.get_selection().tracks.foreach_audio_time_axis (boost::bind (&AudioTimeAxisView::hide_all_automation, _1, false));
+       } else {
+               no_redraw = true;
+               
+               RouteTimeAxisView::hide_all_automation();
+               
+               no_redraw = false;
+               _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
+       }
 }
 
 void
@@ -436,23 +449,23 @@ AudioTimeAxisView::update_control_names ()
 }
 
 void
-AudioTimeAxisView::build_automation_action_menu ()
+AudioTimeAxisView::build_automation_action_menu (bool for_selection)
 {
        using namespace Menu_Helpers;
 
-       RouteTimeAxisView::build_automation_action_menu ();
+       RouteTimeAxisView::build_automation_action_menu (for_selection);
 
        MenuList& automation_items = automation_action_menu->items ();
 
        automation_items.push_back (CheckMenuElem (_("Fader"), sigc::mem_fun (*this, &AudioTimeAxisView::update_gain_track_visibility)));
        gain_automation_item = dynamic_cast<CheckMenuItem*> (&automation_items.back ());
-       gain_automation_item->set_active (gain_track->marked_for_display ());
+       gain_automation_item->set_active (gain_track->marked_for_display () && (!for_selection || _editor.get_selection().tracks.size() == 1));
 
        _main_automation_menu_map[Evoral::Parameter(GainAutomation)] = gain_automation_item;
 
        automation_items.push_back (CheckMenuElem (_("Pan"), sigc::mem_fun (*this, &AudioTimeAxisView::update_pan_track_visibility)));
        pan_automation_item = dynamic_cast<CheckMenuItem*> (&automation_items.back ());
-       pan_automation_item->set_active (pan_tracks.front()->marked_for_display ());
+       pan_automation_item->set_active (pan_tracks.front()->marked_for_display () && (!for_selection || _editor.get_selection().tracks.size() == 1));
 
        set<Evoral::Parameter> const & params = _route->pannable()->what_can_be_automated ();
        for (set<Evoral::Parameter>::iterator p = params.begin(); p != params.end(); ++p) {
index 1023c1edf5fc8ff58e99112304158a086dc9de14..3688f490625c5442f7231485b72c11f80b6858f7 100644 (file)
@@ -95,11 +95,11 @@ class AudioTimeAxisView : public RouteTimeAxisView
 
        void append_extra_display_menu_items ();
        Gtk::Menu* build_mode_menu();
-       void build_automation_action_menu ();
+       void build_automation_action_menu (bool);
 
-       void show_all_automation ();
-       void show_existing_automation ();
-       void hide_all_automation ();
+       void show_all_automation (bool apply_to_selection = false);
+       void show_existing_automation (bool apply_to_selection = false);
+       void hide_all_automation (bool apply_to_selection = false);
 
        void gain_hidden ();
        void pan_hidden ();
index b1068e7e3f5ea2353c40b1c27d462c9907da0502..0348e632f81f977fe64eac88e9c41ef1b7e8383e 100644 (file)
@@ -414,7 +414,7 @@ MidiTimeAxisView::toggle_midi_thru ()
 }
 
 void
-MidiTimeAxisView::build_automation_action_menu ()
+MidiTimeAxisView::build_automation_action_menu (bool for_selection)
 {
        using namespace Menu_Helpers;
 
@@ -430,7 +430,7 @@ MidiTimeAxisView::build_automation_action_menu ()
        }
 
        _channel_command_menu_map.clear ();
-       RouteTimeAxisView::build_automation_action_menu ();
+       RouteTimeAxisView::build_automation_action_menu (for_selection);
 
        MenuList& automation_items = automation_action_menu->items();
        
@@ -447,7 +447,9 @@ MidiTimeAxisView::build_automation_action_menu ()
                */
 
                add_channel_command_menu_item (automation_items, _("Bender"), MidiPitchBenderAutomation, 0);
+               automation_items.back().set_sensitive (!for_selection || _editor.get_selection().tracks.size() == 1);
                add_channel_command_menu_item (automation_items, _("Pressure"), MidiChannelPressureAutomation, 0);
+               automation_items.back().set_sensitive (!for_selection || _editor.get_selection().tracks.size() == 1);
                
                /* now all MIDI controllers. Always offer the possibility that we will rebuild the controllers menu
                   since it might need to be updated after a channel mode change or other change. Also detach it
@@ -458,6 +460,7 @@ MidiTimeAxisView::build_automation_action_menu ()
                
                automation_items.push_back (SeparatorElem());
                automation_items.push_back (MenuElem (_("Controllers"), *controller_menu));
+               automation_items.back().set_sensitive (!for_selection || _editor.get_selection().tracks.size() == 1);
        } else {
                automation_items.push_back (MenuElem (string_compose ("<i>%1</i>", _("No MIDI Channels selected"))));
                dynamic_cast<Label*> (automation_items.back().get_child())->set_use_markup (true);
index 1adba26d24d4ccc49240ff8cac03c2aaa883a462..94926e28a24d740eb77e6fadc3e0bd18e8829d86 100644 (file)
@@ -112,7 +112,7 @@ class MidiTimeAxisView : public RouteTimeAxisView
        void custom_device_mode_changed();
 
        void append_extra_display_menu_items ();
-       void build_automation_action_menu ();
+       void build_automation_action_menu (bool);
        Gtk::Menu* build_note_mode_menu();
        Gtk::Menu* build_color_mode_menu();
 
index 6d09fe87925a56c661546fa246a6c6c51dfd0f51..7197f30bcd79f35310473c5589e058b73d1e1200 100644 (file)
@@ -338,7 +338,7 @@ void
 RouteTimeAxisView::automation_click ()
 {
        conditionally_add_to_selection ();
-       build_automation_action_menu ();
+       build_automation_action_menu (false);
        automation_action_menu->popup (1, gtk_get_current_event_time());
 }
 
@@ -372,7 +372,7 @@ RouteTimeAxisView::set_state (const XMLNode& node, int version)
 }
 
 void
-RouteTimeAxisView::build_automation_action_menu ()
+RouteTimeAxisView::build_automation_action_menu (bool for_selection)
 {
        using namespace Menu_Helpers;
 
@@ -391,13 +391,13 @@ RouteTimeAxisView::build_automation_action_menu ()
        automation_action_menu->set_name ("ArdourContextMenu");
        
        items.push_back (MenuElem (_("Show All Automation"),
-                                  sigc::mem_fun(*this, &RouteTimeAxisView::show_all_automation)));
+                                  sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_all_automation), for_selection)));
        
        items.push_back (MenuElem (_("Show Existing Automation"),
-                                  sigc::mem_fun(*this, &RouteTimeAxisView::show_existing_automation)));
+                                  sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_existing_automation), for_selection)));
        
        items.push_back (MenuElem (_("Hide All Automation"),
-                                  sigc::mem_fun(*this, &RouteTimeAxisView::hide_all_automation)));
+                                  sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::hide_all_automation), for_selection)));
 
        items.push_back (SeparatorElem ());
        
@@ -405,7 +405,7 @@ RouteTimeAxisView::build_automation_action_menu ()
           so it was detached above */
 
        items.push_back (MenuElem (_("Plugins"), subplugin_menu));
-       items.back().set_sensitive (!subplugin_menu.items().empty());
+       items.back().set_sensitive (!subplugin_menu.items().empty() && (!for_selection || _editor.get_selection().tracks.size() == 1));;
 }
 
 void
@@ -615,7 +615,7 @@ RouteTimeAxisView::build_display_menu ()
                route_group_menu->build (r);
                items.push_back (MenuElem (_("Route Group"), *route_group_menu->menu ()));
 
-               build_automation_action_menu ();
+               build_automation_action_menu (true);
                items.push_back (MenuElem (_("Automation"), *automation_action_menu));
 
                items.push_back (SeparatorElem());
@@ -1615,109 +1615,121 @@ RouteTimeAxisView::automation_track_hidden (Evoral::Parameter param)
 
 
 void
-RouteTimeAxisView::show_all_automation ()
+RouteTimeAxisView::show_all_automation (bool apply_to_selection)
 {
-       no_redraw = true;
-
-       /* Show our automation */
-
-       for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
-               i->second->set_marked_for_display (true);
-               i->second->canvas_display()->show();
-               i->second->get_state_node()->add_property ("shown", X_("yes"));
-
-               Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first);
+       if (apply_to_selection) {
+               _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::show_all_automation, _1, false));
+       } else {
+               no_redraw = true;
                
-               if (menu) {
-                       menu->set_active(true);
-               }
-       }
-
-
-       /* Show processor automation */
-
-       for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
-               for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
-                       if ((*ii)->view == 0) {
-                               add_processor_automation_curve ((*i)->processor, (*ii)->what);
-                       }
-
-                       (*ii)->menu_item->set_active (true);
-               }
-       }
-
-       no_redraw = false;
-
-       /* Redraw */
-
-        _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
-}
-
-void
-RouteTimeAxisView::show_existing_automation ()
-{
-       no_redraw = true;
-
-       /* Show our automation */
-
-       for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
-               if (i->second->has_automation()) {
+               /* Show our automation */
+               
+               for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
                        i->second->set_marked_for_display (true);
                        i->second->canvas_display()->show();
                        i->second->get_state_node()->add_property ("shown", X_("yes"));
-
+                       
                        Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first);
+                       
                        if (menu) {
                                menu->set_active(true);
                        }
                }
-       }
-
-
-       /* Show processor automation */
-
-       for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
-               for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
-                       if ((*ii)->view != 0 && (*i)->processor->control((*ii)->what)->list()->size() > 0) {
+               
+               
+               /* Show processor automation */
+               
+               for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
+                       for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
+                               if ((*ii)->view == 0) {
+                                       add_processor_automation_curve ((*i)->processor, (*ii)->what);
+                               }
+                               
                                (*ii)->menu_item->set_active (true);
                        }
                }
+               
+               no_redraw = false;
+               
+               /* Redraw */
+               
+               _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
        }
-
-       no_redraw = false;
-
-       _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
 }
-
+       
 void
-RouteTimeAxisView::hide_all_automation ()
+RouteTimeAxisView::show_existing_automation (bool apply_to_selection)
 {
-       no_redraw = true;
-
-       /* Hide our automation */
-
-       for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
-               i->second->set_marked_for_display (false);
-               i->second->hide ();
-               i->second->get_state_node()->add_property ("shown", X_("no"));
-
-               Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first);
+       if (apply_to_selection) {
+               _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::show_existing_automation, _1, false));
+       } else {
+               no_redraw = true;
+               
+               /* Show our automation */
+               
+               for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
+                       if (i->second->has_automation()) {
+                               i->second->set_marked_for_display (true);
+                               i->second->canvas_display()->show();
+                               i->second->get_state_node()->add_property ("shown", X_("yes"));
+                               
+                               Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first);
+                               if (menu) {
+                                       menu->set_active(true);
+                               }
+                       }
+               }
+               
+               
+               /* Show processor automation */
                
-               if (menu) {
-                       menu->set_active (false);
+               for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
+                       for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
+                               if ((*ii)->view != 0 && (*i)->processor->control((*ii)->what)->list()->size() > 0) {
+                                       (*ii)->menu_item->set_active (true);
+                               }
+                       }
                }
+               
+               no_redraw = false;
+               
+               _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
        }
+}
 
-       /* Hide processor automation */
+void
+RouteTimeAxisView::hide_all_automation (bool apply_to_selection)
+{
+       if (apply_to_selection) {
+               _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::hide_all_automation, _1, false));
+       } else {
+               no_redraw = true;
 
-       for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
-               for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
-                       (*ii)->menu_item->set_active (false);
+               /* Hide our automation */
+               
+               for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
+                       i->second->set_marked_for_display (false);
+                       i->second->hide ();
+                       i->second->get_state_node()->add_property ("shown", X_("no"));
+                       
+                       Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first);
+                       
+                       if (menu) {
+                               menu->set_active (false);
+                       }
                }
+               
+               /* Hide processor automation */
+               
+               for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
+                       for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
+                               (*ii)->menu_item->set_active (false);
+                       }
+               }
+               
+               no_redraw = false;
+               _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
        }
-
-       no_redraw = false;
-        _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
 }
 
 
index 9a4f32130119c8fbc484fd4fd08cfc9e180d17f4..91bc1ff5c66e2bef5f99b7f4de59a055737ebff2 100644 (file)
@@ -212,7 +212,7 @@ protected:
 
        void set_color (Gdk::Color const &);
 
-       virtual void build_automation_action_menu ();
+       virtual void build_automation_action_menu (bool);
        virtual void append_extra_display_menu_items () {}
        void         build_display_menu ();
 
@@ -225,9 +225,10 @@ protected:
        void rename_current_playlist ();
 
        void         automation_click ();
-       virtual void show_all_automation ();
-       virtual void show_existing_automation ();
-       virtual void hide_all_automation ();
+
+       virtual void show_all_automation (bool apply_to_selection = false);
+       virtual void show_existing_automation (bool apply_to_selection = false);
+       virtual void hide_all_automation (bool apply_to_selection = false);
 
        void timestretch (framepos_t start, framepos_t end);