remove almost-unusued stop_signal.h and clean up the one (unused) place where it...
[ardour.git] / gtk2_ardour / midi_time_axis.cc
index 318ec627691102d2856ca24b5d8ec9e6f38fa595..e51699db369940c9e564f0016d7e0297e13075c2 100644 (file)
@@ -35,7 +35,6 @@
 
 #include <gtkmm2ext/gtk_ui.h>
 #include <gtkmm2ext/selector.h>
-#include <gtkmm2ext/stop_signal.h>
 #include <gtkmm2ext/bindable_button.h>
 #include <gtkmm2ext/utils.h>
 
@@ -195,13 +194,10 @@ MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session* sess,
 
        controls_vbox.pack_start(_midi_controls_box, false, false);
 
-       boost::shared_ptr<MidiDiskstream> diskstream = midi_track()->midi_diskstream();
-
        // restore channel selector settings
-       _channel_selector.set_channel_mode(diskstream->get_channel_mode(),
-                       diskstream->get_channel_mask());
+       _channel_selector.set_channel_mode(midi_track()->get_channel_mode(), midi_track()->get_channel_mask());
        _channel_selector.mode_changed.connect(
-               sigc::mem_fun(*midi_track()->midi_diskstream(), &MidiDiskstream::set_channel_mode));
+               sigc::mem_fun(*midi_track(), &MidiTrack::set_channel_mode));
        _channel_selector.mode_changed.connect(
                sigc::mem_fun(*this, &MidiTimeAxisView::set_channel_mode));
 
@@ -285,7 +281,7 @@ MidiTimeAxisView::set_height (uint32_t h)
        RouteTimeAxisView::set_height (h);
 
        if (height >= MIDI_CONTROLS_BOX_MIN_HEIGHT) {
-               _midi_controls_box.show();
+               _midi_controls_box.show_all ();
        } else {
                _midi_controls_box.hide();
        }
@@ -380,6 +376,17 @@ MidiTimeAxisView::build_automation_action_menu ()
 {
        using namespace Menu_Helpers;
 
+       /* If we have a controller menu, we need to detach it before
+          RouteTimeAxis::build_automation_action_menu destroys the
+          menu it is attached to.  Otherwise GTK destroys
+          controller_menu's gobj, meaning that it can't be reattached
+          below.  See bug #3134.
+       */
+          
+       if (controller_menu) {
+               detach_menu (*controller_menu);
+       }
+
        RouteTimeAxisView::build_automation_action_menu ();
 
        MenuList& automation_items = automation_action_menu->items();
@@ -396,7 +403,7 @@ MidiTimeAxisView::build_automation_action_menu ()
                   something about MIDI (!) would not expect to find them there.
                */
 
-               add_channel_command_menu_item (automation_items, _("Program PropertyChange"), MidiPgmChangeAutomation, MIDI_CMD_PGM_CHANGE);
+               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);
                
@@ -406,7 +413,6 @@ MidiTimeAxisView::build_automation_action_menu ()
                */
                
                build_controller_menu ();
-               detach_menu (*controller_menu);
                
                automation_items.push_back (SeparatorElem());
                automation_items.push_back (MenuElem (_("Controllers"), *controller_menu));
@@ -425,10 +431,10 @@ MidiTimeAxisView::change_all_channel_tracks_visibility (bool yn, Evoral::Paramet
                if (selected_channels & (0x0001 << chn)) {
                        
                        Evoral::Parameter fully_qualified_param (param.type(), chn, param.id());
-                       RouteAutomationNode* node = automation_track (fully_qualified_param);
+                       Gtk::CheckMenuItem* menu = automation_child_menu_item (fully_qualified_param);
 
-                       if (node && node->menu_item) {
-                               node->menu_item->set_active (yn);
+                       if (menu) {
+                               menu->set_active (yn);
                        }
                }
        }
@@ -480,23 +486,18 @@ MidiTimeAxisView::add_channel_command_menu_item (Menu_Helpers::MenuList& items,
                                                                    sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::toggle_automation_track),
                                                                                fully_qualified_param)));
                                
