tweak display of remote control id (dialog text)
[ardour.git] / gtk2_ardour / canvas_patch_change.cc
index 44389ae96ced806d0f3e9f4cd189e3da8183755e..9e754c953e58ca6ab3f09feaf949e298f0111c9a 100644 (file)
 
 #include <iostream>
 
-#include <glibmm/regex.h>
+#include <boost/algorithm/string.hpp>
+
+#include "pbd/stacktrace.h"
 
 #include "gtkmm2ext/keyboard.h"
-#include "ardour/midi_patch_manager.h"
+#include "ardour/instrument_info.h"
 
 #include "ardour_ui.h"
 #include "midi_region_view.h"
@@ -44,8 +46,7 @@ CanvasPatchChange::CanvasPatchChange(
                double          height,
                double          x,
                double          y,
-               string&         model_name,
-               string&         custom_device_mode,
+               ARDOUR::InstrumentInfo& info,
                ARDOUR::MidiModel::PatchChangePtr patch,
                bool active_channel)
        : CanvasFlag(
@@ -60,12 +61,11 @@ CanvasPatchChange::CanvasPatchChange(
                        ARDOUR_UI::config()->canvasvar_MidiPatchChangeInactiveChannelFill.get(),
                        x,
                        y)
-       , _model_name(model_name)
-       , _custom_device_mode(custom_device_mode)
+       , _info (info)
        , _patch (patch)
        , _popup_initialized(false)
 {
-       set_text(text);
+       set_text (text);
 }
 
 CanvasPatchChange::~CanvasPatchChange()
@@ -75,9 +75,7 @@ CanvasPatchChange::~CanvasPatchChange()
 void
 CanvasPatchChange::initialize_popup_menus()
 {
-       boost::shared_ptr<ChannelNameSet> channel_name_set =
-               MidiPatchManager::instance()
-               .find_channel_name_set(_model_name, _custom_device_mode, _patch->channel());
+       boost::shared_ptr<ChannelNameSet> channel_name_set = _info.get_patches (_patch->channel());
 
        if (!channel_name_set) {
                return;
@@ -85,43 +83,60 @@ CanvasPatchChange::initialize_popup_menus()
 
        const ChannelNameSet::PatchBanks& patch_banks = channel_name_set->patch_banks();
 
-       // fill popup menu:
-       Gtk::Menu::MenuList& patch_bank_menus = _popup.items();
-
-       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 PatchBank::PatchNameList& patches = (*bank)->patch_name_list();
-               Gtk::Menu::MenuList& patch_menus = patch_bank_menu.items();
+       if (patch_banks.size() > 1) {
+               // fill popup menu:
+               Gtk::Menu::MenuList& patch_bank_menus = _popup.items();
+               
+               for (ChannelNameSet::PatchBanks::const_iterator bank = patch_banks.begin();
+                    bank != patch_banks.end();
+                    ++bank) {
+                       Gtk::Menu& patch_bank_menu = *manage(new Gtk::Menu());
+                       
+                       const PatchBank::PatchNameList& patches = (*bank)->patch_name_list();
+                       Gtk::Menu::MenuList& patch_menus = patch_bank_menu.items();
+                       
+                       for (PatchBank::PatchNameList::const_iterator patch = patches.begin();
+                            patch != patches.end();
+                            ++patch) {
+                               std::string name = (*patch)->name();
+                               boost::replace_all (name, "_", " ");
+                               
+                               patch_menus.push_back(
+                                       Gtk::Menu_Helpers::MenuElem(
+                                               name,
+                                               sigc::bind(
+                                                       sigc::mem_fun(*this, &CanvasPatchChange::on_patch_menu_selected),
+                                                       (*patch)->patch_primary_key())) );
+                       }
+                       
+                       std::string name = (*bank)->name();
+                       boost::replace_all (name, "_", " ");
+                       
+                       patch_bank_menus.push_back(
+                               Gtk::Menu_Helpers::MenuElem(
+                                       name,
+                                       patch_bank_menu) );
+               }
+       } else {
+               /* only one patch bank, so make it the initial menu */
 
+               const PatchBank::PatchNameList& patches = patch_banks.front()->patch_name_list();
+               Gtk::Menu::MenuList& patch_menus = _popup.items();
+               
                for (PatchBank::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, &CanvasPatchChange::on_patch_menu_selected),
-                                               (*patch)->patch_primary_key())) );
+                       std::string name = (*patch)->name();
+                       boost::replace_all (name, "_", " ");
+                       
+                       patch_menus.push_back (Gtk::Menu_Helpers::MenuElem (name, 
+                                                                           sigc::bind (
+                                                                                   sigc::mem_fun(*this, &CanvasPatchChange::on_patch_menu_selected),
+                                                                                   (*patch)->patch_primary_key())));
                }
