From ee38c44109bff63828dac220107f4b54c4a809a3 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 13 Dec 2014 00:37:34 -0500 Subject: Structure MIDI device selector by manufacturer. Unfortunately we store the state of models as simply model, so if there's ever duplicate model names, we're somewhat screwed, but this makes the (previously unmanageably huge) menu usable, while retaining the "model name as global identifier" state unmodified. --- gtk2_ardour/midi_region_view.cc | 3 ++- gtk2_ardour/midi_time_axis.cc | 30 ++++++++++++++++++++++-------- gtk2_ardour/patch_change.cc | 2 +- gtk2_ardour/patch_change_dialog.cc | 1 - 4 files changed, 25 insertions(+), 11 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 2f5d69ffe9..6541736a19 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -27,11 +27,12 @@ #include +#include "midi++/midnam_patch.h" + #include "pbd/memento_command.h" #include "pbd/stateful_diff_command.h" #include "ardour/midi_model.h" -#include "ardour/midi_patch_manager.h" #include "ardour/midi_region.h" #include "ardour/midi_source.h" #include "ardour/midi_track.h" diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index c2d2a36ab1..1d55b7dffa 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -266,14 +266,28 @@ MidiTimeAxisView::set_route (boost::shared_ptr rt) } } - MIDI::Name::MidiPatchManager& patch_manager = MIDI::Name::MidiPatchManager::instance(); - - MIDI::Name::MasterDeviceNames::Models::const_iterator m = patch_manager.all_models().begin(); - for (; m != patch_manager.all_models().end(); ++m) { - _midnam_model_selector.AddMenuElem( - Gtk::Menu_Helpers::MenuElem(m->c_str(), - sigc::bind(sigc::mem_fun(*this, &MidiTimeAxisView::model_changed), - m->c_str()))); + typedef MIDI::Name::MidiPatchManager PatchManager; + + PatchManager& patch_manager = PatchManager::instance(); + + for (PatchManager::DeviceNamesByMaker::const_iterator m = patch_manager.devices_by_manufacturer().begin(); + m != patch_manager.devices_by_manufacturer().end(); ++m) { + Menu* menu = Gtk::manage(new Menu); + Menu_Helpers::MenuList& items = menu->items(); + + // Build manufacturer submenu + for (MIDI::Name::MIDINameDocument::MasterDeviceNamesList::const_iterator n = m->second.begin(); + n != m->second.end(); ++n) { + Menu_Helpers::MenuElem elem = Gtk::Menu_Helpers::MenuElem( + n->first.c_str(), + sigc::bind(sigc::mem_fun(*this, &MidiTimeAxisView::model_changed), + n->first.c_str())); + + items.push_back(elem); + } + + // Add manufacturer submenu to selector + _midnam_model_selector.AddMenuElem(Menu_Helpers::MenuElem(m->first, *menu)); } if (gui_property (X_("midnam-model-name")).empty()) { diff --git a/gtk2_ardour/patch_change.cc b/gtk2_ardour/patch_change.cc index 09fb8b9778..18ef5da004 100644 --- a/gtk2_ardour/patch_change.cc +++ b/gtk2_ardour/patch_change.cc @@ -26,7 +26,7 @@ #include "gtkmm2ext/keyboard.h" #include "gtkmm2ext/utils.h" -#include "ardour/midi_patch_manager.h" +#include "midi++/midnam_patch.h" #include "canvas/debug.h" diff --git a/gtk2_ardour/patch_change_dialog.cc b/gtk2_ardour/patch_change_dialog.cc index 3af5a4ed7f..23941e1545 100644 --- a/gtk2_ardour/patch_change_dialog.cc +++ b/gtk2_ardour/patch_change_dialog.cc @@ -27,7 +27,6 @@ #include "midi++/midnam_patch.h" -#include "ardour/midi_patch_manager.h" #include "ardour/beats_frames_converter.h" #include "ardour/instrument_info.h" -- cgit v1.2.3