ensure that all waveviews have ALL their colors set accurately before first render
[ardour.git] / gtk2_ardour / canvas_patch_change.cc
index 8ba644f0257914b185cdcb814ca3463a64a78567..04626692fbdeb54dc136855d9454e1b78f9be8b3 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "gtkmm2ext/keyboard.h"
 #include "ardour/instrument_info.h"
+#include "midi++/midnam_patch.h"
 
 #include "ardour_ui.h"
 #include "midi_region_view.h"
@@ -53,12 +54,12 @@ CanvasPatchChange::CanvasPatchChange(
                region,
                parent,
                height,
-               active_channel ?
-               ARDOUR_UI::config()->canvasvar_MidiPatchChangeOutline.get() :
-               ARDOUR_UI::config()->canvasvar_MidiPatchChangeInactiveChannelOutline.get(),
-               active_channel ?
-               ARDOUR_UI::config()->canvasvar_MidiPatchChangeFill.get() :
-               ARDOUR_UI::config()->canvasvar_MidiPatchChangeInactiveChannelFill.get(),
+               (active_channel
+                ? ARDOUR_UI::config()->get_canvasvar_MidiPatchChangeOutline()
+                : ARDOUR_UI::config()->get_canvasvar_MidiPatchChangeInactiveChannelOutline()),
+               (active_channel
+                ? ARDOUR_UI::config()->get_canvasvar_MidiPatchChangeFill()
+                : ARDOUR_UI::config()->get_canvasvar_MidiPatchChangeInactiveChannelFill()),
                x,
                y)
        , _info (info)
@@ -92,10 +93,10 @@ CanvasPatchChange::initialize_popup_menus()
                     ++bank) {
                        Gtk::Menu& patch_bank_menu = *manage(new Gtk::Menu());
                        
-                       const PatchBank::PatchNameList& patches = (*bank)->patch_name_list();
+                       const PatchNameList& patches = (*bank)->patch_name_list();
                        Gtk::Menu::MenuList& patch_menus = patch_bank_menu.items();
                        
-                       for (PatchBank::PatchNameList::const_iterator patch = patches.begin();
+                       for (PatchNameList::const_iterator patch = patches.begin();
                             patch != patches.end();
                             ++patch) {
                                std::string name = (*patch)->name();
@@ -119,10 +120,10 @@ CanvasPatchChange::initialize_popup_menus()
        } else {
                /* only one patch bank, so make it the initial menu */
 
-               const PatchBank::PatchNameList& patches = patch_banks.front()->patch_name_list();
+               const PatchNameList& patches = patch_banks.front()->patch_name_list();
                Gtk::Menu::MenuList& patch_menus = _popup.items();
                
-               for (PatchBank::PatchNameList::const_iterator patch = patches.begin();
+               for (PatchNameList::const_iterator patch = patches.begin();
                     patch != patches.end();
                     ++patch) {
                        std::string name = (*patch)->name();
@@ -143,31 +144,39 @@ CanvasPatchChange::on_patch_menu_selected(const PatchPrimaryKey& key)
        _region.change_patch_change (*this, key);
 }
 
+static bool
+in_edit_mode(Editor* editor)
+{
+       return (editor->internal_editing() &&
+               (editor->current_mouse_mode() == Editing::MouseObject ||
+                editor->current_mouse_mode() == Editing::MouseDraw));
+}
+
 bool
 CanvasPatchChange::on_event (GdkEvent* ev)
 {
-       Editor* e;
+       /* XXX: icky dcast */
+       Editor* e = dynamic_cast<Editor*> (&_region.get_time_axis_view().editor());
+       
+       if (!in_edit_mode(e)) {
+               return false;
+       }
 
        switch (ev->type) {
        case GDK_BUTTON_PRESS:
-               /* XXX: icky dcast */
-               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)) {
-
-                               _region.delete_patch_change (this);
-                               return true;
-
-                       } else if (Gtkmm2ext::Keyboard::is_edit_event (&ev->button)) {
-
-                               _region.edit_patch_change (this);
-                               return true;
-
-                       } else if (ev->button.button == 1) {
-                               e->drags()->set (new PatchChangeDrag (e, this, &_region), ev);
-                               return true;
-                       }
+               if (Gtkmm2ext::Keyboard::is_delete_event (&ev->button)) {
+                       
+                       _region.delete_patch_change (this);
+                       return true;
+                       
+               } else if (Gtkmm2ext::Keyboard::is_edit_event (&ev->button)) {
+                       
+                       _region.edit_patch_change (this);
+                       return true;
+                       
+               } else if (ev->button.button == 1) {
+                       e->drags()->set (new PatchChangeDrag (e, this, &_region), ev);
+                       return true;
                }
 
                if (ev->button.button == 3) {
@@ -212,26 +221,20 @@ CanvasPatchChange::on_event (GdkEvent* ev)
                break;
 
        case GDK_SCROLL:
-               /* 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 (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;
+               return true;
 
        case GDK_ENTER_NOTIFY:
                _region.patch_entered (this);