-
-
-               std::string name = underscores->replace((*bank)->name().c_str(), -1, 0, replacement);
-
-               patch_bank_menus.push_back(
-                       Gtk::Menu_Helpers::MenuElem(
-                               name,
-                               patch_bank_menu) );
        }
 }
-
+       
 void
 CanvasPatchChange::on_patch_menu_selected(const PatchPrimaryKey& key)
 {
@@ -131,11 +146,12 @@ CanvasPatchChange::on_patch_menu_selected(const PatchPrimaryKey& key)
 bool
 CanvasPatchChange::on_event (GdkEvent* ev)
 {
+       Editor* e;
+
        switch (ev->type) {
        case GDK_BUTTON_PRESS:
-       {
                /* XXX: icky dcast */
-               Editor* e = dynamic_cast<Editor*> (&_region.get_time_axis_view().editor());
+               e = dynamic_cast<Editor*> (&_region.get_time_axis_view().editor());
                if (e->current_mouse_mode() == Editing::MouseObject && e->internal_editing()) {
 
                        if (Gtkmm2ext::Keyboard::is_delete_event (&ev->button)) {
@@ -165,14 +181,13 @@ CanvasPatchChange::on_event (GdkEvent* ev)
                        return true;
                }
                break;
-       }
 
        case GDK_KEY_PRESS:
                switch (ev->key.keyval) {
                case GDK_Up:
                case GDK_KP_Up:
                case GDK_uparrow:
-                       if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) {
+                       if (Keyboard::modifier_state_contains (ev->key.state, Keyboard::PrimaryModifier)) {
                                _region.previous_bank (*this);
                        } else {
                                _region.previous_patch (*this);
@@ -181,46 +196,53 @@ CanvasPatchChange::on_event (GdkEvent* ev)
                case GDK_Down:
                case GDK_KP_Down:
                case GDK_downarrow:
-                       if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) {
+                       if (Keyboard::modifier_state_contains (ev->key.state, Keyboard::PrimaryModifier)) {
                                _region.next_bank (*this);
                        } else {
                                _region.next_patch (*this);
                        }
                        break;
+               case GDK_Delete:
+               case GDK_BackSpace:
+                       _region.delete_patch_change (this);
+                       break;
                default:
                        break;
                }
                break;
 
        case GDK_SCROLL:
-               if (ev->scroll.direction == GDK_SCROLL_UP) {
-                       if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) {
-                               _region.previous_bank (*this);
-                       } else {
-                               _region.previous_patch (*this);
-                       }
-                       return true;
-               } else if (ev->scroll.direction == GDK_SCROLL_DOWN) {
-                       if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) {
-                               _region.next_bank (*this);
-                       } else {
-                               _region.next_patch (*this);
+               /* XXX: icky dcast */
+               e = dynamic_cast<Editor*> (&_region.get_time_axis_view().editor());
+               if (e->current_mouse_mode() == Editing::MouseObject && e->internal_editing()) {
+                       if (ev->scroll.direction == GDK_SCROLL_UP) {
+                               if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) {
+                                       _region.previous_bank (*this);
+                               } else {
+                                       _region.previous_patch (*this);
+                               }
+                       } else if (ev->scroll.direction == GDK_SCROLL_DOWN) {
+                               if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) {
+                                       _region.next_bank (*this);
+                               } else {
+                                       _region.next_patch (*this);
+                               }
                        }
                        return true;
+                       break;
                }
                break;
 
        case GDK_ENTER_NOTIFY:
                _region.patch_entered (this);
+                return true;
                break;
 
        case GDK_LEAVE_NOTIFY:
                _region.patch_left (this);
+                return true;
                break;
 
-       case GDK_BUTTON_RELEASE:
-               return true;
-
        default:
                break;
        }