Primary-(scroll|up|down) on patch/bank change event changes bank number; change forma...
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 27 Jul 2011 19:11:39 +0000 (19:11 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 27 Jul 2011 19:11:39 +0000 (19:11 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@9939 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/canvas_patch_change.cc
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h

index 53bddbef402fb97341e92d003432b0fb4bcdbbd0..7f7413e39ef237b54b68a5e3a8e8b294bff09dbf 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "gtkmm2ext/keyboard.h"
 #include "ardour/midi_patch_manager.h"
+
 #include "ardour_ui.h"
 #include "midi_region_view.h"
 #include "canvas_patch_change.h"
@@ -31,6 +32,7 @@
 
 using namespace Gnome::Canvas;
 using namespace MIDI::Name;
+using namespace Gtkmm2ext;
 using namespace std;
 
 /** @param x x position in pixels.
@@ -118,7 +120,6 @@ CanvasPatchChange::initialize_popup_menus()
 void
 CanvasPatchChange::on_patch_menu_selected(const PatchPrimaryKey& key)
 {
-       cerr << " got patch program number " << key.program_number << endl;
        _region.change_patch_change (*this, key);
 }
 
@@ -166,12 +167,20 @@ CanvasPatchChange::on_event (GdkEvent* ev)
                case GDK_Up:
                case GDK_KP_Up:
                case GDK_uparrow:
-                       _region.previous_patch (*this);
+                       if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) {
+                               _region.previous_bank (*this);
+                       } else {
+                               _region.previous_patch (*this);
+                       }
                        break;
                case GDK_Down:
                case GDK_KP_Down:
                case GDK_downarrow:
-                       _region.next_patch (*this);
+                       if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) {
+                               _region.next_bank (*this);
+                       } else {
+                               _region.next_patch (*this);
+                       }
                        break;
                default:
                        break;
@@ -180,10 +189,18 @@ CanvasPatchChange::on_event (GdkEvent* ev)
 
        case GDK_SCROLL:
                if (ev->scroll.direction == GDK_SCROLL_UP) {
-                       _region.previous_patch (*this);
+                       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) {
-                       _region.next_patch (*this);
+                       if (Keyboard::modifier_state_contains (ev->scroll.state, Keyboard::PrimaryModifier)) {
+                               _region.next_bank (*this);
+                       } else {
+                               _region.next_patch (*this);
+                       }
                        return true;
                }
                break;
index ea5d2f05103be423fcc1887293550029d83f79a8..2d7cccb6282a8706fe10c427532f5da5259221e7 100644 (file)
@@ -1841,6 +1841,44 @@ MidiRegionView::next_patch (CanvasPatchChange& patch)
        }
 }
 
+void
+MidiRegionView::previous_bank (CanvasPatchChange& patch)
+{
+       if (patch.patch()->program() < 127) {
+               MIDI::Name::PatchPrimaryKey key;
+               get_patch_key_at (patch.patch()->time(), patch.patch()->channel(), key);
+               if (key.lsb > 0) {
+                       key.lsb--;
+                       change_patch_change (patch, key);
+               } else {
+                       if (key.msb > 0) {
+                               key.lsb = 127;
+                               key.msb--;
+                               change_patch_change (patch, key);
+                       }
+               }
+       }
+}
+
+void
+MidiRegionView::next_bank (CanvasPatchChange& patch)
+{
+       if (patch.patch()->program() > 0) {
+               MIDI::Name::PatchPrimaryKey key;
+               get_patch_key_at (patch.patch()->time(), patch.patch()->channel(), key);
+               if (key.lsb < 127) {
+                       key.lsb++;
+                       change_patch_change (patch, key);
+               } else {
+                       if (key.msb < 127) {
+                               key.lsb = 0;
+                               key.msb++;
+                               change_patch_change (patch, key);
+                       }
+               }
+       }
+}
+
 void
 MidiRegionView::maybe_remove_deleted_note_from_selection (CanvasNoteEvent* cne)
 {
@@ -2917,7 +2955,8 @@ void
 MidiRegionView::patch_entered (ArdourCanvas::CanvasPatchChange* ev)
 {
        ostringstream s;
-       s << ((int) ev->patch()->program() + 1) << ":" << (ev->patch()->bank() + 1);
+       /* XXX should get patch name if we can */
+       s << _("Bank:") << (ev->patch()->bank() + 1) << '\n' << _("Program:") << ((int) ev->patch()->program() + 1);
        show_verbose_cursor (s.str(), 10, 20);
 }
 
index 6dfcd08e0bc527d4e7135fd254ee4045c630ea1e..418cf215b327b73c4eae1859c2e31468cfa3e463 100644 (file)
@@ -154,6 +154,9 @@ public:
         */
        void next_patch (ArdourCanvas::CanvasPatchChange &);
 
+       void previous_bank (ArdourCanvas::CanvasPatchChange &);
+       void next_bank (ArdourCanvas::CanvasPatchChange &);
+
        /** Displays all patch change events in the region as flags on the canvas.
         */
        void display_patch_changes();