-                               RouteAutomationNode* node = automation_track (fully_qualified_param);
+                               boost::shared_ptr<AutomationTimeAxisView> track = automation_child (fully_qualified_param);
                                bool visible = false;
                                
-                               if (node) {
-                                       if (node->track->marked_for_display()) {
+                               if (track) {
+                                       if (track->marked_for_display()) {
                                                visible = true;
                                        }
                                }
                                
                                CheckMenuItem* cmi = static_cast<CheckMenuItem*>(&chn_items.back());
-                               if (node) {
-                                       node->menu_item = cmi;
-                               }
-
+                               _parameter_menu_map[fully_qualified_param] = cmi;
                                cmi->set_active (visible);
-
-                               parameter_menu_map[fully_qualified_param] = cmi;
                        }
                }
                
@@ -516,24 +517,19 @@ MidiTimeAxisView::add_channel_command_menu_item (Menu_Helpers::MenuList& items,
                                                                sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::toggle_automation_track),
                                                                            fully_qualified_param)));
                                
-                               RouteAutomationNode* node = automation_track (fully_qualified_param);
+                               boost::shared_ptr<AutomationTimeAxisView> track = automation_child (fully_qualified_param);
                                bool visible = false;
                                
-                               if (node) {
-                                       if (node->track->marked_for_display()) {
+                               if (track) {
+                                       if (track->marked_for_display()) {
                                                visible = true;
                                        }
                                }
                                
                                CheckMenuItem* cmi = static_cast<CheckMenuItem*>(&items.back());
-                               if (node) {
-                                       node->menu_item = cmi;
-                               }
-
+                               _parameter_menu_map[fully_qualified_param] = cmi;
                                cmi->set_active (visible);
                                
-                               parameter_menu_map[fully_qualified_param] = cmi;
-
                                /* one channel only */
                                break;
                        }
@@ -612,31 +608,25 @@ MidiTimeAxisView::build_controller_menu ()
                                                                                    sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::toggle_automation_track),
                                                                                                fully_qualified_param)));
 
-                                               RouteAutomationNode* node = automation_track (fully_qualified_param);
+                                               boost::shared_ptr<AutomationTimeAxisView> track = automation_child (fully_qualified_param);
                                                bool visible = false;
                                                
-                                               if (node) {
-                                                       if (node->track->marked_for_display()) {
+                                               if (track) {
+                                                       if (track->marked_for_display()) {
                                                                visible = true;
                                                        }
                                                }
                                                
                                                CheckMenuItem* cmi = static_cast<CheckMenuItem*>(&chn_items.back());
-
-                                               if (node) {
-                                                       node->menu_item = cmi;
-                                               }
-
+                                               _parameter_menu_map[fully_qualified_param] = cmi;
                                                cmi->set_active (visible);
-                                               
-                                               parameter_menu_map[fully_qualified_param] = cmi;
                                        }
                                }
                                
                                /* add the per-channel menu to the list of controllers, with the name of the controller */
-                               
-                               ctl_items.push_back (MenuElem (midi_name (ctl), *chn_menu));
-
+                               ctl_items.push_back (MenuElem (string_compose ("<b>%1</b>: %2", ctl, midi_name (ctl)), *chn_menu));
+                               dynamic_cast<Label*> (ctl_items.back().get_child())->set_use_markup (true);
+                                     
                        } else {
 
                                /* just one channel - create a single menu item for this ctl+channel combination*/
@@ -649,24 +639,19 @@ MidiTimeAxisView::build_controller_menu ()
                                                                                    sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::toggle_automation_track),
                                                                                                fully_qualified_param)));
                                                
-                                               RouteAutomationNode* node = automation_track (fully_qualified_param);
+                                               boost::shared_ptr<AutomationTimeAxisView> track = automation_child (fully_qualified_param);
                                                bool visible = false;
                                                
