From 8dd31447be22c20a51f019c8ea77c27ba975815c Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 8 Jun 2010 21:48:38 +0000 Subject: [PATCH] Fix handling of the mapping between parameters and automation CheckMenuItems. Should fix #3206, #3215 and the remainder of #3228. git-svn-id: svn://localhost/ardour2/branches/3.0@7245 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/audio_time_axis.cc | 4 ++-- gtk2_ardour/midi_time_axis.cc | 41 ++++++++++++++++++++++++++-------- gtk2_ardour/midi_time_axis.h | 7 ++++++ gtk2_ardour/route_time_axis.cc | 23 +++++++++++++------ gtk2_ardour/route_time_axis.h | 7 ++++-- 5 files changed, 62 insertions(+), 20 deletions(-) diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc index b009508fff..fd809a9b0d 100644 --- a/gtk2_ardour/audio_time_axis.cc +++ b/gtk2_ardour/audio_time_axis.cc @@ -446,7 +446,7 @@ AudioTimeAxisView::build_automation_action_menu () gain_automation_item = dynamic_cast (&automation_items.back ()); gain_automation_item->set_active (gain_track->marked_for_display ()); - _parameter_menu_map[Evoral::Parameter(GainAutomation)] = gain_automation_item; + _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 (&automation_items.back ()); @@ -454,7 +454,7 @@ AudioTimeAxisView::build_automation_action_menu () set const & params = _route->panner()->what_can_be_automated (); for (set::iterator p = params.begin(); p != params.end(); ++p) { - _parameter_menu_map[*p] = pan_automation_item; + _main_automation_menu_map[*p] = pan_automation_item; } } diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index e51699db36..e193f6d425 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -387,6 +387,7 @@ MidiTimeAxisView::build_automation_action_menu () detach_menu (*controller_menu); } + _channel_command_menu_map.clear (); RouteTimeAxisView::build_automation_action_menu (); MenuList& automation_items = automation_action_menu->items(); @@ -403,9 +404,9 @@ MidiTimeAxisView::build_automation_action_menu () something about MIDI (!) would not expect to find them there. */ - add_channel_command_menu_item (automation_items, _("Program Change"), MidiPgmChangeAutomation, MIDI_CMD_PGM_CHANGE); - add_channel_command_menu_item (automation_items, _("Bender"), MidiPitchBenderAutomation, MIDI_CMD_BENDER); - add_channel_command_menu_item (automation_items, _("Pressure"), MidiChannelPressureAutomation, MIDI_CMD_CHANNEL_PRESSURE); + add_channel_command_menu_item (automation_items, _("Program Change"), MidiPgmChangeAutomation, 0); + add_channel_command_menu_item (automation_items, _("Bender"), MidiPitchBenderAutomation, 0); + add_channel_command_menu_item (automation_items, _("Pressure"), MidiChannelPressureAutomation, 0); /* 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 @@ -494,9 +495,9 @@ MidiTimeAxisView::add_channel_command_menu_item (Menu_Helpers::MenuList& items, visible = true; } } - + CheckMenuItem* cmi = static_cast(&chn_items.back()); - _parameter_menu_map[fully_qualified_param] = cmi; + _channel_command_menu_map[fully_qualified_param] = cmi; cmi->set_active (visible); } } @@ -527,7 +528,7 @@ MidiTimeAxisView::add_channel_command_menu_item (Menu_Helpers::MenuList& items, } CheckMenuItem* cmi = static_cast(&items.back()); - _parameter_menu_map[fully_qualified_param] = cmi; + _channel_command_menu_map[fully_qualified_param] = cmi; cmi->set_active (visible); /* one channel only */ @@ -618,7 +619,7 @@ MidiTimeAxisView::build_controller_menu () } CheckMenuItem* cmi = static_cast(&chn_items.back()); - _parameter_menu_map[fully_qualified_param] = cmi; + _controller_menu_map[fully_qualified_param] = cmi; cmi->set_active (visible); } } @@ -649,7 +650,7 @@ MidiTimeAxisView::build_controller_menu () } CheckMenuItem* cmi = static_cast(&ctl_items.back()); - _parameter_menu_map[fully_qualified_param] = cmi; + _controller_menu_map[fully_qualified_param] = cmi; cmi->set_active (visible); /* one channel only */ @@ -791,7 +792,7 @@ MidiTimeAxisView::show_existing_automation () RouteTimeAxisView::show_existing_automation (); } -/** Hide an automation track for the given parameter (pitch bend, channel pressure). +/** Create an automation track for the given parameter (pitch bend, channel pressure). */ void MidiTimeAxisView::create_automation_child (const Evoral::Parameter& param, bool show) @@ -1080,6 +1081,7 @@ MidiTimeAxisView::set_channel_mode (ChannelMode, uint16_t) /* TODO: Bender, PgmChange, Pressure */ /* invalidate the controller menu, so that we rebuilt it next time */ + _controller_menu_map.clear (); delete controller_menu; controller_menu = 0; @@ -1087,3 +1089,24 @@ MidiTimeAxisView::set_channel_mode (ChannelMode, uint16_t) _route->gui_changed ("track_height", this); } } + +Gtk::CheckMenuItem* +MidiTimeAxisView::automation_child_menu_item (Evoral::Parameter param) +{ + Gtk::CheckMenuItem* m = RouteTimeAxisView::automation_child_menu_item (param); + if (m) { + return m; + } + + ParameterMenuMap::iterator i = _controller_menu_map.find (param); + if (i != _controller_menu_map.end()) { + return i->second; + } + + i = _channel_command_menu_map.find (param); + if (i != _channel_command_menu_map.end()) { + return i->second; + } + + return 0; +} diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h index aeb7ff150e..e15167f855 100644 --- a/gtk2_ardour/midi_time_axis.h +++ b/gtk2_ardour/midi_time_axis.h @@ -93,6 +93,8 @@ class MidiTimeAxisView : public RouteTimeAxisView const MidiMultipleChannelSelector& channel_selector() { return _channel_selector; } + Gtk::CheckMenuItem* automation_child_menu_item (Evoral::Parameter); + private: sigc::signal _midi_patch_settings_changed; @@ -152,6 +154,11 @@ class MidiTimeAxisView : public RouteTimeAxisView void add_note_selection_region_view (RegionView* rv, uint8_t note, uint16_t chn_mask); void extend_note_selection_region_view (RegionView*, uint8_t note, uint16_t chn_mask); void toggle_note_selection_region_view (RegionView*, uint8_t note, uint16_t chn_mask); + + /** parameter -> menu item map for the channel command items */ + ParameterMenuMap _channel_command_menu_map; + /** parameter -> menu item map for the controller menu */ + ParameterMenuMap _controller_menu_map; }; #endif /* __ardour_midi_time_axis_h__ */ diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 9813a985fc..49c49a3734 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -264,6 +264,7 @@ RouteTimeAxisView::post_construct () update_diskstream_display (); + _subplugin_menu_map.clear (); subplugin_menu.items().clear (); _route->foreach_processor (sigc::mem_fun (*this, &RouteTimeAxisView::add_processor_to_subplugin_menu)); _route->foreach_processor (sigc::mem_fun (*this, &RouteTimeAxisView::add_existing_processor_automation_curves)); @@ -397,6 +398,7 @@ RouteTimeAxisView::build_automation_action_menu () detach_menu (subplugin_menu); + _main_automation_menu_map.clear (); delete automation_action_menu; automation_action_menu = new Menu; @@ -1689,8 +1691,9 @@ RouteTimeAxisView::show_existing_automation () i->second->get_state_node()->add_property ("shown", X_("yes")); Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first); - assert (menu); - menu->set_active(true); + if (menu) { + menu->set_active(true); + } } } @@ -2008,7 +2011,7 @@ RouteTimeAxisView::add_processor_to_subplugin_menu (boost::weak_ptr p items.push_back (CheckMenuElem (name)); mitem = dynamic_cast (&items.back()); - _parameter_menu_map[*i] = mitem; + _subplugin_menu_map[*i] = mitem; if (has_visible_automation.find((*i)) != has_visible_automation.end()) { mitem->set_active(true); @@ -2089,6 +2092,7 @@ RouteTimeAxisView::processors_changed (RouteProcessorChange c) (*i)->valid = false; } + _subplugin_menu_map.clear (); subplugin_menu.items().clear (); _route->foreach_processor (sigc::mem_fun (*this, &RouteTimeAxisView::add_processor_to_subplugin_menu)); @@ -2373,10 +2377,15 @@ RouteTimeAxisView::set_button_names () Gtk::CheckMenuItem* RouteTimeAxisView::automation_child_menu_item (Evoral::Parameter param) { - ParameterMenuMap::iterator i = _parameter_menu_map.find (param); - if (i == _parameter_menu_map.end()) { - return 0; + ParameterMenuMap::iterator i = _main_automation_menu_map.find (param); + if (i != _main_automation_menu_map.end()) { + return i->second; + } + + i = _subplugin_menu_map.find (param); + if (i != _subplugin_menu_map.end()) { + return i->second; } - return i->second; + return 0; } diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index 8f569d8203..576c353334 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -126,7 +126,7 @@ public: AutomationTracks automation_tracks() { return _automation_tracks; } boost::shared_ptr automation_child(Evoral::Parameter param); - Gtk::CheckMenuItem* automation_child_menu_item (Evoral::Parameter); + virtual Gtk::CheckMenuItem* automation_child_menu_item (Evoral::Parameter); std::string name() const; StreamView* view() const { return _view; } @@ -287,7 +287,10 @@ protected: AutomationTracks _automation_tracks; typedef std::map ParameterMenuMap; - ParameterMenuMap _parameter_menu_map; + /** parameter -> menu item map for the main automation menu */ + ParameterMenuMap _main_automation_menu_map; + /** parameter -> menu item map for the plugin automation menu */ + ParameterMenuMap _subplugin_menu_map; void post_construct (); -- 2.30.2