PatchChange Dialog: update title & refresh midnam on change
authorRobin Gareus <robin@gareus.org>
Fri, 8 Sep 2017 17:37:48 +0000 (19:37 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 8 Sep 2017 21:35:00 +0000 (23:35 +0200)
gtk2_ardour/midi_time_axis.cc
gtk2_ardour/midi_time_axis.h
gtk2_ardour/patch_change_widget.cc
gtk2_ardour/patch_change_widget.h

index 9e4d0ed5b1cb4f6a7980b88582a144766689c714..3627074bc89df026bf4900a6b4caf14433a9b168 100644 (file)
@@ -425,7 +425,7 @@ MidiTimeAxisView::update_patch_selector ()
                                        boost::bind (&MidiTimeAxisView::drop_instrument_ref, this),
                                        gui_context());
                        pi->plugin()->UpdateMidnam.connect (midnam_connection, invalidator (*this),
-                                       boost::bind (&Plugin::read_midnam, pi->plugin ()),
+                                       boost::bind (&MidiTimeAxisView::reread_midnam, this),
                                        gui_context());
 
                        pluginprovided = true;
@@ -445,6 +445,17 @@ MidiTimeAxisView::update_patch_selector ()
        }
 }
 
+void
+MidiTimeAxisView::reread_midnam ()
+{
+       boost::shared_ptr<Processor> the_instrument (_route->the_instrument());
+       boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(the_instrument);
+       pi->plugin ()->read_midnam();
+
+       if (_patch_change_dialog) {
+               _patch_change_dialog->refresh ();
+       }
+}
 void
 MidiTimeAxisView::model_changed(const std::string& model)
 {
@@ -486,6 +497,10 @@ MidiTimeAxisView::model_changed(const std::string& model)
        delete controller_menu;
        controller_menu = 0;
        build_automation_action_menu(false);
+
+       if (_patch_change_dialog) {
+               _patch_change_dialog->refresh ();
+       }
 }
 
 void
@@ -1093,7 +1108,7 @@ MidiTimeAxisView::send_patch_change ()
                return;
        }
 
-       PatchChangeGridDialog* d = new PatchChangeGridDialog (string_compose (_("Select Patch for '%1'"), _route->name ()), _route);
+       PatchChangeGridDialog* d = new PatchChangeGridDialog (_route);
        _patch_change_dialog = d;
        d->present ();
 }
index 72167204ed023c7f8d398c0044c6d5a1518b58dc..faa0e723e8902513477b0131f19b899fcb8f4774 100644 (file)
@@ -122,6 +122,7 @@ private:
        void setup_midnam_patches ();
        void update_patch_selector ();
        void drop_instrument_ref ();
+       void reread_midnam ();
        PBD::ScopedConnectionList midnam_connection;
 
        void start_scroomer_update ();
index 521ad60313b6c08f55a34c25e9b341626f4e9906..0d167eb576f3440c8946a6df0798df925b356ae8 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <bitset>
 #include <gtkmm/frame.h>
-#include <boost/algorithm/string.hpp>
 
 #include "pbd/unwind.h"
 
@@ -141,6 +140,14 @@ PatchChangeWidget::~PatchChangeWidget ()
        delete _pianomm;
 }
 
+void
+PatchChangeWidget::refresh ()
+{
+       if (is_visible ()) {
+               on_show ();
+       }
+}
+
 void
 PatchChangeWidget::on_show ()
 {
@@ -237,7 +244,7 @@ PatchChangeWidget::refill_program_list ()
        if (_current_patch_bank) {
                const MIDI::Name::PatchNameList& patches = _current_patch_bank->patch_name_list ();
                for (MIDI::Name::PatchNameList::const_iterator i = patches.begin(); i != patches.end(); ++i) {
-                       std::string n = (*i)->name ();
+                       const std::string n = (*i)->name ();
                        MIDI::Name::PatchPrimaryKey const& key = (*i)->patch_primary_key ();
 
                        const uint8_t pgm = key.program();
@@ -477,10 +484,20 @@ PatchChangeWidget::program (uint8_t chn) const
 
 /* ***************************************************************************/
 
-PatchChangeGridDialog::PatchChangeGridDialog (std::string const& title, boost::shared_ptr<ARDOUR::Route> r)
-       : ArdourDialog (title, false, false)
+PatchChangeGridDialog::PatchChangeGridDialog (boost::shared_ptr<ARDOUR::Route> r)
+       : ArdourDialog (string_compose (_("Select Patch for '%1"), r->name()), false, false)
        , w (r)
 {
+       r->PropertyChanged.connect (_route_connection, invalidator (*this), boost::bind (&PatchChangeGridDialog::route_property_changed, this, _1, boost::weak_ptr<Route>(r)), gui_context());
        get_vbox()->add (w);
        w.show ();
 }
+
+void
+PatchChangeGridDialog::route_property_changed (const PBD::PropertyChange& what_changed, boost::weak_ptr<Route> wr)
+{
+       boost::shared_ptr<ARDOUR::Route> r = wr.lock ();
+       if (r && what_changed.contains (ARDOUR::Properties::name)) {
+               set_title (string_compose (_("Select Patch for '%1"), r->name()));
+       }
+}
index f3f78985082b732e4d3be40a7b8f9a9b5e951295..81e73bda446c4c9651879c4e1bb22825f05da53f 100644 (file)
@@ -39,6 +39,8 @@ public:
        PatchChangeWidget (boost::shared_ptr<ARDOUR::Route>);
        ~PatchChangeWidget ();
 
+       void refresh ();
+
 protected:
        int bank (uint8_t) const;
        uint8_t program (uint8_t) const;
@@ -105,11 +107,14 @@ private:
 class PatchChangeGridDialog : public ArdourDialog
 {
 public:
-       PatchChangeGridDialog (std::string const&, boost::shared_ptr<ARDOUR::Route>);
+       PatchChangeGridDialog (boost::shared_ptr<ARDOUR::Route>);
        void on_hide () { w.hide (); ArdourDialog::on_hide (); }
        void on_show () { w.show (); ArdourDialog::on_show (); }
+       void refresh () { w.refresh (); }
 
 private:
+       void route_property_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Route>);
+       PBD::ScopedConnection _route_connection;
        PatchChangeWidget w;
 };