-                                               if (node) {
-                                                       if (node->track->marked_for_display()) {
+                                               if (track) {
+                                                       if (track->marked_for_display()) {
                                                                visible = true;
                                                        }
                                                }
                                                
                                                CheckMenuItem* cmi = static_cast<CheckMenuItem*>(&ctl_items.back());
-                                               if (node) {
-                                                       node->menu_item = cmi;
-                                               }
-
+                                               _parameter_menu_map[fully_qualified_param] = cmi;
                                                cmi->set_active (visible);
                                                
-
-                                               parameter_menu_map[fully_qualified_param] = cmi;
                                                /* one channel only */
                                                break;
                                        }
@@ -676,7 +661,7 @@ MidiTimeAxisView::build_controller_menu ()
                        
                /* add the menu for this block of controllers to the overall controller menu */
 
-               items.push_back (MenuElem (string_compose (_("Controllers %1-%2"), i+1, i+16), *ctl_menu));
+               items.push_back (MenuElem (string_compose (_("Controllers %1-%2"), i, i+15), *ctl_menu));
        }
 }
 
@@ -738,7 +723,7 @@ MidiTimeAxisView::set_note_mode(NoteMode mode)
                _note_mode = mode;
                midi_track()->set_note_mode(mode);
                xml_node->add_property ("note-mode", enum_2_string(_note_mode));
-               _view->redisplay_diskstream();
+               _view->redisplay_track();
        }
 }
 
@@ -754,7 +739,7 @@ MidiTimeAxisView::set_color_mode(ColorMode mode)
 
                _color_mode = mode;
                xml_node->add_property ("color-mode", enum_2_string(_color_mode));
-               _view->redisplay_diskstream();
+               _view->redisplay_track();
        }
 }
 
@@ -782,8 +767,7 @@ void
 MidiTimeAxisView::show_all_automation ()
 {
        if (midi_track()) {
-               const set<Evoral::Parameter> params = midi_track()->midi_diskstream()->
-                               midi_playlist()->contained_automation();
+               const set<Evoral::Parameter> params = midi_track()->midi_playlist()->contained_automation();
 
                for (set<Evoral::Parameter>::const_iterator i = params.begin(); i != params.end(); ++i) {
                        create_automation_child(*i, true);
@@ -797,8 +781,7 @@ void
 MidiTimeAxisView::show_existing_automation ()
 {
        if (midi_track()) {
-               const set<Evoral::Parameter> params = midi_track()->midi_diskstream()->
-                               midi_playlist()->contained_automation();
+               const set<Evoral::Parameter> params = midi_track()->midi_playlist()->contained_automation();
 
                for (set<Evoral::Parameter>::const_iterator i = params.begin(); i != params.end(); ++i) {
                        create_automation_child(*i, true);
@@ -975,10 +958,7 @@ MidiTimeAxisView::add_region (nframes64_t pos)
        const Tempo& t = _session->tempo_map().tempo_at(start);
        double length = floor (m.frames_per_bar(t, _session->frame_rate()));
 
-       const boost::shared_ptr<MidiDiskstream> diskstream =
-               boost::dynamic_pointer_cast<MidiDiskstream>(view()->trackview().track()->diskstream());
-
-       boost::shared_ptr<Source> src = _session->create_midi_source_for_session (*diskstream.get());
+       boost::shared_ptr<Source> src = _session->create_midi_source_for_session (view()->trackview().track()->name());
 
        PropertyList plist; 
        
@@ -1078,9 +1058,9 @@ MidiTimeAxisView::set_channel_mode (ChannelMode, uint16_t)
 
                for (uint32_t chn = 0; chn < 16; ++chn) {
                        Evoral::Parameter fully_qualified_param (MidiCCAutomation, chn, ctl);
-                       RouteAutomationNode* node = automation_track (fully_qualified_param);
+                       boost::shared_ptr<AutomationTimeAxisView> track = automation_child (fully_qualified_param);
 
-                       if (!node) {
+                       if (!track) {
                                continue;
                        }
                        
@@ -1088,9 +1068,9 @@ MidiTimeAxisView::set_channel_mode (ChannelMode, uint16_t)
                                /* channel not in use. hiding it will trigger RouteTimeAxisView::automation_track_hidden() 
                                   which will cause a redraw. We don't want one per channel, so block that with no_redraw.
                                 */
-                               changed = node->track->set_visibility (false) || changed;
+                               changed = track->set_visibility (false) || changed;
                        } else {
-                               changed = node->track->set_visibility (true) || changed;
+                               changed = track->set_visibility (true) || changed;
                        }
                }
        }