- using namespace MIDI::Name;
- using namespace Menu_Helpers;
-
- boost::shared_ptr<MasterDeviceNames> device_names = get_device_names();
- const std::string device_mode = gui_property (X_("midnam-custom-device-mode"));
-
- Menu* pc_menu = manage (new Menu);
- MenuList& pc_items = pc_menu->items();
-
- for (uint32_t chn = 0; chn < 16; ++chn) {
- boost::shared_ptr<ChannelNameSet> channel_name_set = device_names->channel_name_set_by_channel (device_mode, chn);
- // see also PatchChange::initialize_popup_menus
- if (!channel_name_set) {
- continue;
- }
- const ChannelNameSet::PatchBanks& patch_banks = channel_name_set->patch_banks();
- if (patch_banks.size () == 0) {
- continue;
- }
-
- Gtk::Menu& chan_menu = *manage(new Gtk::Menu());
-
- if (patch_banks.size() > 1) {
-
- for (ChannelNameSet::PatchBanks::const_iterator bank = patch_banks.begin();
- bank != patch_banks.end();
- ++bank) {
- Glib::RefPtr<Glib::Regex> underscores = Glib::Regex::create("_");
- std::string replacement(" ");
-
- Gtk::Menu& patch_bank_menu = *manage(new Gtk::Menu());
-
- const PatchNameList& patches = (*bank)->patch_name_list();
- Gtk::Menu::MenuList& patch_menus = patch_bank_menu.items();
-
- for (PatchNameList::const_iterator patch = patches.begin();
- patch != patches.end();
- ++patch) {
- std::string name = underscores->replace((*patch)->name().c_str(), -1, 0, replacement);
-
- patch_menus.push_back(
- Gtk::Menu_Helpers::MenuElem(
- name,
- sigc::bind(
- sigc::mem_fun(*this, &MidiTimeAxisView::on_patch_menu_selected),
- chn, (*patch)->patch_primary_key())) );
- }
-
-
- std::string name = underscores->replace((*bank)->name().c_str(), -1, 0, replacement);
-
- chan_menu.items().push_back(
- Gtk::Menu_Helpers::MenuElem(
- name,
- patch_bank_menu) );
- }
- } else {
- /* only one patch bank, so make it the initial menu */
-
- const PatchNameList& patches = patch_banks.front()->patch_name_list();